iptables 基本配置实例
拒绝特定IP到本机的所有访问
# iptables -A INPUT -s 192.168.7.203 -j REJECT
# iptables -A INPUT -s 192.168.7.0/24 -j REJECT
# iptables -I INPUT -s 192.168.7.201,192.168.7.203 -j ACCEPT > 注意,使用-I的话,添加的第2个IP会使用第1个规则编号。
拒绝所有IP访问
# iptables -A INPUT -s 0.0.0.0/0 -j REJECT
# iptables -A INPUT -j REJECT
插入指定顺序的规则
# iptables -I INPUT -s 192.168.7.206 -j DROP > 不加编号,默认为第一条
# iptables -I INPUT 3 -s 192.168.7.206 -j DROP > 指定编号,原编号向后+1
删除指定规则
# iptables -D INPUT -s 192.168.7.203 -j DROP
# iptables -D INPUT 2(使用iptables --line-numbers -vnL看到的num列编号)
删除之后,后续编号会向前继承缺失的编号
-S 的妙用
# iptables -S
-A INPUT -s 192.168.7.203/32 -j DROP
-A INPUT -s 192.168.7.205/32 -j DROP
使用重定向可以把结果存为文件,是不是跟iptables的命令格式一致?
拒绝指定协议
# iptables -I INPUT -p icmp -j REJECT
允许本机通过防火墙
# iptables -I INPUT 2 -i lo -j ACCEPT
限制指定网卡
# iptables -A INPUT -i eth0 -p tcp --dport 21 -j REJECT
创建自定义链并调用
# iptables -A 内置链名 -j 自定义链名
# iptables -N DENY_80
# iptables -A DENY_80 -s 0.0.0.0/0 -p tcp --dport 80 -j REJECT
# iptables -A INPUT -j DENY_80
隐式扩展用法
icmp
格式:
--icmp-type {type[/code]
允许本机向外ping,禁上外部ping应答包
# iptables -A OUTPUT -p icmp --icmp-type 0 -j REJECT
TCP/UDP
格式:
--sport port[:port] 源端口
--dport port[:port] 目标端口
--tcp-flags 要检查的标记位 [标记为为1](省略为0) 检查数据包标记位
如:--tcp-flags SYN,ACK,FIN,RST SYN
表示要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0
ALL = 全部为1, NONE=全部为0
开放指定端口
# iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT
# iptables -I INPUT 2 -p tcp --dport 20:21 -j ACCEPT > 隐式扩展只能支持连续端口表示
拒绝三次握手首个SYN包
# iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j REJECT
# iptables -A INPUT -p tcp --syn -j REJECT
显式扩展用法
multiport
以离散方式定义多端口匹配,最多指定15个端口
格式:
-m multiport --sports port[,port|,port:port]... > 注意与隐式的区别--sport
指定多个源端口
-m multiport --dports port[,port|,port:port]... > 注意与隐式的区别--dport
指定多个目标端口
-m multiport --ports port[,port|,port:port]...多个源或目标端口
# iptables -A INPUT -p tcp -m multiport --dports 20:21,80,3306 -j REJECT
iprange
指明连续的(但一般不是整个网络)ip地址范围
格式:
-m iprange --src-range from[-to] 源IP地址范围
-m iprange --dst-range from[-to] 目标IP地址范围
# iptables -A INPUT -p tcp --dport 80 -m iprange --src-range 192.168.7.202-192.168.7.203 -j REJECT
mac扩展
指明源MAC地址,适用于:PREROUTING, FORWARD,INPUT chains
格式:
-m mac --mac-source XX:XX:XX:XX:XX:XX
#iptables -A INPUT -p tcp --dport 80 -m mac --mac-source 00:50:56:2d:d5:44 -j REJECT
string
对报文中的应用层数据做字符串模式匹配检测。一般在OUTPUT链处理。
--algo {bm|kmp}:字符串匹配检测算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
--from offset 开始偏移
--to offset 结束偏移
--string pattern:要检测的字符串模式
--hex-string pattern:要检测字符串模式,16进制格式
# iptables -A INPUT -m string --algo bm --string "6-web-1" -j REJECT
# iptables -A OUTPUT -m string --algo kmp --string "6-web-1" -j REJECT
time
根据将报文到达的时间与指定的时间范围进行匹配
格式:
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期 开始日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 结束日期
--timestart hh:mm[:ss] 时间 开始时间
--timestop hh:mm[:ss] 结束时间
[!] --monthdays day[,day...] 每个月的几号
[!] --weekdays day[,day...] 星期几。可以使用Mon, Tue, Wed, Thu, Fri, Sat, Sun, 或 1 to 7
--kerneltz:内核时区,不建议使用,CentOS7系统默认为UTC,所以,在Centos 7上要注意加减时差
注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)
周一至周五,8点至18点拒绝访问本机的80端口
# iptables -A INPUT -p tcp --dport 80 -m time --timestart 8:00:00 --timestop 18:00:00 --weekdays 1,2,3,4,5 -j REJECT
connlimit
根据每客户端IP做并发连接数数量匹配,可防止CC(Challenge Collapsar挑战黑洞)***
格式:
--connlimit-upto n:连接的数量小于等于n时匹配
--connlimit-above n:连接的数量大于n时匹配
通常分别与默认的拒绝或允许策略配合使用
# iptables -A INPUT -m connlimit --connlimit-above 2 -p tcp --dport 22 -j REJECT
limit
基于收发报文的速率做匹配
格式:
--limit 数字[/second|/minute|/hour|/day] 每/秒/分/时/天 限制
--limit-burst 数字 多少个之后才开始限制
# iptables -I INPUT -m limit --limit-burst 10 --limit 3/m -p icmp -j REJECT
state
根据”连接追踪机制“去检查连接的状态,较耗资源。conntrack机制:追踪本机上的请求和响应之间的关系
状态 | 描述 |
---|---|
NEW | 新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求 |
ESTABLISHED | NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态 |
RELATED | 新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系 |
INVALID | 无效的连接,如flag标记不正确 |
UNTRACKED | 未进行追踪的连接,如raw表中关闭追踪 |
已经追踪到的并记录下来的连接信息库
/proc/net/nf_conntrack
调整连接追踪功能所能够容纳的最大连接数量
/proc/sys/net/nf_conntrack_max
不同的协议的连接追踪时长
/proc/sys/net/netfilter/
CentOS7 需要加载模块: modprobe nf_conntrack
格式:
-m state --state NEW,ESTABLISHED
禁止新建立的访问80端口会话
# iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j REJECT
iptables的链接跟踪表最大容量为/proc/sys/net/nf_conntrack_max,各种状态的超时链接会从表中删除;当模板满载时,后续连接可能会超时
解决方法两个:
(1) 加大nf_conntrack_max 值
# vim /etc/sysctl.conf
net.nf_conntrack_max = 393216
net.netfilter.nf_conntrack_max = 393216
(2) 降低 nf_conntrack timeout时间
# vim /etc/sysctl.conf
net.netfilter.nf_conntrack_tcp_timeout_established = 300
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
开放被动模式的ftp服务
(1) 装载ftp连接追踪的专用模块:
跟踪模块路径:/lib/modules/kernelversion/kernel/net/netfilter
nf_conntrack_ftp.ko
# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="nf_conntrack_ftp"
或者手动加载模块 # modproble nf_conntrack_ftp
# service iptables restart
iptables: Loading additional modules: nf_conntrack_ftp [ OK ]
(2) 根据状态放行相关报文
# iptables -I INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT > 这一条应该在规则1
# iptables -I INPUT 2 -p tcp --dport 21 -j ACCEPT > 放行21命令端口,由上一条规则进行动态开放相关联的动态数据端口