Этот меня смутил:
У меня есть брандмауэр pfSense (назовем егоpfs
)и за ним несколько серверов. Я без проблем подключаю несколько служб с моего общедоступного IP-адреса к разным серверам в локальной сети.
На одном из серверов (назовем егоs1
)Я запускаюvagrant
(сlibvirt
)ВМ (назовем егоv1
)с настроенной публичной сетью, который получает IP 192.168.1.159
через DHCP-сервер pfs
.
Теперь я настраиваю простой NAT на pfs
для доступа к SSH s1
, скажем <wan>:6622 -> s1:22
, и получаю доступ к нему по mydomain.com:6622
. Без проблем.
Я также могу получить доступ кv1:22
(или эквивалентному192.168.1.159:22
)с действительным пользователем ssh из локальной сети без проблем.
Теперь я добавляю простой NAT на pfs
, скажем <wan>:6722 -> v1:22
. Теперь попытка доступа кmydomain.com:6722
не работает ?!
Цель состоит в том, чтобы добавить еще «еще один уровень»:запуска контейнеров с общедоступными портами, например. --publish 9980:80
на v1
и получить к ним доступ, например. v1:9980
и из mydomain.com:9980
с соответствующим NAT на pfs
, например <wan>:9980 -> v1:9980
. Из локальной сети это также работает как положено (т.е. Я могу получить доступ к v1:9980
из локальной сети ), но через NAT через pfs
нет.
У меня похожие установки работают в одной сети на разных машинах без проблем. У меня даже есть другая (не-бродячая, но такжеlibvirt
)виртуальная машина на s1
, к которой я могу подключиться по ssh через NAT через свой общедоступный IP-адрес. Но почему-то вышеперечисленное не работает с машиной vagrant
, и я действительно не понимаю, что может быть причиной этой проблемы. (FWIW У меня включен net.ipv4.forward
наv1
).
Я стал на один шаг ближе:, если я уничтожу первую существующую сетевую карту vagrant
ВМ, используя virt-manager
,и установите вторую виртуальную машину на rtl8139
вместо virtio
(, а затем перезапустите ), я теряю возможность vagrant ssh
, но NAT затем работает. Таким образом, возникает вопрос :, как настроить через vagrant
обеспечение таким образом, чтобы у нас была похожая конфигурация, я полагаю, это означает, что тогда общедоступная сеть должна быть на интерфейсе по умолчанию?
Причина в том, что vagrant
требует (и, следовательно, настраивает) свой локальный интерфейс (частную сеть) в качестве основного, без стандартного метода для его переопределения. (Некоторая информация здесь, но бродячие
люди признают, что они сами запутались в этой теме...)
(более надежный) вариант концепции для настройки маршруты по умолчанию принесли решение. Я использую ansible
Provisioner, где я выполняю следующее (на госте, через Provisioning playbook):
- 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
by vagrant
) и заставляет внешние соединения работать должным образом. Предположительно (предположительно здесь) это связано с тем, что ответы на входящие NAT-запросы направляются на брандмауэр через маршрут по умолчанию на eth0
по умолчанию (который по умолчанию vagrant
имеет приоритет) , что сбивает с толку NAT FW, потому что он вошел в виртуальную машину eth1
. Поэтому удаление eth0
в качестве ответов по умолчанию на внешние запросы на том же интерфейсе, на который они пришли.