假设你不想别人 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 结果浅析 》 |