Задача простая- расшарить ресурсы фтп из серой сети.
В принципе все просто- делаем редирект при помощи ipnat/pf nat/natd и идем дальше.
Быстро и просто - это natd- две строки в конфиге, но ресурсы... Посему пользуем PF nat.
# cat /etc/pf.conf
ext_if = " re0 " #и-фейс наружу
int_if = " fxp0 "#и-фейс внутрь
ext_if_IP = " 123.123.123.123 " #основной IP сервера
ext_if_IP2 = " 123.123.123.124 "#IP на который делаем редирект
allow_net = " 123.123.123.0/24 " #сеть из которой можно подключаться к нашим сервисам
web2server = " 172.17.16.15" #IP сервера в серой сети с сервисами для расшаривания
service = "{ http, https, ssh }" # сервисы для расшаривания
ftp2ports = "{ ftp, ftp-data }" # сервисы для расшаривания
ftp_ext_ports = "{ 30000:30500 }"# дополнительный диапазон портов разрешенный для ftprdr on $ext_if proto tcp from $allow_net to $ext_if_IP2 port $ftp2ports -> $web2server
rdr on $ext_if proto tcp from $allow_net to $ext_if_IP2 port $ftp_ext_ports -> $web2server
rdr on $ext_if proto tcp from $allow_net to $ext_if_IP2 port $service -> $web2server
pass in quick on $ext_if proto tcp from $allow_net to $ext_if_IP2 port $ftp2ports keep state
pass in quick on $ext_if proto tcp from $allow_net to $ext_if_IP2 port $ftp_ext_ports keep state
pass in quick on $ext_if proto tcp from $allow_net to $ext_if_IP2 port $service flags S/SA synproxy state
после запуска видим :
# pfctl -sa
TRANSLATION RULES:
rdr on re0 inet proto tcp from 123.123.123.0/24 to 123.123.123.124 port = ftp -> 172.17.16.15
rdr on re0 inet proto tcp from 123.123.123.0/24 to 123.123.123.124 port = ftp-data -> 172.17.16.15
rdr on re0 inet proto tcp from 123.123.123.0/24 to 123.123.123.124 port 30000:30500 -> 172.17.16.15
rdr on re0 inet proto tcp from 123.123.123.0/24 to 123.123.123.124 port = http -> 172.17.16.15
rdr on re0 inet proto tcp from 123.123.123.0/24 to 123.123.123.124 port = https -> 172.17.16.15
rdr on re0 inet proto tcp from 123.123.123.0/24 to 123.123.123.124 port = ssh -> 172.17.16.15
FILTER RULES:
pass in quick on re0 inet proto tcp from 123.123.123.0/24 to 123.123.123.124 port = ftp keep state
pass in quick on re0 inet proto tcp from 123.123.123.0/24 to 123.123.123.124 port = ftp-data keep state
pass in quick on re0 inet proto tcp from 123.123.123.0/24 to 123.123.123.124 port 30000:30500 keep state
pass in quick on re0 inet proto tcp from 123.123.123.0/24 to 123.123.123.124 port = http flags S/SA synproxy state
pass in quick on re0 inet proto tcp from 123.123.123.0/24 to 123.123.123.124 port = https flags S/SA synproxy state
pass in quick on re0 inet proto tcp from 123.123.123.0/24 to 123.123.123.124 port = ssh flags S/SA synproxy state
Все работает! Кроме всего разрешен доступ к ssh http и работает прекрасно.
Но добраться до ресурсов ftp никак- все попытки замерзают на стадии запроса листинга.
Допустим конектимся с удаленной машины 123.123.123.127, используя Minight Commander
# pfctl -sa
STATES:
self tcp 172.17.16.15:21 <-123.123.123.124:21 <- 123.123.123.127:52552 ESTABLISHED:ESTABLISHED
self tcp 172.17.16.15:21 <- 123.123.123.124:21 <- 123.123.123.127:52221 TIME_WAIT:TIME_WAIT
И так до таймаута...
Но в тоже время при попытке подключиться из шелла с той же машины все проходит нормально
# pfctl -sa
STATES:
self tcp 172.17.16.15:30431 <- 123.123.123.124:30431 <- 123.123.123.127:60293 FIN_WAIT_2:FIN_WAIT_2
self tcp 172.17.16.15:21 <- 123.123.123.124:21 <- 123.123.123.127:52221 ESTABLISHED:ESTABLISHED
листинг получен, файлы качаются
Аналогичная ситуация при подключении с любыйх виндовых клиентов... кроме браузера Опера- здесь все проходит на ура (листинг, скачка все работает), в то время когда CuteFTP отваливается по таймауту не дождавшись списка файлов.
На роутере и на фтп сервере стоит FreeBSD 5.4, сервер фтп- vsftpd: version 2.0.3 работает в пассивном режиме используя дополнительно дипазон портов 30000-30500. Внутри сети все работает на ура.
Где я не прав... ткните носом, а? ;(