这让我很困惑:
我有一个 pfSense 防火墙(我们称之为pfs
),防火墙后面有几台服务器。我将几项服务从我的公共 IP NAT 到 LAN 上的不同服务器,没有任何问题。
在其中一台服务器上(我们称之为s1
),我正在运行一个vagrant
(带有libvirt
)VM(我们称之为v1
),它有一个民众192.168.1.159
网络已配置,通过pfs
DHCP 服务器获取 IP 。
现在我在 上配置了一个简单的 NATpfs
来访问s1
的 SSH,比如说<wan>:6622 -> s1:22
在 上访问它mydomain.com:6622
。没问题。
我也可以使用有效的 ssh 用户访问v1:22
(或等效操作)192.168.1.159:22
从局域网内部没有问题。
现在我添加一个简单的 NAT pfs
,比如说<wan>:6722 -> v1:22
。现在尝试访问mydomain.com:6722
才不是工作?!
目标是添加甚至“另一层”:运行具有公共端口的容器,例如,--publish 9980:80
并以例如和从的方式v1
访问它们,并使用相应的 NAT开启。v1:9980
mydomain.com:9980
pfs
<wan>:9980 -> v1:9980
从局域网这也按预期工作(即我可以v1:9980
从 LAN 访问),但 NAT 通过则pfs
不行。
我在同一网络的不同机器上也有类似的设置,运行起来没有问题。我甚至还有另一台(非 vagrant,但也是libvirt
)虚拟机s1
,我可以通过我的公共 IP 通过 NAT 进行 ssh 连接,一切顺利。但不知何故,上述方法无法在机器上运行vagrant
,我真的不知道是什么原因导致了这个问题。(FWIW,我已net.ipv4.forward
启用v1
)。
编辑:
我又近了一步:如果我vagrant
使用 删除虚拟机的第一个现有 NIC virt-manager
,并将第二个虚拟机设置为rtl8139
而不是virtio
(然后重新启动),我将失去vagrant ssh
功能,但 NAT 可以正常工作。那么问题就变成了:如何通过vagrant
配置进行配置,以便我们拥有类似的配置,我想这意味着公共网络必须在默认接口上?
答案1
解决方案:
原因是vagrant
需要(并因此配置)其本地接口(私有网络)作为主要接口,而没有标准方法来覆盖它。(以下是一些信息这里但vagrant
人们承认他们自己对这个话题感到困惑……)
对默认路由进行调整的概念的(更强大的)变体带来了解决方案。我正在使用一个ansible
配置程序,在其中执行以下操作(在客户机上,通过配置剧本):
- name: remove wrong default route on eth0 (again)
shell: |
eval $(route -n | awk '$0~/[.0]{4}/ && $3~/[.0]{4}/ && $8~/eth0/ { printf "ip route del default via %s dev %s; ",$3,$8 }')
(有趣的是,它需要执行两次(或过一段时间?),可能是因为当启动配置脚本时网络还没有完全启动?)
这将删除 上的默认路由eth0
(public_network
只会由 自动配置 上的eth1
路由vagrant
),并使外部连接按预期工作。这可能是(此处推测)由于默认情况下对传入 NAT 请求的响应通过 上的默认路由路由到防火墙eth0
(默认情况下vagrant
具有优先级),这会使 NAT FW 感到困惑,因为它是从 VM 的 进入的eth1
。因此,删除eth0
默认路由会在与外部请求进入的相同接口上回复外部请求。