Задача простая- расшарить ресурсы фтп из серой сети.
В принципе все просто- делаем редирект при помощи 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 -> $web2serverpass 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.15FILTER 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. Внутри сети все работает на ура.
Где я не прав... ткните носом, а? ;(
Вывод tcpdump'a
# tcpdump -i re0 host 123.123.123.124
listening on re0, link-type EN10MB (Ethernet), capture size 96 bytes
12:49:53.271118 IP 123.123.123.127.49380 > 172.17.16.15.ftp: P 226644911:226644919(8) ack 4159887268 win 32942 <nop,nop,timestamp 8497417 22561448>
12:49:53.272219 IP 172.17.16.15.ftp > 123.123.123.127.49380: . ack 8 win 32940 <nop,nop,timestamp 22564884 8497417>
12:49:53.272243 IP 172.17.16.15.ftp > 123.123.123.127.49380: P 1:38(37) ack 8 win 32942 <nop,nop,timestamp 22564884 8497417>
12:49:53.273116 IP 123.123.123.127.49380 > 172.17.16.15.ftp: P 8:36(28) ack 38 win 32942 <nop,nop,timestamp 8497418 22564884>
12:49:53.274217 IP 172.17.16.15.ftp > 123.123.123.127.49380: . ack 36 win 32935 <nop,nop,timestamp 22564884 8497418>
12:49:53.274241 IP 172.17.16.15.ftp > 123.123.123.127.49380: P 38:89(51) ack 36 win 32942 <nop,nop,timestamp 22564884 8497418>
12:49:53.275117 IP 123.123.123.127.49380 > 172.17.16.15.ftp: P 36:46(10) ack 89 win 32942 <nop,nop,timestamp 8497418 22564884>
12:49:53.276216 IP 172.17.16.15.ftp > 123.123.123.127.49380: . ack 46 win 32939 <nop,nop,timestamp 22564884 8497418>
Все есть, а работать не работает редирет как надо.... или парадокс, или /dev/hand прямить надо срочно
>Вывод tcpdump'a
># tcpdump -i re0 host 123.123.123.124
>listening on re0, link-type EN10MB (Ethernet), capture size 96 bytes
>12:49:53.271118 IP 123.123.123.127.49380 > 172.17.16.15.ftp: P 226644911:226644919(8) ack 4159887268 win 32942 <nop,nop,timestamp 8497417 22561448>
>12:49:53.272219 IP 172.17.16.15.ftp > 123.123.123.127.49380: . ack 8 win 32940 <nop,nop,timestamp 22564884 8497417>
>12:49:53.272243 IP 172.17.16.15.ftp > 123.123.123.127.49380: P 1:38(37) ack 8 win 32942 <nop,nop,timestamp 22564884 8497417>
>12:49:53.273116 IP 123.123.123.127.49380 > 172.17.16.15.ftp: P 8:36(28) ack 38 win 32942 <nop,nop,timestamp 8497418 22564884>
>12:49:53.274217 IP 172.17.16.15.ftp > 123.123.123.127.49380: . ack 36 win 32935 <nop,nop,timestamp 22564884 8497418>
>12:49:53.274241 IP 172.17.16.15.ftp > 123.123.123.127.49380: P 38:89(51) ack 36 win 32942 <nop,nop,timestamp 22564884 8497418>
>12:49:53.275117 IP 123.123.123.127.49380 > 172.17.16.15.ftp: P 36:46(10) ack 89 win 32942 <nop,nop,timestamp 8497418 22564884>
>12:49:53.276216 IP 172.17.16.15.ftp > 123.123.123.127.49380: . ack 46 win 32939 <nop,nop,timestamp 22564884 8497418>
>Все есть, а работать не работает редирет как надо.... или парадокс, или
>/dev/hand прямить надо срочно
также не удалось настроить редирект..... все молчат, либо говорят что руки кривые.... ИМХО что-то не так в настройках или с pf, иначе просто нет вариантов.
Правда у меня случай другой совсем...... Прошу прощение за флуд, цель поста сказать что редирект в pf реализован через анус (говорю так потомучто сам лоб разбил об rdr правила).
Еще раз sorry.
>также не удалось настроить редирект..... все молчат, либо говорят что руки кривые....
>ИМХО что-то не так в настройках или с pf, иначе просто
>нет вариантов.
>Правда у меня случай другой совсем...... Прошу прощение за флуд, цель поста
>сказать что редирект в pf реализован через анус (говорю так потомучто
>сам лоб разбил об rdr правила).
>Еще раз sorry.Нет, не согласен с редиректом у PF весьма не плохо и диапазон портов поставить без проблем и поддержка keep state в rdr правиле по умолчанию... и т.п. Если честно, больший гемморой вызвало настройка того же редиректа в ipnat'e . Тут дело именно в методах поведения пассивного и активного ftp как класса. Собственно и приходится иметь секс именно с этим, все остальное редиректится как по маслу.
Lavr, ,батенька помогите, не дайте... разбить голову об очевидное ;)
>>также не удалось настроить редирект..... все молчат, либо говорят что руки кривые....
>>ИМХО что-то не так в настройках или с pf, иначе просто
>>нет вариантов.
>>Правда у меня случай другой совсем...... Прошу прощение за флуд, цель поста
>>сказать что редирект в pf реализован через анус (говорю так потомучто
>>сам лоб разбил об rdr правила).
>>Еще раз sorry.
>
>Нет, не согласен с редиректом у PF весьма не плохо и диапазон
>портов поставить без проблем и поддержка keep state в
>rdr правиле по умолчанию... и т.п. Если честно, больший гемморой вызвало
>настройка того же редиректа в ipnat'e . Тут дело именно в
>методах поведения пассивного и активного ftp как класса. Собственно и приходится
>иметь секс именно с этим, все остальное редиректится как по маслу.
>
>
>Lavr, ,батенька помогите, не дайте... разбить голову об очевидное ;)вот пример, который мусолится уже долгое время....
Нужно чтобы пакеты приходящие на внешний адрес по порту 3389 перекидывались на внутренний адрес с портом 3389....пишу rdr on $ext_if proto tcp from any to $ext_if port 3389 -> $local_serv port 3389
неработает... в чём грабли??? добавление слова pass ничего не дало....
правильно или нет..... ??? пока работает с rinetd , но хоцца чтобы с pf.
>вот пример, который мусолится уже долгое время....
>Нужно чтобы пакеты приходящие на внешний адрес по порту 3389 перекидывались на
>внутренний адрес с портом 3389....
>
>пишу rdr on $ext_if proto tcp from any to $ext_if port 3389 -> $local_serv port 3389
>
>неработает... в чём грабли??? добавление слова pass ничего не дало....
>
>правильно или нет..... ??? пока работает с rinetd , но хоцца чтобы
>с pf.Вот гадство... действительно не работает... нонсенс!
Спецы PF где вы ? уже двое разбивают лоб об очевидное, но невероятное....
>>вот пример, который мусолится уже долгое время....
>>Нужно чтобы пакеты приходящие на внешний адрес по порту 3389 перекидывались на
>>внутренний адрес с портом 3389....
>>
>>пишу rdr on $ext_if proto tcp from any to $ext_if port 3389 -> $local_serv port 3389
>>
>>неработает... в чём грабли??? добавление слова pass ничего не дало....
>>
>>правильно или нет..... ??? пока работает с rinetd , но хоцца чтобы
>>с pf.
>
>Вот гадство... действительно не работает... нонсенс!
>Спецы PF где вы ? уже двое разбивают лоб об очевидное,
>но невероятное....А что вы пробовали сделать?
Я немного начал сомневться в своих действиях...., но сяс немного отлегло.
Тема мусолилась на форуме и раньше, однако дело не пошло дальше просто советов которые НЕ РАБОТАЮТ.
Предлагаю всем разобраться с данной проблемой, ведь случай далеко не эктраординарный.
>вот пример, который мусолится уже долгое время....
>Нужно чтобы пакеты приходящие на внешний адрес по порту 3389 перекидывались на
>внутренний адрес с портом 3389....
>
>пишу rdr on $ext_if proto tcp from any to $ext_if port 3389 -> $local_serv port 3389
>
>неработает... в чём грабли??? добавление слова pass ничего не дало....
>
>правильно или нет..... ??? пока работает с rinetd , но хоцца чтобы
>с pf.
Не понятно что скрывается за $ext_if и $local_serv.
У меня работаетrdr on rl1 proto tcp from any to w.x.y.z port 3389 -> 192.168.0.5
$pfctl -sn
rdr on rl1 inet proto tcp from any to w.x.y.z port = rdp -> 192.168.0.5Естественно, что отрабатываться будут тольоко те пакеты которые из внешней сети, вошедшие в rl1.
>>вот пример, который мусолится уже долгое время....
>>Нужно чтобы пакеты приходящие на внешний адрес по порту 3389 перекидывались на
>>внутренний адрес с портом 3389....
>>
>>пишу rdr on $ext_if proto tcp from any to $ext_if port 3389 -> $local_serv port 3389
>>
>>неработает... в чём грабли??? добавление слова pass ничего не дало....
>>
>>правильно или нет..... ??? пока работает с rinetd , но хоцца чтобы
>>с pf.
>
>
>Не понятно что скрывается за $ext_if и $local_serv.
>У меня работает
>
>rdr on rl1 proto tcp from any to w.x.y.z port 3389 -> 192.168.0.5
>
>$pfctl -sn
>rdr on rl1 inet proto tcp from any to w.x.y.z port = rdp -> 192.168.0.5
>
>Естественно, что отрабатываться будут тольоко те пакеты которые из внешней сети, вошедшие
>в rl1.$ext_if= внешний интерфейс $local_serv=внутренний сервер....
НЕРАБОТАЕТ....
>>
>>Не понятно что скрывается за $ext_if и $local_serv.
>>У меня работает
>>
>>rdr on rl1 proto tcp from any to w.x.y.z port 3389 -> 192.168.0.5
>>Естественно, что отрабатываться будут тольоко те пакеты которые из внешней сети, вошедшие
>>в rl1.
>
>$ext_if= внешний интерфейс $local_serv=внутренний сервер....
>
>НЕРАБОТАЕТ....tcpdump на $ext_if и на внутреннем_if.
Идет ли замена dst_ip в заголовке?
Доходят ли пакеты до $local_serv?
Уходят или SYN/ACK ответы для поднятия TCP?
tcpdump на $ext_if и на внутреннем_if на наличие ответов от $local_serv.
За тем же ли адресом происходит nat внутреннего ресурса, что и на $ext_if?
Проходит ли установка TCP соединения?
>Задача простая- расшарить ресурсы фтп из серой сети.
>В принципе все просто- делаем редирект при помощи ipnat/pf nat/natd и идем
>дальше.При пассивном ftp за dnat'ом, во время соединения сервер "просит" клиента соединить с ним по заданному ip и порту. Если ничего специально не настраивать то сервер выдаст клиенту свой реальный (в вашем случае серый) адрес и порт. Клиент естественно долго пытается ткнуться снаружи по серому адресу и отваливается по таймауту. Для того чтоб обмануть, в proftpd используется директва MasqueradeAddress в которой указывается IP к которому должен лезть клиент при пассивном соединении. Как это делается в vsftpd я не знаю
>При пассивном ftp за dnat'ом, во время соединения сервер "просит" клиента соединить
>с ним по заданному ip и порту. Если ничего специально не
>настраивать то сервер выдаст клиенту свой реальный (в вашем случае серый)
>адрес и порт. Клиент естественно долго пытается ткнуться снаружи по серому
>адресу и отваливается по таймауту. Для того чтоб обмануть, в proftpd
>используется директва MasqueradeAddress в которой указывается IP к которому должен лезть
>клиент при пассивном соединении. Как это делается в vsftpd я не
>знаюв vsftpd за это отвечает строчка pasv_address. И это действительно работает ! Спасибо, вот уж решение действительно лежало на самом видном месте
Теперь осталось разобраться с доступом по rdp и можно радоваться жизни ;)