tsolodov Posted February 18, 2011 · Report post Всем привет, вопрос знатокам 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
s.lobanov Posted February 18, 2011 · Report post SNAT и DNAT это stateful-фичи, пробуйте ip route nat и ip rule nat Share this post Link to post Share on other sites
tsolodov Posted February 18, 2011 (edited) · Report post SNAT и DNAT это stateful-фичи, пробуйте ip route nat и ip rule natСпасибо, но неужели если по умолчаюнию все разрешено в FORWARD то он все равно блочит пакеты?Очень хочется заставить iptables пропускать такие пакеты. Кто знает как еще можено реализовать такую схему? Edited February 18, 2011 by tsolodov Share this post Link to post Share on other sites
Ilya Evseev Posted February 19, 2011 · Report post Пробовал сделать такую же штуку на 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
s.lobanov Posted February 19, 2011 (edited) · Report post 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 задачи это разбазаривание ресурсов. Edited February 19, 2011 by s.lobanov Share this post Link to post Share on other sites
vitalyb Posted February 19, 2011 · Report post -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
s.lobanov Posted February 19, 2011 · Report post -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 Posted February 19, 2011 · Report post Собственно, 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
vitalyb Posted February 19, 2011 · Report post Этими правилами классифицируются разные пакетыда, недоглядел :) хотя один пакет вполне может попасть и под оба правила - если в результате маршрутизации будет отправлен назад ) а вообще да, если номер порта на каком-то этапе изменится - работать не будет, только stateful'ность тут сама по себе не виновата Share this post Link to post Share on other sites
s.lobanov Posted February 19, 2011 · Report post Этими правилами классифицируются разные пакетыда, недоглядел :) хотя один пакет вполне может попасть и под оба правила - если в результате маршрутизации будет отправлен назад ) Исходя из моих представлений о netfilter и процессе маршрутизации в linux, без выхода пакета "наружу"(в интерфейс) этого произойти не может, а если он вернулся обратно через сеть это уже другой пакет. а вообще да, если номер порта на каком-то этапе изменится - работать не будет, только stateful'ность тут сама по себе не виновата В моём понимании, stateful это конечный автомат с памятью, stateless - без памяти. Подмена порта это запись в таблицу(память), т.е. использование памяти. Share this post Link to post Share on other sites
vitalyb Posted February 20, 2011 · Report post без выхода пакета "наружу"(в интерфейс) этого произойти не можетхм... почему ж не может, или я вас не так понял.Простой пример - две системы, по одному сетевому интерфейсу, дефолтовые маршруты смотят друг на друга, форвардинг включен, rp фильтра нет - всё любой пакет (с dst не интерфейса), пришедший через eth0 туда же и уйдет. Здесь то же - меняем dst адрес и в результате маршрутизации может оказаться, что надо отправить через eth1.16, потом этот же пакет попадет и под SNAT. Подмена порта это запись в таблицу(память), т.е. использование памятиДа, но можно записать в память и не подменять номер порта, а можно не записывать, и подменить :) В первом случае должно работать, во втором - нет. А что именно netfilter делает и то, и другое... ну кто ж виноват. Хотя интересно чем обусловлена замена порта, вроде как без необходимости там номер порта не меняется (или не менялся?) и специально для смены порта сделали параметр --random. Share this post Link to post Share on other sites
tsolodov Posted February 20, 2011 · Report post SNAT и DNAT это stateful-фичи, пробуйте ip route nat и ip rule natСпасибо, но неужели если по умолчаюнию все разрешено в FORWARD то он все равно блочит пакеты?Очень хочется заставить iptables пропускать такие пакеты. Кто знает как еще можено реализовать такую схему? Спасибо, как я понял то эти фичи на новых ядрах в Linux уже не работают?Или я ошибаюсь? Share this post Link to post Share on other sites
tsolodov Posted February 21, 2011 · Report post 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
s.lobanov Posted February 21, 2011 · Report post В linux 2.6 stateless nat переехал в tc(action nat), точнее появился там в ядрах, начиная с 2.6.24 Usage: ... nat NATNAT := DIRECTION OLD NEW DIRECTION := { ingress | egress } OLD := PREFIX NEW := ADDRESS Share this post Link to post Share on other sites