pfSense 与 vagrant VM 之间出现奇怪的 NAT 问题

pfSense 与 vagrant VM 之间出现奇怪的 NAT 问题

这让我很困惑:

我有一个 pfSense 防火墙(我们称之为pfs),防火墙后面有几台服务器。我将几项服务从我的公共 IP NAT 到 LAN 上的不同服务器,没有任何问题。

在其中一台服务器上(我们称之为s1),我正在运行一个vagrant(带有libvirt)VM(我们称之为v1),它有一个民众192.168.1.159网络已配置,通过pfsDHCP 服务器获取 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:9980mydomain.com:9980pfs<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 }')

(有趣的是,它需要执行两次(或过一段时间?),可能是因为当启动配置脚本时网络还没有完全启动?)

这将删除 上的默认路由eth0public_network只会由 自动配置 上的eth1路由vagrant),并使外部连接按预期工作。这可能是(此处推测)由于默认情况下对传入 NAT 请求的响应通过 上的默认路由路由到防火墙eth0(默认情况下vagrant具有优先级),这会使 NAT FW 感到困惑,因为它是从 VM 的 进入的eth1。因此,删除eth0默认路由会在与外部请求进入的相同接口上回复外部请求。

相关内容