1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| * 目标端口 [root@bogon ~]# iptables -I INPUT -s 10.5.5.249 -p tcp -m tcp --dport 22 -j REJECT # 使用-m选项来指定扩展模块,如果想要使用--dport这个扩展匹配条件,则必须依靠某个扩折模块完成,上例中,这个扩展模块就是tcp扩展模块。 -m tcp表示使用tcp扩展模块,--dport表示tcp扩展模块中的一个扩展匹配条件,可用于匹配报文的目标端口。-p tcp与 -m tcp并不冲突,-p用于匹配报文的协议,-m 用于指定扩展模块的名称,正好这个扩展模块也叫tcp。 # 基本匹配条件我们可以直接使用,而如果想要使用扩展匹配条件,则需要依赖一些扩展模块 # 扩展匹配条件是可以取反的,同样是使用"!"进行取反,比如 "! --dport 22",表示目标端口不是22的报文将会被匹配到。 [root@bogon ~]# iptables -I INPUT -s 10.5.5.249 -p tcp --dport 22 -j REJECT # 也可以省略-m选项。当使用-p选项指定了报文的协议时,如果在没有使用-m指定对应的扩展模块名称的情况下,使用了扩展匹配条件, iptables默认会调用与-p选项对应的协议名称相同的模块。
* 源端口 [root@bogon ~]# iptables -I INPUT -s 10.5.5.249 -p tcp --sport 22 -j ACCEPT [root@bogon ~]# iptables --line -xvnL INPUT Chain INPUT (policy ACCEPT 59 packets, 4224 bytes) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT tcp -- * * 10.5.5.249 0.0.0.0/0 tcp spt:22 2 1 60 REJECT tcp -- * * 10.5.5.249 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable
* 指定端口范围 [root@bogon ~]# iptables -I INPUT -s 10.5.5.249 -p tcp --dport 22:25 -j REJECT [root@bogon ~]# iptables --line -xvnL INPUT Chain INPUT (policy ACCEPT 9 packets, 662 bytes) num pkts bytes target prot opt in out source destination 1 0 0 REJECT tcp -- * * 10.5.5.249 0.0.0.0/0 tcp dpts:22:25 reject-with icmp-port-unreachable # --dport 22:25表示目标端口为22到25之间的所有端口
[root@bogon ~]# iptables -I INPUT -s 10.5.5.249 -p tcp --dport :22 -j REJECT [root@bogon ~]# iptables -I INPUT -s 10.5.5.249 -p tcp --sport 80: -j REJECT [root@bogon ~]# iptables --line -xvnL INPUT Chain INPUT (policy ACCEPT 46 packets, 3358 bytes) num pkts bytes target prot opt in out source destination 1 0 0 REJECT tcp -- * * 10.5.5.249 0.0.0.0/0 tcp spts:80:65535 reject-with icmp-port-unreachable 2 0 0 REJECT tcp -- * * 10.5.5.249 0.0.0.0/0 tcp dpts:0:22 reject-with icmp-port-unreachable # --sport和--dport都可以指定多个端口,第一条表示从0到22端口,第二条表示80端口到65535端口
* --tcp-flags # "--tcp-flags"指的就是tcp头中的标志位,我们可以通过此扩展匹配条件,去匹配tcp报文的头部的标识位,然后根据标识位的实际情况实现访问控制的功能。 [root@bogon ~]# iptables -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT # "-m tcp --dport 22"的表示使用tcp扩展模块,指定目标端口为22号端口(ssh默认端口),"--tcp-flags"用于匹配报文tcp头部的标志位,"SYN,ACK,FIN,RST,URG,PSH SYN"就是用于配置我们要匹配的标志位的,我们可以把这串字符拆成两部分去理解,第一部分为"SYN,ACK,FIN,RST,URG,PSH",第二部分为"SYN"。第一部分表示:我们需要匹配报文tcp头中的哪些标志位,这里指定了六个标志位。第二部分表示:第一部分的标志位列表中,哪些标志位必须为1,这里指定的是SYN标志位必须为1,其他标志位必须为0。也就是tcp三次握手时第一次握手时的情况。 [root@bogon ~]# iptables --line -nvxL INPUT Chain INPUT (policy ACCEPT 44 packets, 3226 bytes) num pkts bytes target prot opt in out source destination 1 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
[root@bogon ~]# iptables -I INPUT -p tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT [root@bogon ~]# iptables -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT # 第一条命令匹配到的报文是第一次握手的报文,第二条命令匹配到的报文是第二次握手的报文。 [root@bogon ~]# iptables -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT [root@bogon ~]# iptables -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags ALL SYN,ACK -j REJECT # 上面两条命令可以简写成这样,也就是将六个标志位用ALL代替
* --syn [root@bogon ~]# iptables -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT # 使用"--syn"选项匹配第一次握手,这相当于使用"--tcp-flags SYN,RST,ACK,FIN SYN",也就是说,可以使用"--syn"选项去匹配tcp新建连接的请求报文。
|