У меня есть сервер, размещенный hetzner, с одним общедоступным IP-адресом, на котором работает proxmox и несколько виртуальных машин. Этот IP-адрес настраивается внутри /etc/interfaces следующим образом:
авто enp35s0
iface enp35s0 инет статический
адрес {{мой-публичный-ip}}/{{подсеть}}
шлюз {{hetzner-шлюз}}
up route add -net {{hetzner-ip}} сетевая маска 255.255.255.192 gw {{hetzner-gateway}} dev enp35s0
Эта конфигурация была сделана hetzner.
Поскольку я не хочу получать дополнительные IP-адреса от hetzner, я маскирую этот IP-адрес для внутренней сети виртуальных машин:
авто вмбр0
iface vmbr0 инет статический
адрес 172.16.0.1/24
мостовые порты
мост-стп выкл.
мост-fd 0
последующее эхо 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '172.16.0.0/24' -o enp35s0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '172.16.0.0/24' -o enp35s0 -j MASQUERADE
Благодаря этому мои виртуальные машины имеют доступ в Интернет и могут связываться друг с другом.
Поскольку переадресация портов iptables для меня слишком сложна, я начал использовать firewalld. Там мой интерфейс enp35s0 назначен внешней зоне, а vmbr0 — доверенной. Я знаю, может быть, мне следует назначить его внутреннему, но в настоящее время это не имеет большого значения (или я так думаю в моем проблемном случае).
Теперь у меня есть служба, работающая внутри виртуальной машины с IP-адресом 172.16.0.3 на порту 38080. Чтобы получить доступ к этой службе, я добавляю правило переадресации портов в firewalld: порт=38080:прото=tcp:toport=38080:toaddr=172.16.0.3
. Благодаря этому я могу получить доступ к этой службе из-за пределов этого сервера.
Теперь проблема заключается в том, что если я использую программное обеспечение, такое как uptime-kuma, и запускаю его также внутри виртуальной машины на той же физической машине, я не могу получить доступ к этой службе через порт 38080, потому что переадресация портов выполняется только для внешних запросов. Здесь важно то, что имя хоста, которое использует uptime-kuma, — это полное доменное имя, которое разрешается в общедоступный IP-адрес моего хост-компьютера.
Поэтому, чтобы сделать это возможным, я добавляю то же правило переадресации портов в доверенную зону firewalld, потому что мой интерфейс vmbr0 находится там, и с этого интерфейса поступает запрос.
Теперь это соединение работает, и мое программное обеспечение (аптайм-кума) может связаться с моей службой.
Большая проблема сейчас заключается в том, что КАЖДЫЙ запрос из виртуальной сети, который хочет использовать порт 38080, перенаправляется на эту виртуальную машину (172.16.0.3), даже те, которые идут на совершенно другой сервер.
Как я могу указать firewalld перенаправлять этот трафик только в том случае, если запрос действительно был направлен на хост-компьютер?