07 iptables匹配udp扩展之icmp匹配
iptables 扩展udp之 icmp扩展¶
udp 扩展¶
udp 扩展中使用的匹配条件较少, 只有两个 --dport和--sport ,即只匹配报文的源端口和目标端口; 例如:
放行samba 服务使用了udp 的137,138 端口,
bash
iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPT
iptables -t filter -I INPUT -p udp -m udp --dport 138 -j ACCEPT
icmp 扩展¶
现在聊聊icmp扩展,没错,看到icmp,你肯定就想到了ping命令,因为ping命令使用的就是icmp协议。
ICMP协议的全称为Internet Control Message Protocol,翻译为互联网控制报文协议,它主要用于探测网络上的主机是否可用,目标是否可达,网络是否通畅,路由是否可用等。
我们平常使用ping命令ping某主机时,如果主机可达,对应主机会对我们的ping请求做出回应(此处不考虑禁ping等情况),也就是说,我们发出ping请求,对方回应ping请求,虽然ping请求报文与ping回应报文都属于ICMP类型的报文,但是如果在概念上细分的话,它们所属的类型还是不同的,我们发出的ping请求属于类型8的icmp报文,而对方主机的ping回应报文则属于类型0的icmp报文,根据应用场景的不同,icmp报文被细分为如下各种类型。

从上图可以看出,所有表示”目标不可达”的icmp报文的type码为3,而”目标不可达”又可以细分为多种情况,是网络不可达呢?还是主机不可达呢?再或者是端口不可达呢?所以,为了更加细化的区分它们,icmp对每种type又细分了对应的code,用不同的code对应具体的场景, 所以,我们可以使用type/code去匹配具体类型的ICMP报文,比如可以使用”3/1″表示主机不可达的icmp报文。
上图中的第一行就表示ping回应报文,它的type为0,code也为0,从上图可以看出,ping回应报文属于查询类(query)的ICMP报文,从大类上分,ICMP报文还能分为查询类与错误类两大类,目标不可达类的icmp报文则属于错误类报文。
而我们发出的ping请求报文对应的type为8,code为0。
了解完概念:
来看看实际应用场景
# 禁止所有icmp 报文进入本机
iptables -t filter -I INPUT -p icmp -j DROP
例子中; 使用 -p icmp 匹配了所有的icmp 报文; 如果进行了上述设置, 任何别的主机向我发送的 icmp 的报文,都会被丢弃;
假设, 我们目前需求有变; 只想让我们ping通别人, 但不想让别人ping 通我, 刚刚的配置就不再满足了; 可以进行如下配置
# 允许ping 别人, 别人不允许ping 我
iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT
➜ ~ ping 10.24.8.164
PING 10.24.8.164 (10.24.8.164): 56 data bytes
92 bytes from citicstest.cmzhu.com (10.24.8.164): Destination Port Unreachable
Vr HL TOS Len ID Flg off TTL Pro cks Src Dst
4 5 00 5400 f0b2 0 0000 40 01 083d 10.24.100.230 10.24.8.164
Request timeout for icmp_seq 0
92 bytes from citicstest.cmzhu.com (10.24.8.164): Destination Port Unreachable
Vr HL TOS Len ID Flg off TTL Pro cks Src Dst
4 5 00 5400 335a 0 0000 40 01 c595 10.24.100.230 10.24.8.164
Request timeout for icmp_seq 1
92 bytes from citicstest.cmzhu.com (10.24.8.164): Destination Port Unreachable
Vr HL TOS Len ID Flg off TTL Pro cks Src Dst
4 5 00 5400 9e2c 0 0000 40 01 5ac3 10.24.100.230 10.24.8.164
^C
--- 10.24.8.164 ping statistics ---
3 packets transmitted, 0 packets received, 100.0% packet loss
指令中;
-m icmp: 表示使用icmp 模块
--icmp-type 8/0: 表示具体的type 和code 去匹配对应的icmp报文;因为type 8 下只有一个code 0; 所以指令可以省略为
iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8 -j REJECT
除了使用对应的 type/code 外, 还可以使用对应的描述名称去匹配对应类型的报文;
iptables -t filter -I INPUT -p icmp -m icmp --icmp-type "echo-request" -j REJECT
注意: 名称中的空格 需替换成 "-"