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