Невозможно получить доступ к виртуальному IP-адресу локальной сети из глобальной сети, используя iptables NAT
Вот настройки:
- 2 сервера под управлением CentOS 5.6 (hostnames = "master1" и "master2")
- IP-адрес "master1" LAN равен 10.224.45.130, а IP WAN - 184.107.x.1
- IP-адрес "master2" LAN равен 10.224.45.131, а IP WAN - 184.107.x.2
- Apache + Heartbeat установлен на обоих, с "master1" в качестве основного для службы httpd в haresources.
- Apache привязывается к виртуальному IP 10.224.45.135 (запускается через пульс)
- iptables NAT PREROUTING из порта 80 -> 10.224.45.135:80 на обоих серверах.
(Примечание: я вошел в VPN, поэтому у меня есть доступ к локальной сети)
У меня пульс работает нормально. Это правильно создаст виртуальный IP-адрес на "master1" и запустит apache. Когда я останавливаю пульс на "master1" для имитации сбоя сервера, пульс правильно уведомляет "master2", который принимает виртуальный IP и запускает apache. Это все работает нормально.
Я могу указать IP-адрес локальной сети для любого сервера, и он будет загружать сайт независимо от того, на каком сервере в данный момент работает apache (поскольку оба имеют порт 80 iptables NAT PREROUTING для виртуального IP-адреса). Я также могу загрузить сайт, когда я указываю своему браузеру на сам виртуальный IP-адрес.
Однако, если я вызываю общедоступный IP-адрес WAN для любого из серверов, сайт будет загружаться только тогда, когда я вызываю IP-адрес для сервера, на котором в данный момент работает apache. Например, если master1 в настоящее время работает с Apache, я могу загрузить сайт, вызвав любые три из IP-адресов локальной сети или WAN IP для master1. Но сайт не загрузится, если я позвоню по WAN IP для master2. Однако, если я остановлю сердцебиение на master1, чтобы apache запустился на master2, я смогу загрузить сайт, вызвав IP WAN для master2, но не master1.
Я не уверен, почему iptables правильно направляет пакеты на виртуальный IP, когда я получаю доступ к сайту через IP-адрес локальной сети и 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
1 ответ
Я нашел ответ!
Мне нужно было добавить правило POSTROUTING в таблицу NAT, установленную на Masquerade для пакетов с DPT 80 или 443.
Нашел ответ здесь: http://www.debian-administration.org/articles/73
В дополнение к правилам, приведенным в статье, вам нужно правило POSTROUTING, чтобы разрешить маскировку, если перенаправление идет на другую машину. Например:
iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0
В противном случае ответ не вернется к исходному компьютеру, и соединение будет отфильтровано. По крайней мере, это то, что я обнаружил при попытке переадресации. Я ценю, что это слишком поздно, чтобы помочь, но это может помочь кому-то еще.