Я использую vsftpd на сервере Debian за другим брандмауэром Debian. Наттинг правильный, и я могу подключиться к ftp серверу извне. Однако, когда клиент выдает PASV
, ftp-сервер возвращает свой внутренний IP-адрес (192.168.0.19).
У меня нет pasv_address
директива установлена внутри файла conf так, чтобы «адрес был взят из входящего подключенного сокета» (скопирован из руководство). Мне кажется, когда внешний клиент выдает PASV
, должен быть возвращен внешний IP-адрес брандмауэра, а при подключении внутреннего клиента должен быть возвращен IP-адрес внутреннего FTP-сервера.
Когда я установил pasv_address
директиве внешнего IP-адреса брандмауэра, все работает внешне, но затем он ломается внутри. Когда я либо устанавливаю его на внутренний IP-адрес, либо закомментирую pasv_address
внутренние клиенты работают, а внешние - нет.
У кого-нибудь есть понимание?
Изменить 1: Вот файл журнала на стороне сервера:
Thu Sep 7 10:36:15 2017 [pid 9093] FTP command: Client "x.x.x.x", "USER yyy"
Thu Sep 7 10:36:15 2017 [pid 9093] [yyy] FTP response: Client "x.x.x.x", "331 Please specify the password."
Thu Sep 7 10:36:15 2017 [pid 9093] [yyy] FTP command: Client "x.x.x.x", "PASS <password>"
Thu Sep 7 10:36:15 2017 [pid 9092] [yyy] OK LOGIN: Client "x.x.x.x"
Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP response: Client "x.x.x.x", "230 Login successful."
Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP command: Client "x.x.x.x", "OPTS utf8 on"
Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP response: Client "x.x.x.x", "200 Always in UTF8 mode."
Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP command: Client "x.x.x.x", "PWD"
Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP response: Client "x.x.x.x", "257 "/""
Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP command: Client "x.x.x.x", "CWD /DownloadProduction/"
Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP response: Client "x.x.x.x", "250 Directory successfully changed."
Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP command: Client "x.x.x.x", "TYPE A"
Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP response: Client "x.x.x.x", "200 Switching to ASCII mode."
Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP command: Client "x.x.x.x", "PASV"
Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP response: Client "x.x.x.x", "227 Entering Passive Mode (192,168,0,19,192,27)."
Изменить 2: Я смог заставить это работать с помощью ProFTPD. Вот случай сбоя сервера для этого: Сервер ProFTPd за межсетевым экраном возвращает внутренний IP-адрес для подключений WAN и LAN
Чтобы заставить это работать с помощью vsfptd, я сделал несколько вещей:
Это заставляет существующую службу обрабатывать только внешние соединения, а новая служба vsftpd-internal обрабатывает только внутренние соединения.
Изменить, чтобы отобразить параметры конфигурации (запрашивается в комментариях)
Внешний (/etc/vsftpd.conf):
listen_port=2121
pasv_address=x.x.x.x # External IP - port forwarded from FW to this machine
Внутренний (/etc/vsftpd-internal.conf):
# nothing special in this one, mostly default
FTP очень часто вызывает головные уборы, потому что он не выполняет передачу данных по уже установленному управляющему соединению, но требует открытия дополнительного соединения для передачи данных. Первая версия FTP требовала, чтобы сервер открывал это соединение с клиентом - иногда NAT был неизвестен. Чтобы это работало с NAT, был изобретен PASV, чтобы клиент мог открыть это второе соединение. Лучше, но, как вы сами убедились, не оптимально.
На ум приходят три варианта:
Если вы находитесь за внешним брандмауэром, входящее соединение фактически исходит от внешнего брандмауэра. Таким образом, IP-адрес сервера - это его внутренний IP-адрес. Вы описываете «правильное» поведение. FTP-сервер не знает (и не может знать) о внешнем IP-адресе брандмауэра.
Что вы можете сделать, так это назначить FTP-серверу два IP-адреса. Один для внешний использовать и один для внутренний использовать. И настройте FTP-сервер так, чтобы он возвращал внешний IP-адрес брандмауэра для подключений на внешний Айпи адрес; и внутренний IP-адрес для подключений на внутренний Айпи адрес.
Хотя я не уверен, позволяет ли vsftpd такую конфигурацию. ProFTPD делает.