曲径通幽论坛

标题: 使用 --icmp-type 类型进行 icmp 过滤 [打印本页]

作者: beyes    时间: 2012-5-19 01:02
标题: 使用 --icmp-type 类型进行 icmp 过滤
假设你不想别人 ping 你,你可能会使用下面的规则:
[Plain Text] 纯文本查看 复制代码
iptables -A INPUT -p icmp -j DROP

但是这样一来,却有点伤人伤己的意思。比如你可能只希望别人 ping 不到你,而你却想能 ping 到别人,但如果硬生生的用上面的规则,那么这样的愿望不能达到。其原因是,当你去 ping 别人时,若是 ping 得通,那么对方也会给你返回一个 icmp 包,以表示被 ping 者对你有了响应。然而,就是上面这个规则,使这个响应包也被过滤掉了。解决办法是利用 --icmp-type 指定 icmp 类型参数进行过滤便可达到目的。

ICMP 报文可分为 2 个种类,一种是“差错报告报文”,另一种是“查询报文”。其中个种类又可细分为几种小类型,如下表所示:
种类 类型报文
差错报告报文
3 终点不可达
~
4 源点抑制
~
11 超时
~
12 参数问题
~
5 改变路由
查询报文 8 或 0
回送请求或回答
~ 13 或 14
时间戳请求或回答
~ 17 或 18
地址掩码请求或回答
~ 10 或 9
路由器询问和通告
这个类型码位于 ICMP 报文首部的第 1 个字节。
如上所说明,当代码号为 8 时是源主机发出“回送请求”(echo request)报文。换句话就是说,别人要 ping 我们时,它发来的 icmp 包的类型号为 8,而我们应答时的类型为 0 。因此,如果想屏蔽别人 ping ,而又能 ping 别人,那么可以只需要添加如下规则即可:
[Plain Text] 纯文本查看 复制代码
iptables -A INPUT -p icmp --icmp-type 8 -j DROP

添加完后,在 Linux 主机上 ping 一下 IP 为 192.168.1.100 的 Windows :
[root@beyes   beyes]# ping 192.168.1.100
PING 192.168.1.100 (192.168.1.100) 56(84) bytes of data.
64 bytes from 192.168.1.100: icmp_req=1 ttl=64 time=1.25 ms
64 bytes from 192.168.1.100: icmp_req=2 ttl=64 time=0.211 ms
然后在 Windows 上 ping 一下 Linux :
C:\Users\Administrator>ping 192.168.1.104

正在 Ping 192.168.1.104 具有 32 字节的数据:
请求超时。
请求超时。
请求超时。
请求超时。

192.168.1.104 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 0,丢失 = 4 (100% 丢失),
关于 ICMP 包更多信息可参考 RFC 793 和 RFC 2463 。
关于 ping 工具的结果信息还可以参考:《ping 结果浅析




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2