Назад | Перейти на главную страницу

Настройка NAT с помощью firewalld на Centos 7

У меня есть два сервера, которые мы назовем МАРШРУТИЗАТОР и УЗЕЛ. 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 в интерфейсе частной сети.

Я могу убедиться, что в брандмауэре необходимы все три правила.