LINUX.ORG.RU
ФорумAdmin

Iptables: FTP mangle


0

0

Есть сервер, подключенный к локалке провайдера. У сервера есть внутренний ип и "внешний ип", который, как часто бывает с провайдерами подключающих по LAN, реализован как двухсторонний NAT'инг на шлюзе провайдера. Этот шлюз только преобразовывает адреса, но не меняет данные в потоках, что важно для корректного NAT'инга таких протоколов как FTP. И как следствие активное фтп соединение не работает.

Задача: сделать так, чтобы работало активное FTP подключение и по возможности другие протоколы требующие изменения данных в самом соединении.

Проблема: пакеты исходящие от сервера должны иметь локальный исходящий адрес, иначе роутер провайдера их не пропустит.

Т.е. надо сделать так, чтобы conntrack хелперы меняли содержимое потока данных как-будто надо произвести SNAT, но собственно NAT не производить (оно будет осуществлено шлюзом провайдера).

Как такое сделать?

Пока единственный вариант, который я вижу, это написание собственного таргета для iptables. Но честно говоря не хочется этого делать.

anonymous

> Этот шлюз только преобразовывает адреса, но не меняет данные в потоках, что важно для корректного NAT'инга таких протоколов как FTP. И как следствие активное фтп соединение не работает.

Есть вариант, что провайдер деревянныйи не знает про связанные соединения. В линуксе достаточно включить conntrack-ftp и пропускать внутрь RELATED,ESTABLISHED, и всё будет работать. У меня работает, во всяком.

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

Проблема в том, что фтп клиент в запросе указывает "мой адрес 10.10.10.10" (т.е. локальный), а NAT шлюз это не правит на внешний. Естественно обратное соединение до сервера не дойдет. Если же сделать основным внешний ип, то фтп клиент адрес впишет правильный, но и у пакетов исходящий адрес будет внешним. А такие пакеты первый же роутер запиливает.

Если бы был таргет типа fake-snat, который пропускает поток через соответствующие conntrack хелперы, но не трогает заголовки пакета, то проблема бы решилась. Аналогично можно было бы решить с помощью какого-нибудь mangle фильтра, который просто устанавливал бы исходящий адрес в пакетах. Но ни того ни другого я найти не смог.

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

> Проблема в том, что фтп клиент в запросе указывает "мой адрес 10.10.10.10" (т.е. локальный), а NAT шлюз это не правит на внешний. Естественно обратное соединение до сервера не дойдет. Если же сделать основным внешний ип, то фтп клиент адрес впишет правильный, но и у пакетов исходящий адрес будет внешним. А такие пакеты первый же роутер запиливает.

Из первого сообщения я не очень понял, где стоит FTP и откуда к нему пытаются обращаться.

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

FTP-сервер находится в интернете. FTP-клиент на этой машине, подключенной к интернету через локальную сеть провайдера.

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

> FTP-сервер находится в интернете. FTP-клиент на этой машине, подключенной к интернету через локальную сеть провайдера.

Зачем тогда активный режим? Активный/пассивный как раз и нужно в зависимости от того у кого открытые порты есть.

В FileZilla той же есть настройки для подмены "роутерных" адресов, но это извращение, имхо. Есть случайные порты на вход - юзай активный режим. Нет - сервер у себя лишние порты откроет и ты туда подключайся.

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

Да я понимаю что можно пассивный юзать, в общем-то так и делаю. Но хотелось бы настроить чтобы и так и так работало, бывают фтпшки которые не поддерживают какой-нибудь из режимов.

Но на сколько я понимаю штатными модулями iptables это не реализуется?

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

> Но хотелось бы настроить чтобы и так и так работало, бывают фтпшки которые не поддерживают какой-нибудь из режимов.

Что-то в общем не так делаешь. Я сам сижу за натом дома, сейчас в активном режиме залез на рабочий FTP - проверил вот прямо сейчас, всё работает, в логах команда PORT видна с моим локальным адресом. conntrack-ftp загружен и на серваке, и на домашнем нате, равно как и там и там пропускается RELATED,ESTABLISHED.

Да, клиент filezilla.

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

Да, вдогонку - сделал в filezilla ровно то, что ты хотел сделать через собственный таргет в iptables. Итог - когда в PORT отправляется не внутренний адрес, а реальный внешний, NAT обратно как раз не открывается и после команды PORT нельзя получить даже список содержимого каталога. Собственно, на этом тема, думаю, исчерпана.

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

>Аналогично можно было бы решить с помощью какого-нибудь mangle фильтра, который просто устанавливал бы исходящий адрес в пакетах.

Вроде, если отключить все хелперы, то SNAT в таблице nat будет просто менять src-ip адрес пакета.

А так, что вам нужно это "ip rule nat" http://linux-ip.net/html/tools-ip-rule.html , но не знаю, рабочий ли он и остался ли в новых ядрах. Когда-то давно я его пробовал и он у меня не заработал, но может сейчас ситуация изменилась. Если получится, напишите сюда.

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

Без хелпера порт для ftp-data открываться не будет и активный режим не получится. Человек видимо не понимал этого.

anonymous
()
Ответ на: комментарий от mky

>Вроде, если отключить все хелперы, то SNAT в таблице nat будет просто менять src-ip адрес пакета.

Но тогда и внутри пакетов меняться ничего не будет.

Вариант с изменением src-адреса предполагал такое использование: вначале поток прогоняется через NAT, где меняется и содержимое пакетов и заголовки, а потом заголовок возвращается к исходному некоторым mangle правилом. Но такого правила в iptables нет.

ip rule nat хз, надо посмотреть как он с иптаблесовым натом будет сочетаться.

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

Я думал про вариант, если всех демонов повесить на "внешний ип", а потом эти пакеты SNAT'ить на внутренний ип. То есть исходно пакет формируется как надо, потом мы ему меняем только src-адрес, чтобы он прошел по локалки до шлюза провайдера, котоый потом опять заменит src-адрес.

Ну а для работы в локальной сети попросить у провайдера ещё один внутренний ип или делать NAT правила с учаётом MAC-адреса шлюза...

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

А что за ftp сервер используете? Из тех, что знаю я, в настройках сервера можно задать IP, который должен передаваться в команде PORT?

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