Я настраиваю FTP-сервер с шифрованием TLS / SSL (FTPS, не SFTP). Сервер будет помещен в DMZ. Это означает, что он имеет три интерфейса: один для подключений из сети компании, а другой (статически преобразованный через NAT к действующему в Интернете IP-адресу на пограничном маршрутизаторе) для подключений из Интернета.
Небольшой ASCII-арт для иллюстрации установки:
|<----------------------------- DMZ --------------------->|
Inet <---------> | border router | <-------> FTPS server <-------> Internal network
1.2.3.4 | 1.2.3.4 <NAT> 10.0.1.1 | 10.0.1.1 10.0.2.2
Активный режим работает хорошо. Но для пассивного режима FTP-сервер должен отправить свой IP-адрес клиенту. Первая проблема в том, что сервер не знает своего внешний адрес (1.2.3.4), только DMZ-внешний (10.0.1.1). Программное обеспечение FTP-сервера позволяет установить этот адрес (ForceIpAddress в pure-ftpd), но в этом случае пользователи из внутренней сети не смогут работать с этим FTP (потому что он отправит им 1.2.3.4 вместо 10.0.2.2)
Итак, вопрос в том, есть ли способ выбрать IP-адрес для отправки в соответствии с IP-адресом клиента или интерфейсом, на который пришел запрос? Обратите внимание, что если клиент подключается из Интернета, он должен получить действующий в Интернете IP-адрес (1.2.3.4) вместо внутреннего сервера (10.0.1.1). Я использую pure-ftpd, но могу изменить на что угодно.
Я использовал два FTP-сервера на разных портах и перенаправил запрос с помощью iptables, но, как мне кажется, это не лучший способ. Некоторые FTP-клиенты (например, WinSCP) также позволяют принудительно указать адрес сервера, но не все из них.
Есть варианты выхода из ситуации?
Протокол FTP был создан, когда все машины в Интернете имели глобальную адресацию с уникальным IP-адресом. Единственная причина, по которой FTP за устройствами NAT работает сейчас, заключается в том, что устройство NAT фильтрует трафик FTP и исправляет открытый текст командного соединения FTP (порт 21), чтобы разрешить использование немаршрутизируемых адресов.
Поскольку вы обертываете свой FTP-трафик в SSL, устройство NAT не может прочитать этот трафик и, следовательно, не может исправить ваш несовместимый IP-адрес. Ваше решение будет поступать с вашего FTP-сервера.
pure-ftpd имеет флаг -N, который устанавливает «активный» режим, означающий, что FTP-сервер инициирует передачу данных (порт 20) и откажется от «пассивного» режима. Пассивный режим - это то, что FTP-клиенты за NAT должны использовать для загрузки с общедоступного FTP-сайта, с которым вы больше не будете совместимы.
proftpd (лучший из возможных FTP-серверов, с которыми я потрудился поиграть) имеет хак конфигурации для решения этой проблемы. Вы можете добавить директиву MasqueradeAddress xxx.xxx.xxx.xxx в файл конфигурации, которая заставит proftpd сообщать всем клиентам, что MasqueradeAddress - это IP-адрес FTP-сервера. Убедитесь, что у вас есть порт 20 на этом адресе, перенаправленный через NAT на ваш FTP-сервер.
Согласно вашему примечанию: Директива «MasqueradeAddress» может использоваться в области действия директивы «VirtualHost», что позволяет вам предоставлять как внутренний, так и внешний доступ NAT.