LINUX.ORG.RU
ФорумAdmin

Iptables мапинг диапазона портов

 , ,


0

1

Добрый день!

Можно ли на iptables решить следующую задачу. Есть внешний диапазон портов:1.1.1.1:7000-8000. Есть внутренний диапазон портов:127.0.0.1:11000-12000. Мне нужно 1 к 1 отобразить внешний на внутренний, что-то около того:

for port in {7000..8000}
do
 iptables -t nat -A INPUT -p tcp -d 1.1.1.1 --dport ${port} -j DNAT --to-destination 127.0.0.1:$((port+4000))
done
Таких правил у меня много, порядка ~100k, хочется сгруппировать в более компактные. На serverfault есть совет делать вот так:
iptables -t nat -A INPUT -p tcp -d 1.1.1.1 --dport 7000:8000 -j DNAT --to-destination 127.0.0.1:11000-12000
Это не работает. Точнее, из диапазона 11000-12000 выбирается какой-то один случайный порт и далее весь трафик льется на него, а это совсем не то, что требуется.

Альтернативные идеи по решению задачи тоже принимаются. Сам посматриваю в сторону haproxy, но тащить его не хочется. Круче всего было бы справиться силами сетевого фильтра.


Ответ на: комментарий от vel

Я проверю, но предполагаю, что поведение будет аналогичным.

Дело в том, что 127.0.0.1 я написал для примера, в реальности у меня какие-то внутренние адреса вида 10.1.1.1. Далее несколько (десятков, сотен) экземпляров софтины, которая слушает порты 4000-+ на своих ip. И мне нужно делать мапинг ext_ip:p1-p2 в int_ip:4000-+.

RiD
() автор топика
Ответ на: комментарий от vel

Проверил:

iptables -t nat -A PREROUTING -p tcp -d 1.1.1.1 --dport 5000:6000 -j REDIRECT --to-ports 11000-12000

nc -4 -l 127.0.0.1 11500

echo test | nc 1.1.1.1 5500
Пусто.

RiD
() автор топика
Ответ на: комментарий от RiD

Слушать нужно не 127.0.0.1, а адрес интерфейса через который приходит запрос.

Для начала «nc -l -p 11500»

«echo test | nc 1.1.1.1 5500»

Через coontack можно посмотреть на какой локальны адрес оно редиректит.

потом проверять «nc -l -p 11500 -s <local_ip>»

vel ★★★★★
()
Ответ на: комментарий от vel

Слушать нужно не 127.0.0.1, а адрес интерфейса через который приходит запрос.

Для начала «nc -l -p 11500»

«echo test | nc 1.1.1.1 5500»

Это проверил, аналогично - пусто.

Далее мой неткат ругается «nc: cannot use -s and -l»

RiD
() автор топика
Ответ на: комментарий от RiD

Редирект работает, но локально это не проверить. Нужна другая машина/контейнер.

Но маппинг порт в порт не работает :(

vel ★★★★★
()
Ответ на: комментарий от RiD

А кто слушает эти порты ?

Может той софтине проще объяснить ситуацию.

Определить на какой порт коннектился клиент не сложно.

vel ★★★★★
()

Таких правил у меня много, порядка ~100k

максимальное количество правил? не, не слышал.

novitchok ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.