У меня есть два сервера, которые мы назовем МАРШРУТИЗАТОР и УЗЕЛ. NODE находится в частной сети 172.27.1.64/28 с IP-адресом 172.27.1.69. МАРШРУТИЗАТОР также находится в этой частной сети с IP-адресом 172.27.1.71. МАРШРУТИЗАТОР имеет общедоступный IP-адрес, который мы назовем 192.168.50.100 в этом примере. На ROUTER доступ к частной сети осуществляется через интерфейс eth1, а к общедоступной сети - через eth0. На NODE есть только eth0, который подключен к частной сети. Есть еще одна частная подсеть, которая отображается в таблицах маршрутизации ниже, но не должна иметь отношения (я надеюсь) к этой проблеме.
Я пытаюсь сделать так, чтобы МАРШРУТИЗАТОР действовал как маршрутизатор, использующий NAT. NODE должен иметь возможность подключаться через МАРШРУТИЗАТОР к общему Интернету, но никакие подключения не должны выполняться в обратном направлении.
Для этого существует множество руководств, и я пытался им следовать, но мне не удалось выполнить ping или иным образом получить доступ к хостам по IP-адресу или имени из NODE.
Вот что у меня в плане конфигурации:
Публичный интерфейс находится в «публичной» зоне, а частный интерфейс - во «внутренней» зоне.
Таблица маршрутизации на NODE:
default via 172.27.1.71 dev eth0
unreachable 169.254.169.254 scope host
172.27.1.64/28 dev eth0 proto kernel scope link src 172.27.1.69
172.27.9.192/28 dev eth0 scope link
Таблица маршрутизации на МАРШРУТИЗАТОРЕ:
default via 192.168.50.1 dev eth0
192.168.50.0/24 dev eth0 proto kernel scope link src 192.168.50.100
unreachable 169.254.169.254 scope host
172.27.1.64/28 dev eth1 proto kernel scope link src 172.27.1.71
172.27.9.192/28 dev eth1 scope link
Правила FirewallD на МАРШРУТИЗАТОРЕ:
# firewall-cmd --direct --get-all-rules
ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE
У меня дополнительно были эти правила на ROUTER, поскольку для меня было бы разумно иметь определенные правила для приема пакетов в каждом направлении, но их наличие или отсутствие не имеет значения - ни ping, ни curl, ни ssh не работают из NODE:
ipv4 filter FORWARD 0 -i eth1 -o eth0 -j ACCEPT
ipv4 filter FORWARD 0 -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
У меня вообще есть маскарад с firewalld:
# firewall-cmd --zone public --query-masquerade
yes
И у меня в ядре включена переадресация IP:
# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
Пробую пинговать 8.8.8.8. Он отлично работает с ROUTER, но не работает с NODE. 100% потеря пакетов. Использование curl для IP-адреса google.com дает тот же результат: работает с ROUTER, а не с NODE.
Естественно, проблема оказалась где-то совсем в другом. Мне нужно было отключить анти-спуфинг OpenStack в интерфейсе частной сети.
Я могу убедиться, что в брандмауэре необходимы все три правила.