Я думал об этом решении. Отправка пакета с выбранного порта (например, 1027) на порт 20 адреса сервера. Брандмауэр NAT разрешит входящий доступ с порта 20 на 1027. Затем компьютер отправит команду PORT на сервер, чтобы сообщить, что порт данных клиента 1027. Передача данных начнется.
Я не думаю, что вы можете сказать ftp.exe
использовать порт по вашему выбору. Он посылает в PORT
с портом по своему выбору. Вы (заявка) не отправляете сами.
На сервере FileZilla есть опция «Игнорировать не маршрутизируемые IP-адреса в команде PORT». Должен ли я включить ее? Это решит проблему?
Было бы полезно, если бы проблема заключалась в том, что клиент не знает свой внешний IP-адрес (то есть он посылает неверный IP-адрес в команде PORT
). На самом деле (10.10.1.239
- это локальный IP-адрес, которого сервер не может достичь), поэтому вам нужно включить эту опцию. Но вы утверждаете, что проблема также в брандмауэре. Таким образом, хотя опция помогает, она не решает все проблемы, которые у вас есть.
Очевидно, что самым простым решением было бы переконфигурировать ваш брандмауэр, чтобы разрешить активный режим. Это означает, чтобы открыть входящие порты в диапазоне передачи данных.
Смотрите мою статью Конфигурация сети для активного режима.
Вы можете ограничить правила только для IP-адреса сервера. Вы даже можете ограничить их только удаленным портом 20.
Единственная другая идея, которая у меня есть, - разработать поддельный клиент ftp.exe
который использует пассивный режим. Это не будет так сложно, если вы используете какую-нибудь клиентскую библиотеку FTP и ограничите функциональность клиента только тем, что приложение действительно использует.