我的服务器是 Ubuntu 12.04:->IP 192.168.56.100
我有一个客户端 Ubuntu 13.04:->IP 192.168.56.101
我必须阻止从客户端到服务器的 ping 所以我编写了 IPTABLE 规则。
iptables -A INPUT -i eth0 -p ICMP -s 192.168.56.101 -j DROP
现在客户端无法 ping 通服务器,这部分没问题,但服务器无法 ping 通客户端,这是不应该发生的。在添加此规则之前,服务器和客户端都可以互相 ping 通。
请告诉我这里我遗漏了什么......
给出的答案是正确的,但是它是如何工作的......添加--icmp-type
echo-request 确实解决了这个问题,但是这个规则被添加到 INPUT 链规则中,那么这个规则怎么会与 OUTPUT 链混淆,因为它阻止了对客户端的 ping。
答案1
据我了解,ping
命令会向主机发送 ICMP 回显请求,然后主机会回复 ICMP 回显回复。因此,如果您阻止所有 ICMP,ping 根本不起作用。
您应该添加这个:
iptables -A INPUT -i eth0 -p icmp --icmp-type echo-request -s 192.168.56.101 -j DROP
这将仅阻止请求,但不阻止回复
在评论中回答你的问题
它不会阻止传出的 ping 请求。它会阻止所有传入的 ICMP 数据包。
当你执行ping
:
ping
发送 ICMP 请求数据包到192.168.56.101
(这是传出的 ICMP)192.168.56.101
接收该数据包并发送回复ICMP数据包返回你的服务器现在你的服务器 iptables 阻止了这个传入的回复数据包。这就是正在发生的事情。
sudo tcpdump ip proto \\icmp
你可以使用上的这个命令来检查192.168.56.101
。它将在线显示所有 ICMP 请求/回复。
做这个:
从服务器中删除此规则:
iptables -A INPUT -i eth0 -p icmp --icmp-type echo-request -s 192.168.56.101 -j DROP
将此规则添加到您的服务器:
iptables -A INPUT -i eth0 -p ICMP -s 192.168.56.101 -j DROP
现在执行此命令
192.168.56.101
:sudo tcpdump ip proto \\icmp
ping 192.168.56.101
在服务器上执行。
现在您应该看到192.168.56.101
它接收了 ping 请求并发送了回复。但是服务器上的 iptables 阻止了此回复。
答案2
显然你不会收到任何回复。ping 请求包含两个部分:
- 客户端 -> 服务器:ICMP 回显请求(又名“ping”)
- 服务器 -> 客户端:ICMP 回应应答(又名“pong”)
阻止所有类型的 ICMP 将惹麻烦如果你想阻止客户端“ping”(发送 PING 请求),那么在服务器:
-A INPUT -i eth0 -s 192.168.56.101/32 -p ICMP --icmp-type echo-request -j DROP
为了首先阻止客户端发送 ICMP ping 请求,您可以在客户:
-A OUTPUT -o eth0 -d 192.168.56.100/32 -p ICMP --icmp-type echo-request -j DROP
不过,从客户端角度来看,避免阻止客户端 ping 单个 IP 地址的情况非常罕见。你这样做的唯一原因是因为你的任务要求不ICMP ping 数据包通过网络从客户端流向服务器。
不过,我很奇怪你为什么要在 LAN 上阻止 ping 请求。使用 ARP,客户端仍然可以知道该服务器已连接到网络。