iptables: псевдоним IP и переадресация портов

Я не могу понять iptables, и я не очень разбираюсь в работе с сетями, и я действительно надеюсь, что кто-то может мне помочь.

У меня есть сервер с двумя IP-адресами, связанными с ним: 1.1.1.1 и 2.2.2.2

Запуск Ubuntu 10.04

Вот мой ifconfig:

eth0      Link encap:Ethernet  HWaddr 00:16:3e:xx:xx:xx  
          inet addr:1.1.1.1  Bcast:xxx.xxx.xxx.xxx  Mask:xxx.xxx.xxx.xxx
          inet6 addr: xxxxxxxxxxxxxxxxxxxxxxxx Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8601280 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2520243 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1736805563 (1.7 GB)  TX bytes:412953236 (412.9 MB)
          Interrupt:11 

eth0:0    Link encap:Ethernet  HWaddr 00:16:3e:xx:xx:xx  
          inet addr:2.2.2.2  Bcast:xxx.xxx.xxx.xxx  Mask:xxx.xxx.xxx.xxx
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:11 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:1216209 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1216209 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:13294196379 (13.2 GB)  TX bytes:13294196379 (13.2 GB)

Все работает нормально: когда я набираю 1.1.1.1 или 2.2.2.2 в адресную строку браузера, я получаю страницу Apache2 по умолчанию, как и ожидалось.

Теперь у меня есть приложение, которое запускается в браузере и имеет соединение WebSocket через порт 8000. Я обслуживаю страницу через порт 80 (http) как обычно, используя 1.1.1.1, и у меня WebSocket общается за кулисами с 2.2.2.2 через порт 8000. Все хорошо.

Теперь я подключаю свой 3G модем, который блокирует порт 8000. У меня не работает соединение с WebSocket до 2.2.2.2.

Я хочу, чтобы WebSocket связывался с 2.2.2.2 через порт 80, но чтобы сервер переводил запросы на 2.2.2.2:80 в 1.1.1.1:8000.

Я нашел это: точка метеоритного сервера org/installation/ (см. Раздел 6), но это не сработало;(Я также попробовал это: http://www.cyberciti.biz/faq/linux-port-redirection-with-iptables/ но это дало мне следующую ошибку:

ubuntu> sudo iptables -t nat -A PREROUTING -i eth0:0 -p tcp --dport 80 -j REDIRECT --to-port 8000
Warning: weird character in interface `eth0:0' (No aliases, :, ! or *).

По-видимому, псевдонимы IP не поддерживаются;(Я попытался поместить eth0:0 в кавычки, но это все равно не сработало.

Я полностью в тупике.

4 ответа

Решение

Вы на правильном пути. Вам не нужно указывать интерфейс ввода "псевдоним". С точки зрения iptables интерфейс ввода по-прежнему представляет собой eth0, даже если IP-адрес назначения равен 2.2.2.2. Попробуйте вместо этого:

iptables -t nat -A PREROUTING -i eth0 -d 2.2.2.2 -p tcp --dport 80 -j REDIRECT --to-port 8000

Это должно сделать то, что вы ищете.

Редактировать:

В этой команде вы хотите использовать "eth0", а не "eth0:0" (что недопустимо). Физический интерфейс, в который входит пакет, это "eth0", и это все, что касается iptables.

Если используемый вами протокол не основан на UDP, вам не нужна соответствующая запись "-p udp".

Чтобы увидеть, что сейчас в вашей цепочке "PREROUTING", сделайте iptables -t nat -L, Вы можете удалить отдельные записи из цепочки, используя iptables -t nat -D PREROUTING x где "x" - последовательный счетчик записи в цепочке, которую вы хотите удалить (первая - "1", вторая - "2" и т. д.), как показано iptables -t nat -L,

Не совпадают по названию устройства. Попробуйте просто сопоставить на основе IP

sudo iptables -t nat -A PREROUTING --destination 2.2.2.2 -p tcp --dport 80 -j REDIRECT --to-port 8000

Я отвечу на ваш вопрос другим вопросом:D

Вопрос: Как я могу использовать псевдонимные сетевые интерфейсы с вашим брандмауэром (например, eth0:0) в правилах?

A: Текущая реализация Linux не допускает различия между eth0 и eth0: 0, например. правила iptables/netfilter. Вы можете указать только eth0, который автоматически включает eth0:0 (и другие псевдонимы интерфейсов). Однако вы можете использовать IP-адрес интерфейса с псевдонимами для правил.

Проверь это:

Linux iptables: пример перенаправления портов

Другой подход: использовать виртуальные интерфейсы (macvlan).

Псевдонимы IP - это трюк более высокого уровня, и iptables увидит только один интерфейс (настоящий). Вы можете избежать проблемы, используя прямые IP-диапазоны, как это предлагается.

С интерфейсами vlan у вас не должно быть проблем с netfilter/iptables, поскольку они ведут себя как обычные интерфейсы на уровне ядра. Чтобы добавить новый (вам не нужно указывать Mac):

ip link добавить ссылку name_real_if адрес mac:virt:if name_virt_if тип macvlan

Таким образом, вы работаете напрямую с osi2, вы можете использовать их в конфигурациях мостов, создавать правила firewall/qos независимо от назначений ip...

Мне понадобилось некоторое время, чтобы найти это решение, Id всегда использовал ifconfig eth0:0, он быстрый и полезный, но, возможно, пришло время перейти на iproute2.

Другие вопросы по тегам