
這讓我很困惑:
我有一個 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
。沒問題。
我還可以訪問v1:22
(或同等的192.168.1.159:22
使用有效的 ssh 使用者從 LAN 內沒有問題。
現在我加入一個簡單的 NAT pfs
,比如說<wan>:6722 -> v1:22
。現在正在嘗試訪問mydomain.com:6722
才不是工作?
目標是添加“另一層”:使用公共連接埠運行容器,例如,--publish 9980:80
並使用例如相應的 NAT來v1
存取它們v1:9980
mydomain.com:9980
pfs
<wan>:9980 -> v1:9980
。從區域網路這也按預期工作(即我可以v1:9980
從 LAN 存取),但 NAT via 則pfs
不行。
我有類似的設定在不同機器上的同一網路中工作,沒有問題。我甚至還有另一個(非流浪者,但也是libvirt
)虛擬機s1
,我可以透過我的公共 IP 透過 NAT 進行 ssh ,效果非常好。但不知何故,上述內容不適用於機器vagrant
,我真的不知道可能導致此問題的原因。 (FWIW 我已net.ipv4.forward
啟用v1
)。
編輯:
我更近了一步:如果我vagrant
使用 NUKE 虛擬機器的第一個現有 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
自動配置)並使外部連線按預期工作。這大概是(此處推測)是因為對傳入 NAT 請求的響應默認通過默認路由(默認情況下具有優先級)路由到防火牆,這使 NAT 防火牆感到困惑,因為它來自 VM 的.因此,在外部請求進入的相同介面上刪除對外部請求的預設回應。eth1
vagrant
eth0
vagrant
eth1
eth0