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-адрес интерфейса с псевдонимами для правил.
Проверь это:
Другой подход: использовать виртуальные интерфейсы (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.