跳转至

07 iptables匹配udp扩展之icmp匹配

iptables 扩展udpicmp扩展

udp 扩展

udp 扩展中使用的匹配条件较少, 只有两个 --dport--sport ,即只匹配报文的源端口和目标端口; 例如:

放行samba 服务使用了udp137,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请求属于类型8icmp报文,而对方主机的ping回应报文则属于类型0icmp报文,根据应用场景的不同,icmp报文被细分为如下各种类型。

img

从上图可以看出,所有表示”目标不可达”的icmp报文的type码为3,而”目标不可达”又可以细分为多种情况,是网络不可达呢?还是主机不可达呢?再或者是端口不可达呢?所以,为了更加细化的区分它们,icmp对每种type又细分了对应的code,用不同的code对应具体的场景, 所以,我们可以使用type/code去匹配具体类型的ICMP报文,比如可以使用”3/1″表示主机不可达的icmp报文。

上图中的第一行就表示ping回应报文,它的type0code也为0,从上图可以看出,ping回应报文属于查询类(query)的ICMP报文,从大类上分,ICMP报文还能分为查询类与错误类两大类,目标不可达类的icmp报文则属于错误类报文。

而我们发出的ping请求报文对应的type8code0

了解完概念:

来看看实际应用场景

# 禁止所有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

注意: 名称中的空格 需替换成 "-"