PF+FTP на двух интерфейсах

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Dmitriy_K
сержант
Сообщения: 200
Зарегистрирован: 2009-04-07 6:22:33
Откуда: г.Королёв

PF+FTP на двух интерфейсах

Непрочитанное сообщение Dmitriy_K » 2016-07-14 14:54:13

Просьба, по возможности, помочь с таким траблом.
Есть сервак в локалке с двумя интерфейсами в две подсети. На нём необходимо создать jails, которые выведены в эти разные подсети (по их IP).
Ограничения на взаимодействие между сетями нет, просто IP для jail соответствуют этим двум подсетям.
Я встал в тупик на проблеме обеспечения корректной работы FTP в этих jail (REVERSE ftp-proxy). Перепробовал всё, но без толку. :st:
Всё нормально работает в пределах взаимодействий по 21 порту (командный режим). Как только идёт переключение в пассивный режим для передачи данных (например, команда ls), возникает очень длительный затык. Всё отрабатывает, но только через несколько минут.
Разруливаю всё через файрволл PF (FreeBSD 10.3). Все руководства перечитал и перепробовал, хотя они не предусматривают такой случай жизни.
http://dant.net.ru/calomel/ftp_proxy.html
http://www.openbsd.org/faq/pf/ftp.html#server
https://home.nuug.no/~peter/pf/en/ftpproblem.html

Для тестовых целей я упростил схему до одного интерфейса и одной jail. Тестирую FTP из подсети где jail.
Сейчас использую такую конфигурацию PF (в последних экспериментах открыл порты больше 1023, хотя это ничего не изменило):

Код: Выделить всё

# ftp-proxy -R 10.48.41.81 -P 21
# Пробовал использовать рекомендованное тегирование пакетов, но оно не помогает.
# Расширенное логирование ftp-proxy тоже ничего не даёт.

iface_2="vlan0"

set skip on { lo0, lo1, lo2 }
scrub in all

nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"
rdr pass on $iface_2 proto tcp from any to 10.48.41.81 port 21 -> 127.0.0.1 port 8021

anchor "ftp-proxy/*"
pass in quick log on $iface_2 inet proto tcp from any to 127.0.0.1 port 8021
# Было рекомендовано здесь: http://dant.net.ru/calomel/ftp_proxy.html  Не помогает.

pass in quick log on $iface_2 inet proto tcp from any to 10.48.41.81 port 21
pass in quick log on $iface_2 proto tcp from any to 10.48.41.81 port > 1023

pass out quick all
block drop in all


В правилах файрволла это ображается так:

Код: Выделить всё

@1 nat-anchor "/*" all
@2 rdr-anchor "/*" all
@3 rdr pass on vlan0 inet proto tcp from <int_net:0> to 10.48.41.81 port = ftp -> 127.0.0.1 port 8021
………………………
@32 anchor "/*" all
@33 pass in log quick on vlan0 inet proto tcp from <int_net:0> to 10.48.41.81 port = ftp flags S/SA keep state
@34 pass in log quick on vlan0 inet proto tcp from any to 10.48.41.81 port > 1023 flags S/SA keep state
@35 pass in log quick on vlan0 inet proto tcp from any to 127.0.0.1 port = ftp-proxy flags S/SA keep state
@36 pass out quick all flags S/SA keep state
@37 block drop in all


Я прилагаю дамп пакетов в момент подачи команды ls:

Код: Выделить всё

13:21:13.090836 00:50:56:a8:0c:9b > 3c:a8:2a:0a:4d:7d, ethertype IPv4 (0x0800), length 74: 10.48.41.197.63670 > 10.48.41.81.21: Flags [P.], seq 487664651:487664659, ack 1176357923, win 1040, options [nop,nop,TS val 488596182 ecr 3070076677], length 8

13:21:13.091037 3c:a8:2a:0a:4d:7d > 00:50:56:a8:0c:9b, ethertype IPv4 (0x0800), length 89: 10.48.41.81.21 > 10.48.41.197.63670: Flags [P.], seq 1:24, ack 8, win 1040, options [nop,nop,TS val 3070102204 ecr 488596182], length 23

13:21:13.092517 00:50:56:a8:0c:9b > 3c:a8:2a:0a:4d:7d, ethertype IPv4 (0x0800), length 72: 10.48.41.197.63670 > 10.48.41.81.21: Flags [P.], seq 8:14, ack 24, win 1040, options [nop,nop,TS val 488596182 ecr 3070102204], length 6

13:21:13.092952 3c:a8:2a:0a:4d:7d > 00:50:56:a8:0c:9b, ethertype IPv4 (0x0800), length 114: 10.48.41.81.21 > 10.48.41.197.63670: Flags [P.], seq 24:72, ack 14, win 1040, options [nop,nop,TS val 3070102206 ecr 488596182], length 48

13:21:13.094127 00:50:56:a8:0c:9b > 3c:a8:2a:0a:4d:7d, ethertype IPv4 (0x0800), length 74: 10.48.41.197.63691 > 10.48.41.81.56265: Flags [SEW], seq 2262204441, win 65535, options [mss 1460,nop,wscale 6,sackOK,TS val 488596182 ecr 0], length 0

13:21:13.094168 3c:a8:2a:0a:4d:7d > 00:50:56:a8:0c:9b, ethertype IPv4 (0x0800), length 74: 10.48.41.81.56265 > 10.48.41.197.63691: Flags [S.E], seq 839468741, ack 2262204442, win 65535, options [mss 1460,nop,wscale 6,sackOK,TS val 1193070092 ecr 488596182], length 0

13:21:13.095635 00:50:56:a8:0c:9b > 3c:a8:2a:0a:4d:7d, ethertype IPv4 (0x0800), length 66: 10.48.41.197.63691 > 10.48.41.81.56265: Flags [.], ack 1, win 1040, options [nop,nop,TS val 488596182 ecr 1193070092], length 0

13:21:13.095662 00:50:56:a8:0c:9b > 3c:a8:2a:0a:4d:7d, ethertype IPv4 (0x0800), length 72: 10.48.41.197.63670 > 10.48.41.81.21: Flags [P.], seq 14:20, ack 72, win 1040, options [nop,nop,TS val 488596182 ecr 3070102206], length 6

13:21:13.095760 3c:a8:2a:0a:4d:7d > 00:50:56:a8:0c:9b, ethertype IPv4 (0x0800), length 66: 10.48.41.81.56265 > 10.48.41.197.63691: Flags [F.], seq 1, ack 1, win 1023, options [nop,nop,TS val 1193070094 ecr 488596182], length 0

13:21:13.096725 00:50:56:a8:0c:9b > 3c:a8:2a:0a:4d:7d, ethertype IPv4 (0x0800), length 66: 10.48.41.197.63691 > 10.48.41.81.56265: Flags [.], ack 2, win 1040, options [nop,nop,TS val 488596182 ecr 1193070094], length 0

13:21:13.106163 3c:a8:2a:0a:4d:7d > 00:50:56:a8:0c:9b, ethertype IPv4 (0x0800), length 66: 10.48.41.81.21 > 10.48.41.197.63670: Flags [.], ack 20, win 1040, options [nop,nop,TS val 3070102219 ecr 488596182], length 0

^C
11 packets captured

Вроде бы ничего не блокируется, но не работает. :(
Пробовал ftpsesame, тоже ничего не меняет.

Dmitriy_K
сержант
Сообщения: 200
Зарегистрирован: 2009-04-07 6:22:33
Откуда: г.Королёв

PF+FTP на двух интерфейсах

Непрочитанное сообщение Dmitriy_K » 2016-07-15 20:33:01

Я всё-таки нашёл способ сделать всё через ftpsesame. :smile:
Оказалась, что во FreeBSD 10.3 необходимо явно указывать диапазон портов для пассивного режима FTP.
В предыдущих версиях FreeBSD работало без этого. :pardon:
Возможно использовать два варианта правил, но мне больше нравится первый вариант.

Код: Выделить всё

iface_1 = "bge0"
iface_2 = "vlan0"
jail_1 = "10.48.33.63"
jail_2 = "10.48.41.81"
set skip on { lo0 lo1 lo2 }

anchor "ftpsesame/*" tag FTPROXY
pass in quick proto tcp from <int_net> to { $jail_1, $jail_2} port 21 tagged FTPROXY
pass in quick proto tcp from <int_net> to { $jail_1, $jail_2} port > 1023 tagged FTPROXY
 
..............................
@3 anchor "/*" all tag FTPROXY
@4 pass in quick inet proto tcp from <int_net:0> to 10.48.33.63 port = ftp flags S/SA keep state tagged FTPROXY
@5 pass in quick inet proto tcp from <int_net:0> to 10.48.33.63 port > 1023 flags S/SA keep state tagged FTPROXY
@6 pass in quick inet proto tcp from <int_net:0> to 10.48.41.81 port = ftp flags S/SA keep state tagged FTPROXY
@7 pass in quick inet proto tcp from <int_net:0> to 10.48.41.81 port > 1023 flags S/SA keep state tagged FTPROXY
@8 pass out quick all flags S/SA keep state
@9 block drop in all


----------------------------------------------------------------
anchor "ftpsesame/*" on $iface_1 tag FTPROXY_1
pass in quick on $iface_1 proto tcp from <int_net> to $jail_1 port 21 tagged FTPROXY_1
pass in quick on $iface_1 proto tcp from <int_net> to $jail_1 port > 1023 tagged FTPROXY_1
 
anchor "ftpsesame/*" on $iface_2 tag FTPROXY_2
pass in quick on $iface_2 proto tcp from <int_net> to $jail_2 port 21 tagged FTPROXY_2
pass in quick on $iface_2 proto tcp from <int_net> to $jail_2 port > 1023 tagged FTPROXY_2
 
..............................
@3 anchor "/*" on bge0 all tag FTPROXY_1
@4 pass in quick on bge0 inet proto tcp from <int_net:0> to 10.48.33.63 port = ftp flags S/SA keep state tagged FTPROXY_1
@5 pass in quick on bge0 inet proto tcp from <int_net:0> to 10.48.33.63 port > 1023 flags S/SA keep state tagged FTPROXY_1
@6 anchor "/*" on vlan0 all tag FTPROXY_2
@7 pass in quick on vlan0 inet proto tcp from <int_net:0> to 10.48.41.81 port = ftp flags S/SA keep state tagged FTPROXY_2
@8 pass in quick on vlan0 inet proto tcp from <int_net:0> to 10.48.41.81 port > 1023 flags S/SA keep state tagged FTPROXY_2
@9 pass out quick all flags S/SA keep state
@10 block drop in all


Отправлено спустя 25 минут 24 секунды:
Я не смог сделать всё подобным образом с помощью "ftp-proxy".
Буду признателен, если кто-то сможет подсказать такое решение.
Вообще, это оказалась большая засада на пути прогресса. :crazy:

Код: Выделить всё

# ftp-proxy -T FTPROXY

nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"
rdr pass on $iface_1 proto tcp from any to $jail_1 port 21 tag FTPROXY -> 127.0.0.1 port 8021
rdr pass on $iface_2 proto tcp from any to $jail_2 port 21 tag FTPROXY -> 127.0.0.1 port 8021

anchor "ftp-proxy/*"
pass in quick proto tcp from <int_net> to { $jail_1, $jail_2} port 21 tagged FTPROXY
pass in quick proto tcp from <int_net> to { $jail_1, $jail_2} port > 1023 tagged FTPROXY


..............................
@3 anchor "/*" all
@4 pass in quick inet proto tcp from <int_net:0> to 10.48.33.63 port = ftp flags S/SA keep state tagged FTPROXY
@5 pass in quick inet proto tcp from <int_net:0> to 10.48.33.63 port > 1023 flags S/SA keep state tagged FTPROXY
@6 pass in quick inet proto tcp from <int_net:0> to 10.48.41.81 port = ftp flags S/SA keep state tagged FTPROXY
@7 pass in quick inet proto tcp from <int_net:0> to 10.48.41.81 port > 1023 flags S/SA keep state tagged FTPROXY
@8 pass out quick all flags S/SA keep state
@9 block drop in all

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 34908
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

PF+FTP на двух интерфейсах

Непрочитанное сообщение Alex Keda » 2016-09-14 7:13:04

Сдается мне, для начала стоило сменить ftp клиент
Убей их всех! Бог потом рассортирует...


Вернуться в «Networks»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя