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

Невозможно получить доступ к виртуальному IP-адресу LAN из WAN с помощью iptables NAT

Вот установка:

(Примечание: я вошел в VPN, поэтому у меня есть доступ к локальной сети)

У меня пульс работает нормально. Он правильно создаст виртуальный IP-адрес на «master1» и запустит apache. Когда я останавливаю пульс на «master1» для имитации сбоя сервера, пульс правильно уведомляет «master2», который принимает виртуальный IP и запускает apache. Все работает нормально.

Я могу указать IP-адрес локальной сети для любого сервера, и он загрузит сайт независимо от того, на каком сервере в настоящее время работает apache (поскольку оба имеют порт 80 iptables NAT PREROUTING для виртуального IP-адреса). Я также могу загрузить сайт, когда указываю в браузере сам виртуальный IP-адрес.

Однако, если я вызываю общедоступный IP-адрес WAN для любого сервера, сайт будет загружаться только тогда, когда я вызываю IP-адрес сервера, на котором в настоящее время работает apache. Например, если на master1 в настоящее время запущен apache, я могу загрузить сайт, вызвав любые три IP-адреса LAN или IP-адрес WAN для master1. Но сайт не загрузится, если я назову WAN IP для master2. Однако, если я остановлю сердцебиение на master1, чтобы apache запускался на master2, я могу загрузить сайт, вызвав IP-адрес WAN для master2, но не master1.

Я не уверен, почему iptables будет правильно маршрутизировать пакеты на виртуальный IP-адрес, когда я получаю доступ к сайту через IP-адрес LAN и IP-адрес WAN для сервера, на котором запущен apache, но не IP-адрес WAN для другого сервера, хотя оба они указывают на порт 80 на виртуальный IP. Я также заметил, что я могу пинговать только виртуальный IP-адрес (10.224.45.135) с сервера, на котором в данный момент работает apache (и, следовательно, с сервера, на котором в настоящее время настроен VIP). Я предполагал, что смогу пропинговать VIP с любого сервера. Я не уверен, связано ли это с причиной того, что IP-адрес WAN не маршрутизируется должным образом на VIP.

Вот моя настройка iptables:

*filter
:FORWARD DROP [0:0]
:INPUT DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -i tun0 -j ACCEPT
-A INPUT -i tap0 -j ACCEPT
-A INPUT -i br0 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 106 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 110 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 389 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 465 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 587 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 636 -j ACCEPT
-A INPUT -p udp -m udp --dport 694 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 843 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 873 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 953 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 993 -j ACCEPT
-A INPUT -p udp -m udp --dport 993 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 995 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 1194 -j ACCEPT
-A INPUT -p udp -m udp --dport 1194 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3000 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5901 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 7025 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 10000 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 11211 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 11511 -j ACCEPT
-A FORWARD -i br0 -j ACCEPT
-A FORWARD -o br0 -j ACCEPT
-A FORWARD -p tcp -m tcp --dport 80 -j ACCEPT
COMMIT
*mangle
:PREROUTING ACCEPT [30383:12077327]
:INPUT ACCEPT [30381:12077231]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [26362:10490359]
:POSTROUTING ACCEPT [26362:10490359]
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp -m tcp --dport 80 -j DNAT --to 10.224.45.135:80
-A PREROUTING -p tcp --dport 443 -j DNAT  --to 10.224.45.135:443
-A POSTROUTING -s 10.8.0.0/255.255.255.0 -o venet0 -j MASQUERADE
COMMIT

Я нашел ответ!

Мне нужно было добавить правило POSTROUTING в таблицу NAT, установленную на Masquerade для пакетов с DPT 80 или 443.

Нашел ответ здесь: http://www.debian-administration.org/articles/73#comment_22

В дополнение к правилам, описанным в статье, вам понадобится правило POSTROUTING, чтобы включить маскировку, если перенаправление идет на другой компьютер. Например:

iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0

В противном случае ответ не вернется на исходную машину, и соединение будет отфильтровано. По крайней мере, это то, что я обнаружил при попытке сделать пересылку. Я понимаю, что это слишком поздно, чтобы помочь, но это может помочь кому-то другому.