Доброй ночи. Вразумите меня по поводу такой задачи.
Пусть имеетсся шлюз FreeBSD 6 с двумя сетевыми картами и используется IPFW в связке с NATD. Пусть мы пишем простые правила, преследующие только учебную цель и направленные только на прохождение FTP траффика (активный FTP). Вот эти правила (lnc1 - внутренняя сеть,IP 10.10.0.2; lnc0 - внешняя,IP 192.168.124.2):00002 allow log ip from any to any via lnc1
00003 allow ip from any to any via lo0
00100 divert 8668 ip from any to any in via lnc0
00101 check-state
00120 skipto 500 udp from any to any dst-port 53 out via lnc0 keep-state
#правило для управляющего соединения FTP
00125 skipto 500 tcp from any to any dst-port 21 out via lnc0 setup keep-state
# Логика следующего правила верна, ибо клиент подключился к ftp:21, далее пользователь
# вводит команду, например ls (dir), клиент выдал команду PORT A,B,C,D,E,F. Сервер FTP
# выполняет подключение к клиенту со своего порта 20 на порт E*256+F клиента. Keep-state
# запомнит правило в обоих направлениях, так что подключения клиента с портом (E*256+F)
# на порт сервера 20 будут самим собой разумеющимся явлением.
00310 allow tcp from any 20 to any in via lnc0 keep-state
00450 deny log ip from any to any
00500 divert 8668 ip from any to any out via lnc0
00510 allow ip from any to any
65535 allow ip from any to any
Подключение клиента к FTP серверу без проблем, однако затык начинается при попытке, например, выполнить команду dir. Идет временная пауза, затем сброс соединения. Имею полный доступ к FTP серверу, шлюзу и клиенту в локальной сети за шлюзом. На всех троих установил по снифферу. Анализ траффика как на стороне клиента, так и на стороне сервера FTP:
0) ....
1) клиент выдал команду PORT.
2) сервер подключается со своего порта 20 к порту, указанному клиентом. Фаерволл траффик не заблокировал, клиент принял пакет от сервера FTP.
На шлюзе создались временные правила: (FTP Server) 192.168.124.1 20 <-> 10.10.0.3 1739 (Client)
3) Клиент получил SYN пакет от FTP сервера (192.168.124.1 20 -> 10.10.0.3 1739 успешно)
4) Клиент отвечает на SYN пакет сервера своим SYN и ACK: 10.10.0.3 1739 -> 192.168.124.1 20, сервер FTP получил пакет
5) Сервер отвечает клиенту со своего порта 20, однако на стороне клиента вижу, что пакет пришел с порта 21 сервера и на порт, который использовался при управляющим соединении(!).
Очевидно какая-то ошибка в правилах на шлюзе.
Объясните пож в чем косяк.