我对 FreeBSD 中 IPFW 防火墙的功能有疑问。我的场景如下:
所有这些机器都运行 FreeBSD,并且都是虚拟机。问题是我不明白一件事。如果我在防火墙机器的 IPFW 中添加一条规则来阻止从机器 2 到机器 1 的 ping,我不知道为什么这个阻止是双向的。我的意思是,我制定了这条规则:
ipfw add 02000 deny icmp from 10.0.2.2 to 10.0.1.2
据我所知,防火墙将阻止任何从10.0.2.2
(图中右侧的机器)到10.0.1.2
(图中左侧的机器)的 ICMP 数据包,但实际发生的情况是,机器 2 无法 ping 到机器 1,但是机器1也无法ping通机器2!这是为什么? IPFW的规则如下:
答案1
如果您从 10.0.2.1 ping 10.0.2.2,则 ping 回复(从 10.0.2.2 到 10.0.2.1)也是一个 icmp 数据包,因此它符合规则并被阻止。
要获得您想要的行为,请将规则更改为:
ipfw add 02000 deny icmp from 10.0.2.2 to 10.0.1.2 icmptypes 8
其中类型 8 是“echo-request”,类型 0 是“echo-reply”。
或者在2000之前添加一条规则,只允许回复,并继续阻止所有其他ICMP数据包:
ipfw add 01999 allow icmp from 10.0.2.2 to 10.0.1.2 icmptypes 0 ipfw add 02000 deny icmp from 10.0.2.2 to 10.0.1.2
答案2
您可以使用 确认机器 2 是否正在接收并响应 ICMP 数据包tcpdump
,例如:
sudo tcpdump -i eth0 icmp
在您所描述的情况下,ping
不会成功,因为来自机器 2 的返回数据包将被机器 1 上的防火墙阻止。