Главная страница \ Статьи \ FreeBSD \ Настройка FTP Proxy через IPNAT, IPFW

Настройка FTP Proxy через IPNAT, IPFW

Не так давно пришлось настроить шлюз на FreeBSD, поэтому не со всеми вопросами ещё разобрался. Долго мне не давался вопрос настройки FTP проксирования через IPNAT и IPFW. То ли я не смог найти нормальное описание, то ли не смог понять то, что нашёл. В общем всё встало на свои места, когда открылась следующая истина:

Итак, чтобы нормально заработал протокол FTP через IPNAT и IPFW, нужно определиться со следующим. Во время работы с FTP клиент подключается к порту 21 и работает с ним. Но когда нужно прочитать тот же листинг каталога, клиент отправляет специальный запрос на сервер по стандартному соединению на 21 порт с указанием порта, на который он, клиент, ждёт соединение. После этого сервер, со своего 20-го порта, соединяется с клиентом и передаёт данные. Это если в кратце.

При работе шлюза в режиме трансляции адресов есть одно большое "НО". Клиент уверен, что его адрес из внутренней сети, например, 192.168.0.5 и поэтому в запросе к серверу он указывает именно этот свой адрес. А сервер, естественно, не может через интернет подключиться к данному адресу - нет для него такого. Для того, чтобы согласовать данную работу, чтобы когда клиент отправляет свой внутренний адрес вместо него подставлялся внешний адрес сервера, существует специальная команда настройки IPNAT.

map ng0 192.168.0.0/24 -> 250.230.210.190/32 proxy port ftp ftp/tcp

Эта команда означает следующее: для интерфейса, который подключен к сети интернет определить прозрачный FTP прокси. При этом будет происходить следующее. Когда любой клиент из локальной сети (192.168.0.0 маска 255.255.255.0) по 21 порту отсылает FTP серверу команду, что ему необходим листинг директории с указанием своего локального адреса и порта, маршрутизатор на FreeBSD находит этот запрос и заменяет локальный адрес клиента на свой внешний (250.230.210.190 маска 255.255.255.255), который виден через интернет для удалённого FTP сервера. После этого удалённый сервер подключается со своего 20-го порта к внешнему адресу маршрутизатора, а тот перенаправляет это подключение соответствующему локальному клиенту, который изначально послал запрос.

Теперь остаётся только сказать маршрутизатору, что когда он принимает внешнее подключение с 20-го порта к локальному клиенту (на этом моменте IPNAT уже подставил вместо адресата-внешнего адреса внутренний адрес и порт), то он должен его принять. И соответственно пакет от внешнего адреса и 20-го порта к локальному клиенту надо выпустить через интерфейс, смотрящий в локальную сеть.

ipfw add allow tcp from any 20 to 192.168.0.0/24 in via ng0
ipfw add allow tcp from any 20 to 192.168.0.0/24 out via xl0

Постараюсь проиллюстрировать:

FTP Proxy на IPNAT

Вопросы? Предложения?

Powered by Elise