这篇我整理了iptables的扩展匹配条件
扩展匹配条件:分为隐式扩展和显示扩展
隐式扩展:
--source-port 或 --sport:匹配报文的源端口
--dport:匹配报文的目的端口
tcp的协议扩展:
--tcp-flags mask comp:表示要检查的标志
mask {SYN, ACK, FIN, RST}
--syn:用于匹配第一次握手,相当于--tcp-flags SYN,ACK,FIN,RST SYN
例子:
1.限制172.25.254.167访问主机172.25.254.111的ssh服务
iptables -A INPUT -s 172.25.254.167 -d 172.25.254.111 -p tcp --dport 22 -j DROP
udp的协议扩展:
--sport
--dport
icmp的协议扩展:
--icmp-type
echo-request 8(别人ping自己被限制)
echo-reply 0(自己ping别人被限制)
例子:
2.限制任何人ping自己
iptables -A INPUT -d 172.25.254.111 -p icmp --icmp-type 8 -j DROP
显示扩展:需要显示的指明使用的扩展模块
rpm -ql iptables(可以看到好多的.so文件,这就是规则扩展模块)
显示扩展:必须要显示的指明使用的扩展的模块
现在整理了几个常用的扩展模块(可以通过man iptables-extension获得扩展模块的使用帮助)
1.multiport扩展 (以离散方式定义多端口的配置,最多15个端口)
--sports 端口号,端口号
--dports
例子:
1.禁止172.25.254.167对172.25.254.111的ftp 以及web进行连接
iptables -A INPUT -s 172.25.254.167 -d 172.25.254.111 -p tcp -m multiport --dports 22,80 -j DROP
2.iprange扩展 (指明连续的ip地址的范围,但注意不能是整个网段)
--src-range 源ip地址范围
--des-range 目标ip地址的范围
例子:
丢弃ip地址在172.25.254.167到172.25.254.169范围的地址通过tcp协议访问主机172.25.254.111上的80端口
1.iptables -A INPUT -d 172.25.254.111 -p tcp --dport 80 -m iprange --src-range 172.25.254.167-172.15.254.169 -j DROP
3.string扩展 (注意这里要放在OUTPUT上)
注意:这个扩展是对发来的报文的应用层数据进行字符串的匹配工作的(前面我们说过firewall由于其设置防火墙的位置必须在内核的特定的位置,所以不能识别应用层的包头信息,就不能对应用层的协议包进行过滤,但是这个string扩展模块可以对应用层的数据进行处理)
--algo {bm | kmp} (字符串匹配算法规则)
--string pattern (要检查的字符串)
例子:
拒绝172.25.254.167主机发送的报文的应用层数据有boy这个字符的报文通过tcp协议连接172.25.254.111主机的80端口
1.iptables -A OUTPUT -s 172.25.254.167 -d 172.25.254.111 -p tcp --sport 80 -m string --algo bm --string "boy" -j REJECT
4.time扩展 (将报文到达的时间与指定的时间比较进行匹配)
可以用来设置在某个时间段内不能访问服务器
指定日期起止范围
--datastart
--datastop
指定时间起止范围
--timestart
--timestop
指定星期--weekdays
指定月份--monthdays
例子:
172.25.254.111的web服务在每周六周末的下午14:30---18:30不允许172.25.254.167访问
iptables -A INPUT -s 172.25.254.167 -d 172.25.254.111 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun -j DROP
注意:有可能达不到想要的效果,因为内核上用的时间是我们安装系统配置的什么时区上的时间,而这里默认的时间是UTC时间,因此给上面的例子加上--kerneltz即可。
5.connlimit扩展 (用来作并发连接数量的匹配)
--connlimit-upto n (连接的数量小于等于n时匹配)
--connlimit-above n (连接的数量大于n是匹配)
6.limit扩展 (基于收发报文的速率做匹配)
--limit rate{/second/minute/hour/day} (速率限制)
--limit-burst number (限定峰值数量)
例子:
一分钟只允许ping操作3次,第一次峰值发送5个包
iptables -A INPUT -d 172.25.254.111 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
其中--icmp-type 8(意思是只限制别人ping自己)
--limit 3/minute(一分钟内只能ping通3次就,其他都被拒决)[这里如果要使其他的都被拒绝,则要设置默认的匹配规则是拒绝,可以通过这个来设置iptables -p INPUT DROP]
--limit-burst 5(第一次的ping能接收5个包,但是第二次,第三次ping时就只能接收1个ping包)
7.state扩展 (连接追踪机制)
可以用来检查连接的状态
--state state
那么这里的state(状态)都有哪些
NEW:新请求,第一次发出的请求
ESTABLISHED:new状态后以及条目失效之前期间内进行的通信状态
RELATED:相关的连接
LNVALID:无效的连接
例子:
想一想,凡是从服务器的80端口发出来的包只能是对客户端的请求的响应,而不是去主动的连接客户端
iptables -A INPUT -d 172.25.254.111 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -p INPUT DROP
iptables -p OUTPUT DROP
iptables -A OUTPUT -s 172.25.254.111 -p tcp -m multiport --dports 22,80 -m state --state ESTABLISHED -j ACCEPT
上面的4条语句就能完成上面提出的问题,
第一条,服务器172.25.254.111接收所有客户端发给自己22和80端口的包
第二,三条,设置INPUT OUTPUT默认的规则 为DROP
第四条,服务器172.25.254.111只能够发出给客户端响应的包,而不能主动发送包给客户端(这里的state状态是ESTABLISHED则可以表示客户端是于服务器处于连接的状态,那么服务器给客户端发包只能是响应客户端的请求)
可能这里我解释的有点不好理解。请耐心的看。