ping 是否忽略 iptables/postrouting 规则

ping 是否忽略 iptables/postrouting 规则

我有一台安装了 proxmox 的服务器,并且只有 1 个出站连接 (eth0)。

为了使机器之间建立网络,我在接口配置中创建了一个网桥 (vmbr0),并根据 Proxmox 网络模型(子点 NAT)对其进行了配置。

桥接器拥有 IP 10.1.1.1,根据我的理解,它充当本地网络和外部网络之间的网关。

为了实现这一点,在服务器上实施以下 iptable 策略:

Chain FORWARD (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  10.1.1.0/24          anywhere
ACCEPT     all  --  anywhere             10.1.1.0/24

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       all  --  10.1.1.0/24          anywhere             to:x.x.x.x

当我从安装在服务器上并通过网桥连接的虚拟机之一 ping Google DNS 服务器时ping 8.8.8.8,虚拟机能够从 Google DNS 服务器获取 ping 结果,因此 NAT 似乎正在工作。

(nat 再次代表整个子网 (10.1.1.0/24) )

如果我这样做:ping -I vmbr0 8.8.8.8但是在主机上,ping 命令会失败。此 ping 命令使用桥接接口来 ping Google DNS 服务器,我的期望是 POSTROUTING 策略也将使其能够与 Google DNS 服务器进行通信。

简而言之,当其他客户端使用网桥作为网关时,它们可以连接到互联网,但如果该接口本身被选为传出接口,则它无法找到路由。

因此,这引出了我的问题,是否显式使用接口以某种方式跳过后路由规则,并且真的被视为相关机器上路由的绝对端点?- in a sense: vmbr0 stays vmbr0 and never will be masqueraded to eth0 if you choose to ping over it -

答案1

man ping,加粗我的:

-I接口
接口可以是地址,或一个接口名称。如果接口是地址,它设置源地址到指定的接口地址。如果接口在接口名称,它设置源接口到指定接口。

问题在于强制使用接口,ping -I vmbr0而不是让系统最终选择正确的接口ping -I 10.1.1.1

另外,即使这没有什么区别nat/POSTROUTING(见下文),你也应该明白你是不是在主机上运行命令时进行路由,因此某些链(例如filter/FORWARD:)可能不适用(但nat/POSTROUTING仍然适用,请参阅下文)。请记住,在主机上运行命令而不是在主机上运行命令时,这可能会产生不同的结果路由的VM 取决于您的规则,即使这里使用正确的 ping 命令不是这种情况。

Netfilter 和通用网络中的数据包流OUTPUT原理图显示,在遍历来自本地进程的数据包的不同链之后,nat/POSTROUTING仍然会被遍历,所以是的,如果您的数据包通过它出去,eth0仍然会被 SNATed:这是通过使用ping -I 10.1.1.1 8.8.8.8

相反,当使用 强制接口时ping -I vmbr0 8.8.8.8,如果您运行tcpdumpvmbr0您可能会看到从 10.1.1.1 到 8.8.8.8 的 ARP 请求,而这些请求不会得到答案。

对于最后一个问题:是的,强制路由不能让数据包到达正确的目的地。你永远不可能被vmbr0伪装,因为 SNAT/MASQUERADE 是在数据包的IP,而不是在接口上,其应用取决于它们到目的地的路由。

相关内容