我有一个带有proxmox安装的服务器,并且只有一个出站连接(eth0)。
为了使机器之间进行网络连接,我在接口配置中创建了一个网络桥(vmbr0),并相应地将其配置为Proxmox (Subpoint )。
这座桥有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当我从安装在服务器上的vms中的一个vms使用:ping 8.8.8.8连接Google服务器时,vm能够从Google服务器获得ping结果,因此NAT似乎在工作。
( nat再次适用于整个子网(10.1.1.0/24) )
但是,如果我这样做了:主机上的ping -I vmbr0 8.8.8.8,则ping命令将失败。这个ping命令使用桥接口来平Google DNS服务器,我期望POSTROUTING策略也能使它能够与Google DNS服务器通信。
因此,简单地说,当其他客户端使用网桥作为网关时,他们可以连接到internet,但是如果选择接口本身作为输出接口,则无法找到路由。
这就引出了我的问题,就是显式地使用一个接口,以某种方式跳过postrouting规则,并且实际上被认为是在有关机器- in a sense: vmbr0 stays vmbr0 and never will be masqueraded to eth0 if you choose to ping over it -上路由的绝对端点。
发布于 2018-08-24 19:09:06
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接口时,如果在vmbr0上运行tcpdump,很可能会看到10.1.1.1到8.8.8.8之间的ARP请求,这不会得到答案。
最后一个问题是:是的,强迫路由不能让数据包到达正确的目的地。您永远不能让vmbr0被伪装,因为SNAT/伪装是在数据包的IP上完成的,而不是在接口上完成的,它的应用程序取决于它们到目的地的路由。
https://unix.stackexchange.com/questions/464682
复制相似问题