воскресенье, 19 февраля 2012 г.

Ftp за NAT проброс портов и настройка диапазона.

Стандартная задача - пробросить ftp за Nat. Небольшая сложность в том, что нужно кроме 21 порта пробросить диапазон дополнительных портов и настроить сам ftp на указаение данного диапозона и ip внешнего интерфейса.
К примеру, выделим для ftp порт 2100 и 10000-10100
Локальный ftp сервер работает на 192.168.122.100 порт 21.

Тогда настройки iptables для "шлюза":

iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 2100 -j DNAT --to-destination 192.168.122.100:21
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 10000:10100 -j DNAT --to-destination 192.168.122.100

И в самом ftp надо указать эти нюансы. В случае vsftpd это делается добавлением строк:

pasv_min_port=10000 ;Указываем используемые сервером порты, первый
pasv_max_port=10100 ;и последний
pasv_address=_внешний_ip_шлюза_

В первом приблежении можно считать настроенным.

9 комментариев:

  1. Не хочет получать список каталогов:

    Статус: Определение IP-адреса для xxx.xxx.xx
    Статус: Соединяюсь с xxx.xxx.xxx.xxx:2121...
    Статус: Соединение установлено, ожидание приглашения...
    Ответ: 220 (vsFTPd 2.3.2)
    Команда: USER administrator
    Ответ: 331 Please specify the password.
    Команда: PASS *
    Ответ: 230 Login successful.
    Команда: OPTS UTF8 ON
    Ответ: 200 Always in UTF8 mode.
    Статус: Соединение установлено
    Статус: Получение списка каталогов...
    Команда: PWD
    Ответ: 257 "/home/administrator"
    Команда: TYPE I
    Ответ: 200 Switching to Binary mode.
    Команда: PORT 192,168,77,101,200,166
    Ответ: 500 Illegal PORT command.
    Команда: PASV
    Ответ: 227 Entering Passive Mode (192,168,77,253,156,219).
    Статус: Сервер отправил пассивный ответ с неопределяемым адресом. Использую существующий адрес сервера.
    Команда: LIST
    Ошибка: The data connection could not be established: ECONNREFUSED - Connection refused by server
    Ошибка: Превышено время ожидания соединения
    Ошибка: Не удалось получить список каталогов

    Проброс портов такой:
    iptables -t nat -A PREROUTING -i eth1 -p tcp -m tcp --dport 40000:40500 -j DNAT --to-destination 192.168.77.253

    #1. Это правило подменяет IP приемника на внутренний IP:
    iptables -t nat -D PREROUTING -p tcp -d xxx.xxx.xxx.xxx --dport 2121 -j DNAT --to-destination 192.168.77.253:21
    iptables -t nat -D PREROUTING -p udp -d xxx.xxx.xxx.xxx --dport 2121 -j DNAT --to-destination 192.168.77.253:21
    #2. Это правило обратно подменяет IP отправителя на внешний:
    iptables -t nat -D POSTROUTING -p tcp --dst 192.168.77.253 --dport 21 -j SNAT --to-source xxx.xxx.xxx.xxx
    iptables -t nat -D POSTROUTING -p udp --dst 192.168.77.253 --dport 21 -j SNAT --to-source xxx.xxx.xxx.xxx
    #
    iptables -D FORWARD -i eth1 -p udp --dport 2121 -j ACCEPT
    iptables -D FORWARD -i eth1 -p tcp --dport 2121 -j ACCEPT

    ОтветитьУдалить
  2. По правилам для iptables не совсем понятно.
    iptables -D - это удаление правила из цепочки. -A - добавление.
    В ваших приведенных правилах - "-A" только в первом, затем везде идет -D, т.е. по сути удаление данных правил (если они конечно там были установлены раньше)

    ОтветитьУдалить
  3. Да, извиняюсь, за ошибку. Вот сейчас такие правила на сервере:

    iptables -t nat -A PREROUTING -p tcp -d 46.219.xxx.xxx --dport 1521 -j DNAT --to-destination 192.168.77.253:1520
    iptables -t nat -A PREROUTING -p tcp -d 46.219.xxx.xxx --dport 1521 -j DNAT --to-destination 192.168.77.253:1521
    iptables -t nat -A PREROUTING -p tcp -d 46.219.xxx.xxx --dport 40000:40500 -j DNAT --to-destination 192.168.77.253

    iptables -t nat -A POSTROUTING -p tcp --dst 192.168.77.253 -m tcp --dport 1520 -j SNAT --to-source 46.219.xxx.xxx:1521
    iptables -t nat -A POSTROUTING -p tcp --dst 192.168.77.253 -m tcp --dport 1521 -j SNAT --to-source 46.219.xxx.xxx:1521
    iptables -t nat -A POSTROUTING -p tcp --dst 192.168.77.253 -m tcp --dport 40000:40500 -j SNAT --to-source 46.219.xxx.xxx

    На FTP соответственно порты:
    1520, 1521, 40000:40500

    Все равно нет доступа.

    ОтветитьУдалить
    Ответы
    1. Этот комментарий был удален автором.

      Удалить
    2. если набирать внешний IP и порт 1521 из локальной сети, то заходит без проблем. То значит перенаправление работает, а если из Интернета заходить, то не хочет. Может быть дело в том, что нужно перезагружать сам сервер/сетевую карту после изменений IP tables?

      Удалить
    3. Порядок внесения правил в iptables важен. Перезагружать не надо, просто надо "обнулить" правила и внести по новой в нужном порядке - либо скриптом, либо iptables-restore.
      По правилам вроде криминала нет. Вообще полезно послушать пакеты на соответствующих интерфейсах и портах, к примеру

      tcpdump -n -i eth0 | grep 1520
      и т.п. Для отладки правил и т.п. - полезно. Может логинг ipables тоже использовать.

      Удалить
  4. спасибо большое за статью!!

    ОтветитьУдалить
  5. Спасибо!!! Пол дня потерял на попытки пробросить пока не нашел эту статью, а тут 5 минут и всё запустилось! Ещё раз СПАСИБО!!!

    ОтветитьУдалить