Jump to content

Recommended Posts

Posted

Всем привет, вопрос знатокам 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 нет.

Как быть?

Posted (edited)
SNAT и DNAT это stateful-фичи, пробуйте ip route nat и ip rule nat
Спасибо, но неужели если по умолчаюнию все разрешено в FORWARD то он все равно блочит пакеты?

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

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

Edited by tsolodov
Posted

Пробовал сделать такую же штуку на 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

 

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

Posted (edited)
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
Posted
-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.

 

Posted
-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 алгоритмы).
Posted
Собственно, 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).
Posted
Этими правилами классифицируются разные пакеты
да, недоглядел :) хотя один пакет вполне может попасть и под оба правила - если в результате маршрутизации будет отправлен назад )

 

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

 

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

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

 

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

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

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

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

 

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

 

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

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

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

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

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

 

Posted
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.

 

Черт побери)

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.