iptables进阶用法-扩展模块
- 1、string扩展模块
- 2、time扩展模块
- 3、connlimit扩展模块
- 4、limit扩展模块
- 5、tcp-flags模块
- 6、state
1、string扩展模块
使用string扩展模块,可以指定要匹配的字符串,如果报文中包含对应的字符串,则符合匹配条件。
用法:
-m string:表示使用string扩展模块
–algo:用于指定匹配算法,可选的算法有bm与kmp,此选项为必须选项,必须指定一个。
–string:用于指定需要匹配的字符串。
举例如下:
[root@li ~]# iptables -t filter -I INPUT -m string --algo kmp --string "bik" -j REJECT
[root@li ~]# iptables -nvL
Chain INPUT (policy ACCEPT 9 packets, 552 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0
STRING match "bik" ALGO name kmp TO 65535 reject-with icmp-port-unreachable
2、time扩展模块
根据时间段区匹配报文,如果报文到达的时间在指定的时间范围以内,则符合匹配条件。
用法:
-m time:表示使用time扩展模块
–timestart:选项用于指定起始时间,00:00:00格式时分秒。
–timestop:选项用于指定结束时间。
–weekdays:用于用数字指定星期几,还能用缩写表示,例如:Mon, Tue, Wed,Thu, Fri, Sat, Sun
–monthdays,–datestart,–datestop:指定日期范围
举例如下:
[root@li ~]# iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 8:50:00 --timestop 17:00:00 -j REJECT
[root@li ~]# iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 1,2,3,4,5 -j REJECT
[root@li ~]# iptables -nvL
Chain OUTPUT (policy ACCEPT 3 packets, 312 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 TIME on Mon,Tue,Wed,Thu,Fri reject-with icmp-port-unreachable
0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 TIME from 08:50:00 to 17:00:00 reject-with icmp-port-unreachable
3、connlimit扩展模块
限制每个IP地址同时链接到server端的链接数量,不用指定IP,默认就是针对"每个客户端IP",一般和协议、端口配合使用
用法:
–connlimit-above:限制连接上限
–connlimit-mask:按照网段限制连接上限
举例如下:
[root@li ~]# iptables -t filter -I OUTPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 --connlimit-mask 24 -j REJECT
[root@li ~]# iptables -nvL
Chain OUTPUT (policy ACCEPT 6 packets, 592 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0
tcp dpt:22 #conn/24 > 2 reject-wit hicmp-port-unreachable
4、limit扩展模块
对"报文到达速率"进行限制,可以秒、分钟、小时、天作为单位进行限制。(主要用来限制单位时间内可以流入的数据包的数量)
用法: 使用"–limit"选项时,可以选择的时间单位有多种,如/second /minute /hour /day
举例如下:
[root@li ~]# iptables -t filter -I INPUT -m limit --limit 10/min -j REJECT
每六秒钟。有一个包不能流入,并且默认开始可以容纳五个包不能流入。
[root@li~]# iptables -nvL
Chain INPUT (policy ACCEPT 32 packets, 1857 bytes)
pkts bytes target prot opt in out source destination
17 1160 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 10/min burst 5
335 32564 REJECT icmp -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
[root@liyu ~]# ping 192.168.126.128 #用另一台机器ping
PING 192.168.126.128 (192.168.126.128) 56(84) bytes of data.
From 192.168.126.128 icmp_seq=1 Destination Port Unreachable
From 192.168.126.128 icmp_seq=2 Destination Port Unreachable
From 192.168.126.128 icmp_seq=3 Destination Port Unreachable
From 192.168.126.128 icmp_seq=4 Destination Port Unreachable
From 192.168.126.128 icmp_seq=5 Destination Port Unreachable
64 bytes from 192.168.126.128: icmp_seq=6 ttl=64 time=0.378 ms
From 192.168.126.128 icmp_seq=7 Destination Port Unreachable
64 bytes from 192.168.126.128: icmp_seq=8 ttl=64 time=0.390 ms
64 bytes from 192.168.126.128: icmp_seq=9 ttl=64 time=0.373 ms
64 bytes from 192.168.126.128: icmp_seq=10 ttl=64 time=0.311 ms
^C
--- 192.168.126.128 ping statistics ---
5、tcp-flags模块
–tcp-flags指的就是tcp头中的标志位,讲了三次握手,四次挥手以及TCP的包头,这里主要指tcp包头中的标志位置,SYN,ACK,FIN,RST,URG,PSH。
用法:
分为第一部分和第二部分,第一部分报头标志位全写,第二部分谁置1,就写谁。
举例如下:
[root@li ~]# iptables -t filter -I INPUT -p tcp --dport 22 --tcp-flags all SYN -j REJECT 匹配第一次握手
[root@li ~]# iptables -nvL
Chain INPUT (policy ACCEPT 2 packets, 128 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0
tcp dpt:22 flags:0x3F/0x02 reject-with icmp-port-unreachable
6、state
state是一个非常重要的扩展,可以基于连接追踪功能去查看每一报文当前所处的状态。
- 不论什么协议,客户端第一次访问时,服务器会去内核内存中的追踪表查看他之前是否来过,查不到就证明是第一次来,记入追踪表,如果查到以前来过就不检查规则,直接允许访问,这称为连接追踪机制。
- 报文状态有五种:
NEW: 第一次连接时;
ESTABLISHED:已建立的连接;
INVALID:无法识别的连接;
RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接 ;
UNTRACKED:row表上关闭连接追踪功能
举例如下:
[root@li ~]# iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@li ~]# iptables -t filter -A INPUT -j REJECT
[root@li ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
24 1536 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
原有连接不受影响
新建连接被拒绝