URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 82703
[ Назад ]

Исходное сообщение
"ipfw + natd - не работает исходящий активный FTP"

Отправлено Radio , 05-Ноя-08 06:55 
Есть внутренняя сеть на xl0 - 172.19.14.0/24
Есть интернет на rl0 - 77.41.90.28

ipfw + natd - стандартная настройка - блокируем всё из вне, разрешаем всё наружу

Всё работает кроме активного FTP из 172.19.14.0/24 наружу в интернет
Пассивный работает
Нужно чтобы работал активный

3 часа гугла и яндекса - ничего не дали (сплошное сборище пи....сов)

Помогите добрые люди

P.S. Это решение не работает (первая ссылка в гугле):
http://www.opennet.me/tips/info/721.shtml


Содержание

Сообщения в этом обсуждении
"ipfw + natd - не работает исходящий активный FTP"
Отправлено Backspace , 06-Ноя-08 00:50 
Если использование natd не критично - поглядите в сторону ipnat. Если фря седьмая, то нат есть прямо в ipfw.

"ipfw + natd - не работает исходящий активный FTP"
Отправлено Radio , 06-Ноя-08 05:27 
Заменил natd на ipnat - тоже самое. Исходящий активный FTP не работает. Хоть убейся. =)
В Интернете ни одного сайта с ответом. Вообще.

>Если использование natd не критично - поглядите в сторону ipnat. Если фря
>седьмая, то нат есть прямо в ipfw.


"ipfw + natd - не работает исходящий активный FTP"
Отправлено Pahanivo , 06-Ноя-08 10:38 
Сам в свое время натыкался на эти грабли. Грамотные люди подсказали.
Используй опцию natd "punch_fw". Лучше прописать ее в natd.cfg.
Суть в том, что natd понимает активный ftp и создает соотв временные правила для фаревола.


"ipfw + natd - не работает исходящий активный FTP"
Отправлено A Clockwork Orange , 06-Ноя-08 11:44 
globus в свое время писал
http://www.opennet.me/openforum/vsluhforumID3/4247.html
http://linux.opennet.ru/tips/sml/65.shtml

"ipfw + natd - не работает исходящий активный FTP"
Отправлено RSG , 06-Ноя-08 17:46 
>Есть внутренняя сеть на xl0 - 172.19.14.0/24
>Есть интернет на rl0 - 77.41.90.28
>
>ipfw + natd - стандартная настройка - блокируем всё из вне, разрешаем
>всё наружу

Хотя бы привел ipfw sh этих стандартных настроек.

>P.S. Это решение не работает (первая ссылка в гугле):
>http://www.opennet.me/tips/info/721.shtml

Не понимаю нафига крутить keep state к активному нату. У меня как раз natd работает только для активного фтп (не примоню чтобы natd хотел какие-либо дополнительные параметры для активации ftp-proxy):

ipfw add 37 divert 8668 ip from 192.168.0.0/16,10.0.0.0/8 to any 21,20 out via re0
ipfw add 37 divert 8668 ip from any to $nat_ip in via re0

FreeBSD 6.0-RELEASE


"ipfw + natd - не работает исходящий активный FTP"
Отправлено Pahanivo , 07-Ноя-08 07:32 
>Не понимаю нафига крутить keep state к активному нату. У меня как
>раз natd работает только для активного фтп (не примоню чтобы natd
>хотел какие-либо дополнительные параметры для активации ftp-proxy):
>

1) ты походу ваааще нихрена не понимаешь - какая связь keep state с активным прокси вообще???
2) на НАТ активный ftp не работает по определению (учи матчасть), в natd реализован хитрый обход этого дела.
3) какой нахер proxy? че за каша в голове?

>ipfw add 37 divert 8668 ip from 192.168.0.0/16,10.0.0.0/8 to any 21,20 out
>via re0
>ipfw add 37 divert 8668 ip from any to $nat_ip in via
>re0

правила выше херня не имеющая отношения в активному ftp


"ipfw + natd - не работает исходящий активный FTP"
Отправлено Radio , 07-Ноя-08 08:44 
Кстати в pf только ftpproxy и рекомендован для поддержки активного FTP
Если бы было нечто похожее в ipfw - я был бы только рад

Из документации к pf.conf:

ftpproxy_enable=”YES” >> rc.conf

в pf.conf
nat-anchor “ftp-proxy/*”
rdr-anchor “ftp-proxy/*”
rdr pass on $if proto tcp from any to $if port 9021 -> 127.0.0.1 port 8021
anchor “ftp-proxy/*”

Этими 5мя строчками разрешается вся головная боль с FTP в pf

>3) какой нахер proxy? че за каша в голове?


"ipfw + natd - не работает исходящий активный FTP"
Отправлено Pahanivo , 07-Ноя-08 09:24 
>что то думается то натд и механизм отслеживания команды PORT это разные
>уровни сетевой модели. дайте ссылку как натд отслеживает команду PORT.
>приведенные правила были для пассинвного фтп

Немного покапавшись в natd выяснилось, что natd использует libalias(3). А
немного покопавшись в libalias выяснилось, что  эта либа умеет отслеживать фтп команды.
(см /usr/src/sys/netinet/libalias/alias_ftp.c).
    
    Alias_ftp.c performs special processing for FTP sessions under
    TCP.  Specifically, when a PORT/EPRT command from the client
    side or 227/229 reply from the server is sent, it is intercepted
    and modified.  The address is changed to the gateway machine
    and an aliasing port is used.

Так что можно сказать что natd так же отслеживает и меняет команды ftp.

Теперь на счет punch_fw. Читаем маны и видим.

man libalias(3):

PKT_ALIAS_PUNCH_FW
                   This option makes libalias `punch holes' in an
                   ipfirewall(4) based firewall for FTP/IRC DCC connections.
                   The holes punched are bound by from/to IP address and port;
                   it will not be possible to use a hole for another connec-
                   tion.  A hole is removed when the connection that uses it
                   dies.

Ептыть.. можете в меня плюнуть если это не STATEFULL и если это не просто
динамическое создание временного правила в ipfw.

А вот опция -s
man natd:

-use_sockets | -s
                 Allocate a socket(2) in order to establish an FTP data or IRC
                 DCC send connection.  This option uses more system resources,
                 but guarantees successful connections when port numbers con-
                 flict.

Она же в libalias(3):

PKT_ALIAS_USE_SOCKETS
                   This bit should be set when the packet aliasing host origi-
                   nates network traffic as well as forwards it.  When the
                   packet aliasing host is waiting for a connection from an
                   unknown host address or unknown port number (e.g. an FTP
                   data connection), this mode bit specifies that a socket be
                   allocated as a place holder to prevent port conflicts.
                   Once a connection is established, usually within a minute
                   or so, the socket is closed.

И создает сокет (как написано для предотвращения конфилктов портов) на который
"соединяется" сервер со своего 20 порта.

Таки образом, если правла ipfw уже разрешают прохождение заначеных/разначеных
пакетов, то активный режим будет работать без дополнительных опций.


"ipfw + natd - не работает исходящий активный FTP"
Отправлено Radio , 07-Ноя-08 09:35 
Спасибо, работает

Только пришлось ещё добавить
natd_flags="-s -m -u -dynamic -punch_fw 500:499"

ПРОБЛЕМА РЕШИЛАСЬ! УРА!! =))

>ЕЩЕ РАЗ!!!
>
>Используй опцию natd "punch_fw". Лучше прописать ее в natd.cfg.
>Суть в том, что natd понимает активный ftp и создает соотв временные
>правила для фаревола.
>
>В твоей конфиге небудет никакой головной боли )


"ipfw + natd - не работает исходящий активный FTP"
Отправлено RSG , 07-Ноя-08 09:48 
>1) ты походу ваааще нихрена не понимаешь - какая связь keep state
>с активным прокси вообще???

А такая, уважаемый, что все примеры, на которые даны ссылки используют keep state правила. Если не знаете что такое keep state читайте документацию. Ну а уж что значит "активный прокси" - это видимо только Вам известно. Не дадите ссылочку почитать?

>2) на НАТ активный ftp не работает по определению (учи матчасть), в
>natd реализован хитрый обход этого дела.

Вот именно что natd позволяет работать через себя ftp в активном режиме. Без всяких дополнительных настроек.

>3) какой нахер proxy? че за каша в голове?

man ftp-proxy

>>ipfw add 37 divert 8668 ip from 192.168.0.0/16,10.0.0.0/8 to any 21,20 out
>>via re0
>>ipfw add 37 divert 8668 ip from any to $nat_ip in via
>>re0
>
>правила выше херня не имеющая отношения в активному ftp

Видимо Вам самому не мешало бы почитать кое что из документации, в частности как работает активный режим ftp протокола, тогда думаю правила приведенные выше для Вас обретут смысл.


"ipfw + natd - не работает исходящий активный FTP"
Отправлено Radio , 07-Ноя-08 09:53 
Кстати ftp-proxy для FreeBSD был специально заточен под pf
Сколько не пробовал под ipfw - не работает

DESCRIPTION
     ftp-proxy is a proxy for the Internet File Transfer Protocol.  FTP con-
     trol connections should be redirected into the proxy using the pf(4) rdr
     command, after which the proxy connects to the server on behalf of the
     client.

>man ftp-proxy
>


"ipfw + natd - не работает исходящий активный FTP"
Отправлено RSG , 07-Ноя-08 09:57 
>Кстати ftp-proxy для FreeBSD был специально заточен под pf
>Сколько не пробовал под ipfw - не работает

Именно так, т.к. еще повторюсь, в natd реализован свой механизм отслежвания команды PORT. При этом механизм для активного ftp, реализованный в ftp-proxy работает именно как прокси! Когда устанавливается data connection на клиента в качестве src ip будет адрес где запущен ftp-proxy. В то время как natd работает как прозрачный прокси, сохраняя src ip сервера.


"ipfw + natd - не работает исходящий активный FTP"
Отправлено A Clockwork Orange , 07-Ноя-08 10:17 
что то думается то натд и механизм отслеживания команды PORT это разные уровни сетевой модели. дайте ссылку как натд отслеживает команду PORT.
приведенные правила были для пассинвного фтп

"ipfw + natd - не работает исходящий активный FTP"
Отправлено RSG , 07-Ноя-08 11:36 
>что то думается то натд и механизм отслеживания команды PORT это разные
>уровни сетевой модели. дайте ссылку как натд отслеживает команду PORT.
>приведенные правила были для пассинвного фтп

Посыпаю голову пеплом.. Не нашел в исходниках чтобы natd отслеживал команд ftp. Был не прав, вспылил. Однако у меня, при описаных выше правилах SYN от data connection  с 20-ого порта сервера успешно проходит через natd и доходит до клиента. Одако никаких punch_fw я не использую. Сейчас разберусь как natd это делает...


"ipfw + natd - не работает исходящий активный FTP"
Отправлено RSG , 07-Ноя-08 11:59 
>>что то думается то натд и механизм отслеживания команды PORT это разные
>>уровни сетевой модели. дайте ссылку как натд отслеживает команду PORT.
>>приведенные правила были для пассинвного фтп
>
>Посыпаю голову пеплом.. Не нашел в исходниках чтобы natd отслеживал команд ftp.
>Был не прав, вспылил. Однако у меня, при описаных выше правилах
>SYN от data connection  с 20-ого порта сервера успешно проходит
>через natd и доходит до клиента. Одако никаких punch_fw я не
>использую. Сейчас разберусь как natd это делает...

Оданко судя по tcpdump -X после прохождения через natd команда EPRT заменена на другую с ip адресом за которым просиходит NAT. Пока у меня объяснения нет.


"ipfw + natd - не работает исходящий активный FTP"
Отправлено RSG , 07-Ноя-08 13:55 
>что то думается то натд и механизм отслеживания команды PORT это разные
>уровни сетевой модели. дайте ссылку как натд отслеживает команду PORT.
>приведенные правила были для пассинвного фтп

Немного покапавшись в natd выяснилось, что natd использует libalias(3). А немного покопавшись в libalias выяснилось, что  эта либа умеет отслеживать фтп команды.
(см /usr/src/sys/netinet/libalias/alias_ftp.c).
    
    Alias_ftp.c performs special processing for FTP sessions under
    TCP.  Specifically, when a PORT/EPRT command from the client
    side or 227/229 reply from the server is sent, it is intercepted
    and modified.  The address is changed to the gateway machine
    and an aliasing port is used.

Так что можно сказать что natd так же отслеживает и меняет команды ftp.

Теперь на счет push_fw. Читаем маны и видим.

man libalias(3):

PKT_ALIAS_PUNCH_FW
                   This option makes libalias `punch holes' in an
                   ipfirewall(4) based firewall for FTP/IRC DCC connections.
                   The holes punched are bound by from/to IP address and port;
                   it will not be possible to use a hole for another connec-
                   tion.  A hole is removed when the connection that uses it
                   dies.

Ептыть.. можете в меня плюнуть если это не STATEFUL и если это не просто динамическое создание временного правила в ipfw.

А вот опция -s
man natd:

-use_sockets | -s
                 Allocate a socket(2) in order to establish an FTP data or IRC
                 DCC send connection.  This option uses more system resources,
                 but guarantees successful connections when port numbers con-
                 flict.

Она же в libalias(3):

PKT_ALIAS_USE_SOCKETS
                   This bit should be set when the packet aliasing host origi-
                   nates network traffic as well as forwards it.  When the
                   packet aliasing host is waiting for a connection from an
                   unknown host address or unknown port number (e.g. an FTP
                   data connection), this mode bit specifies that a socket be
                   allocated as a place holder to prevent port conflicts.
                   Once a connection is established, usually within a minute
                   or so, the socket is closed.

И создает сокет (как написано для предотвращения конфилктов портов) на который "соединяется" сервер со своего 20 порта.

Таки образом, если правла ipfw уже разрешают прохождение заначеных/разначеных пакетов, то активный режим будет работать без дополнительных опций.


"ipfw + natd - не работает исходящий активный FTP"
Отправлено RSG , 07-Ноя-08 10:13 
>А такая, уважаемый, что все примеры, на которые даны ссылки используют keep
>state правила. Если не знаете что такое keep state читайте документацию.

Прошу прощения. Везде где я писал keep state читать STATEFUL FIREWALL.  keep state это частный случай.


"ipfw + natd - не работает исходящий активный FTP"
Отправлено Pahanivo , 07-Ноя-08 17:42 
>>1) ты походу ваааще нихрена не понимаешь - какая связь keep state
>>с активным прокси вообще???
>
>А такая, уважаемый, что все примеры, на которые даны ссылки используют keep
>state правила. Если не знаете что такое keep state читайте документацию.
>Ну а уж что значит "активный прокси" - это видимо только
>Вам известно. Не дадите ссылочку почитать?

опечатка - читать "активный ftp" вмето "активный прокси" )
>
>>2) на НАТ активный ftp не работает по определению (учи матчасть), в
>>natd реализован хитрый обход этого дела.
>
>Вот именно что natd позволяет работать через себя ftp в активном режиме.
>Без всяких дополнительных настроек.

а я о чем? дак о томже )
>
>>3) какой нахер proxy? че за каша в голове?
>
>man ftp-proxy

нахер вообще проксировать в этом случае ftp - что такое прокси я знаю )
>>>ipfw add 37 divert 8668 ip from 192.168.0.0/16,10.0.0.0/8 to any 21,20 out
>>>via re0
>>>ipfw add 37 divert 8668 ip from any to $nat_ip in via
>>>re0
>>
>>правила выше херня не имеющая отношения в активному ftp
>
>Видимо Вам самому не мешало бы почитать кое что из документации, в
>частности как работает активный режим ftp протокола, тогда думаю правила приведенные
>выше для Вас обретут смысл.

это обычные правила ната - частный случай для ftp - ничего более
если есть хоть одно правило запрещающее in via setup (а в нормальном фареволе они есть),
то толку в них не будет
сомневаюсь что natd без опции panch вообще прочухаеть про активный ftp ...


"ipfw + natd - не работает исходящий активный FTP"
Отправлено RSG , 07-Ноя-08 21:52 
>>man ftp-proxy
>
>нахер вообще проксировать в этом случае ftp - что такое прокси я
>знаю )

В мане все написано...

>>Вот именно что natd позволяет работать через себя ftp в активном режиме.
>>Без всяких дополнительных настроек.
>
>а я о чем? дак о томже )

Если Вы согласны с моим утверждением здесь

>сомневаюсь что natd без опции panch вообще прочухаеть про активный ftp ...

То что это за высказывание?

Выше я привел довольно развернуто как работает активный ftp через natd со ссылками на соответствующие маны и исходники.

>это обычные правила ната - частный случай для ftp - ничего более

Нет, это правила _только_ для работы ftp в активном режиме. Даже пассивный через такие правила работать не будет, т.к. клиент не сможет установить соединение на сервер. В общем приведеные мною правила естественно являются частным случаем использования natd.

>
>если есть хоть одно правило запрещающее in via setup (а в нормальном
>фареволе они есть),
>то толку в них не будет

Я могу и быть не прав, но считаю, что если пакет достиг правила divert, то все фильтрующие правила с исходным ip он прошел. А делать STATEFUL FIREWALL для приватных адресов бессмысленно.



"ipfw + natd - не работает исходящий активный FTP"
Отправлено Pahanivo , 08-Ноя-08 22:06 
>Я могу и быть не прав, но считаю, что если пакет достиг
>правила divert, то все фильтрующие правила с исходным ip он прошел.
>А делать STATEFUL FIREWALL для приватных адресов бессмысленно.

ммм невсегда .. пройдя нат у пакета сменится дестанейшн - фильтровать можно и дальше.
спасибо за то что так глубоко капнул про нат выше )


"ipfw + natd - не работает исходящий активный FTP"
Отправлено RSG , 10-Ноя-08 10:19 
>>Я могу и быть не прав, но считаю, что если пакет достиг
>>правила divert, то все фильтрующие правила с исходным ip он прошел.
>>А делать STATEFUL FIREWALL для приватных адресов бессмысленно.
>
>ммм невсегда .. пройдя нат у пакета сменится дестанейшн - фильтровать можно
>и дальше.

Простите, Вы про какие пакеты говорите? Про "заначеные" (прошедшие NAT из локальной сети) или "разначеные" (идушие из внешней сети в локальную)?

Если про "заначеные", то у них адрес назначения не меняется.
Если про "разначеные", то это обратные пакеты, и вообще говоря, мы их ожидаем.



"ipfw + natd - не работает исходящий активный FTP"
Отправлено Pahanivo , 10-Ноя-08 12:28 
>Простите, Вы про какие пакеты говорите? Про "заначеные" (прошедшие NAT из локальной
>сети) или "разначеные" (идушие из внешней сети в локальную)?
>
>Если про "заначеные", то у них адрес назначения не меняется.
>Если про "разначеные", то это обратные пакеты, и вообще говоря, мы их
>ожидаем.

Ожидаем мы их или нет - фильтровать можно на любой стадии ...