Проблема iptables: nat с ip alias (виртуальный интерфейс) не работает
Я настраиваю сервер Ubuntu 11.10 в качестве брандмауэра для сети, в которой работает несколько разных SSL-сайтов. Идея довольно распространена: иметь все общедоступные IP-адреса для каждого сайта, привязанные к общедоступному интерфейсу на брандмауэре, и использовать iptables/NAT для переадресации соединений на веб-серверы. Хотя у меня дьявольское время получается заставить эту довольно простую вещь работать.
Скажем, у меня есть открытый интерфейс на брандмауэре:
eth0 25.25.25.25
И я хочу присвоить новый IP-адрес этому общедоступному интерфейсу:
ifconfig eth0:0 25.25.25.26
Затем я вижу, что интерфейс создан, и я могу пропинговать его с других хостов. Все идет нормально. Теперь мой веб-сервер находится на DMZ-стороне сети, доступной через брандмауэр, но не доступной для общественности. Допустим, внутренний веб-сервер 172.16.2.1. Поэтому я создаю правило NAT следующим образом:
iptables -t nat -A ПРЕДУПРЕЖДЕНИЕ -i eth0 -d 25.25.25.26 -j DNAT - к месту назначения 172.16.2.1
Просто не хочет работать. Если я запускаю tcpdump на общедоступном интерфейсе, он увидит входящий трафик, но iptables просто не преобразует его в NAT.
Это будет работать нормально, если я использую не псевдоним IP, например, 25.25.25.25. Я читал, что iptables не любит работать с виртуальными интерфейсами и игнорирует их. Это нормально, но все равно должно работать с "eth0" вместо "eth0:0". В моем случае iptables не жалуется, если я пытаюсь использовать "eth0: 0", но это не имеет никакого значения.
Я давно пользуюсь OpenBSD, поэтому мне удобно настраивать то же самое с pf. Но много лет назад я делал это с коробкой RedHat, и она работала просто отлично. Что-то изменилось? Должен быть способ сделать это. Я видел несколько примеров от других людей, которые говорили, что вам просто нужно убедиться, что вы указали основное устройство (eth0) вместо использования eth0:0. Но у меня ничего нет.
Да, и чтобы исключить, что это просто проблема фильтрации, я полностью отключил все правила фильтрации:
iptables -F
iptables -X
iptables -P FORWARD ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
Есть идеи? Я, конечно, не новичок, когда дело доходит до iptables, но эта проблема начинает заставлять меня чувствовать себя как один.
2 ответа
Когда вы используете виртуальные интерфейсы, просто используйте опцию -d (назначение), игнорируя опцию -i (интерфейс)
Вместо:iptables -t nat -A PREROUTING -i eth0 -d 25.25.25.26 -j DNAT --to-destination 172.16.2.1
использовать:iptables -t nat -A PREROUTING -d 25.25.25.26 -j DNAT --to-destination
Работа с iptables v1.4.14 в Debian
Скорее всего, вам нужно использовать прямую цепочку и не предоставлять входной интерфейс для этого:
iptables -t nat -A PREROUTING -i eth0 -d 25.25.25.26 -j DNAT --to-destination 172.16.2.1
Попробуйте это так:
iptables -t nat -A FORWARD -d 25.25.25.26 -j DNAT --to-destination 172.16.2.1
Это работает для меня как на Debian/Ubuntu, так и на маршрутизаторах на основе iptables, таких как MikroTik. Вы также можете посмотреть здесь о переадресации портов, это также может быть полезно.