Jump to content
Калькуляторы

iptables хочется странного

Всем привет, вопрос знатокам iptables.

Хочется следующее:

есть 2 NAT сервера, на которых настроен one-to-one NAT.

Хочется чтобы траффик изходящий ходил через один нат, а приходил через другой(т.к. NAT one-to-one он поидее должен тупо натить по таблице своей), роутинг прописал на маршрутизаторах чтобы траффик проходил ассиметрично, но почему то ничего не выходит. Если весь трафик пустить через один NAT то все ОК.

 

В iptables я слаб.

 

 

ВОт конфиг NATA:

*mangle

:PREROUTING ACCEPT [10906:1649208]

:INPUT ACCEPT [1483:111227]

:FORWARD ACCEPT [6017:1182375]

:OUTPUT ACCEPT [1473:844306]

:POSTROUTING ACCEPT [7490:2026681]

COMMIT

# Completed on Fri Feb 18 21:47:55 2011

# Generated by iptables-save v1.3.5 on Fri Feb 18 21:47:55 2011

*nat

:PREROUTING ACCEPT [3387:354418]

:POSTROUTING ACCEPT [59:5165]

:OUTPUT ACCEPT [53:4877]

-A PREROUTING -d EXTERNALIP -i eth1.16 -j DNAT --to-destination INTERNALIP

-A POSTROUTING -s INTERNALIP -o eth1.16 -j SNAT --to-source EXTERNALIP

COMMIT

# Completed on Fri Feb 18 21:47:55 2011

# Generated by iptables-save v1.3.5 on Fri Feb 18 21:47:55 2011

*filter

:INPUT ACCEPT [1487:111431]

:FORWARD ACCEPT [2280:134892]

:OUTPUT ACCEPT [1478:848946]

COMMIT

# Completed on Fri Feb 18 21:47:55 2011

 

 

 

ICMP проходит а остально нет, т.е. как я понял UDP ходит а TCP нет.

Как быть?

Share this post


Link to post
Share on other sites
SNAT и DNAT это stateful-фичи, пробуйте ip route nat и ip rule nat
Спасибо, но неужели если по умолчаюнию все разрешено в FORWARD то он все равно блочит пакеты?

Очень хочется заставить iptables пропускать такие пакеты.

Кто знает как еще можено реализовать такую схему?

Edited by tsolodov

Share this post


Link to post
Share on other sites

Пробовал сделать такую же штуку на pf+pfsync. Не получилось. Забил.

 

Поиск в Гугле применительно к Линуксу выдаёт следующие ссылки:

 

http://www.spinics.net/lists/netfilter/msg48595.html

[ANNOUNCE] conntrack-tools 0.9.15 released

"... The daemon that allows to synchronize states between firewalls ..."

 

http://www.spinics.net/lists/netfilter/msg31218.html

Stateless NAT

 

http://linux-ip.net/html/nat-stateless.html

5.3. Stateless NAT with iproute2

5.4. Stateless NAT and Packet Filtering

 

Приятного просмотра.

Share this post


Link to post
Share on other sites
SNAT и DNAT это stateful-фичи, пробуйте ip route nat и ip rule nat
Спасибо, но неужели если по умолчаюнию все разрешено в FORWARD то он все равно блочит пакеты?

Очень хочется заставить iptables пропускать такие пакеты.

Дело в том, что до FORWARD пакеты просто не доходят, потому что на стадии "определение состояний"(см. картинку к этому посту) второй NAT-сервер(на который приходят пакеты в обратном направлении) не имеет в своей таблице xlat соответсвующей записи и поэтому не подсказывает процессу маршрутизации, что этот пакет нужно forward'ить, а не отправлять локальному приложению.

 

Собственно, Ilya Evseev предлагает использовать conntrackd с помощью которого можно синхронизировать таблицу трансляций между серверами. Звучит красиво конечно, но надо тестить на предмет производительности при большом кол-ве сессий. С первого взгляда, это больше решение уровня предпрития(чтобы сделать failover без сброса сессий), а не оператора. Сам давно хотел попробовать эту фишку, но никак руки не доходят, да и производственной необходимости нет, чисто академический интерес.

 

Кто знает как еще можено реализовать такую схему?

На этот вопрос уже прозвучал ответ - использовать ip rule+ip route. В вашем случае это лучше с точки зрения производительности, т.к. использовать stateful nat для реализации чисто stateless задачи это разбазаривание ресурсов.

400px_Netfilter_diagram_rus.png

Edited by s.lobanov

Share this post


Link to post
Share on other sites
-A PREROUTING -d EXTERNALIP -i eth1.16 -j DNAT --to-destination INTERNALIP

-A POSTROUTING -s INTERNALIP -o eth1.16 -j SNAT --to-source EXTERNALIP

имхо тут какая-то фигня написана, вы у каждого пакета меняете и src и dst одновременно. В итоге о "клиенте" не остается вообще никакой информации.

 

без полного описания задачи не понятно что вам конкретно надо, могу предположить, что для "входящего" трафика надо делать DNAT, для "исходящего" (на другом боксе) - SNAT.

 

Share this post


Link to post
Share on other sites
-A PREROUTING -d EXTERNALIP -i eth1.16 -j DNAT --to-destination INTERNALIP

-A POSTROUTING -s INTERNALIP -o eth1.16 -j SNAT --to-source EXTERNALIP

имхо тут какая-то фигня написана, вы у каждого пакета меняете и src и dst одновременно. В итоге о "клиенте" не остается вообще никакой информации.

Не фигня, обратите внимание на -i eth1.16 и -o eth1.16. Этими правилами классифицируются разные пакеты. Мало того, как написано в 1ом посте, это всё работает, если оно живёт на одном сервере.

 

без полного описания задачи не понятно что вам конкретно надо, могу предположить, что для "входящего" трафика надо делать DNAT, для "исходящего" (на другом боксе) - SNAT.
А всё равно не будет работать. Почему - см. выше(если в двух словах, то потому что SNAT и DNAT используют stateful алгоритмы).

Share this post


Link to post
Share on other sites
Собственно, Ilya Evseev предлагает использовать conntrackd с помощью которого можно синхронизировать таблицу трансляций между серверами.
Собственно, Ilya Evseev предлагает только научиться пользоваться поиском ;-)))

 

Цитата(tsolodov @ 18.2.2011, 14:01) *

-A PREROUTING -d EXTERNALIP -i eth1.16 -j DNAT --to-destination INTERNALIP

-A POSTROUTING -s INTERNALIP -o eth1.16 -j SNAT --to-source EXTERNALIP

 

имхо тут какая-то фигня написана, вы у каждого пакета меняете и src и dst одновременно. В итоге о "клиенте" не остается вообще никакой информации.

Static NAT обязан работать в обе стороны - и когда клиент обращается в Интернет (postrouting snat), и когда к клиенту обращаются из Интернета (prerouting dnat).

Share this post


Link to post
Share on other sites
Этими правилами классифицируются разные пакеты
да, недоглядел :) хотя один пакет вполне может попасть и под оба правила - если в результате маршрутизации будет отправлен назад )

 

а вообще да, если номер порта на каком-то этапе изменится - работать не будет, только stateful'ность тут сама по себе не виновата

 

Share this post


Link to post
Share on other sites
Этими правилами классифицируются разные пакеты
да, недоглядел :) хотя один пакет вполне может попасть и под оба правила - если в результате маршрутизации будет отправлен назад )

Исходя из моих представлений о netfilter и процессе маршрутизации в linux, без выхода пакета "наружу"(в интерфейс) этого произойти не может, а если он вернулся обратно через сеть это уже другой пакет.

 

а вообще да, если номер порта на каком-то этапе изменится - работать не будет, только stateful'ность тут сама по себе не виновата

В моём понимании, stateful это конечный автомат с памятью, stateless - без памяти. Подмена порта это запись в таблицу(память), т.е. использование памяти.

Share this post


Link to post
Share on other sites
без выхода пакета "наружу"(в интерфейс) этого произойти не может
хм... почему ж не может, или я вас не так понял.

Простой пример - две системы, по одному сетевому интерфейсу, дефолтовые маршруты смотят друг на друга, форвардинг включен, rp фильтра нет - всё любой пакет (с dst не интерфейса), пришедший через eth0 туда же и уйдет. Здесь то же - меняем dst адрес и в результате маршрутизации может оказаться, что надо отправить через eth1.16, потом этот же пакет попадет и под SNAT.

 

Подмена порта это запись в таблицу(память), т.е. использование памяти
Да, но можно записать в память и не подменять номер порта, а можно не записывать, и подменить :) В первом случае должно работать, во втором - нет. А что именно netfilter делает и то, и другое... ну кто ж виноват. Хотя интересно чем обусловлена замена порта, вроде как без необходимости там номер порта не меняется (или не менялся?) и специально для смены порта сделали параметр --random.

 

Share this post


Link to post
Share on other sites
SNAT и DNAT это stateful-фичи, пробуйте ip route nat и ip rule nat
Спасибо, но неужели если по умолчаюнию все разрешено в FORWARD то он все равно блочит пакеты?

Очень хочется заставить iptables пропускать такие пакеты.

Кто знает как еще можено реализовать такую схему?

Спасибо, как я понял то эти фичи на новых ядрах в Linux уже не работают?

Или я ошибаюсь?

 

Share this post


Link to post
Share on other sites
SNAT и DNAT это stateful-фичи, пробуйте ip route nat и ip rule nat
Спасибо, но неужели если по умолчаюнию все разрешено в FORWARD то он все равно блочит пакеты?

Очень хочется заставить iptables пропускать такие пакеты.

Кто знает как еще можено реализовать такую схему?

Спасибо, как я понял то эти фичи на новых ядрах в Linux уже не работают?

Или я ошибаюсь?

nat - a special NAT route. Destinations covered by the prefix are considered to be dummy (or external) addresses which

require translation to real (or internal) ones before forwarding. The addresses to translate to are selected with the

attribute Warning: Route NAT is no longer supported in Linux 2.6.

 

Черт побери)

Share this post


Link to post
Share on other sites

В linux 2.6 stateless nat переехал в tc(action nat), точнее появился там в ядрах, начиная с 2.6.24

 

Usage: ... nat NAT

NAT := DIRECTION OLD NEW

DIRECTION := { ingress | egress }

OLD := PREFIX

NEW := ADDRESS

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this