У меня следующая конфигурация:
FTP-клиент (public_IP1) => internet => Firewall (Public_IP2) => FTP-сервер (10.10.12.171
)
У меня следующие правила iptables на Firewall
:
DNAT tcp -- 0.0.0.0/0 Public_IP2 tcp dpt:21 to:10.10.12.171
MASQUERADE all -- 10.0.0.0/8 0.0.0.0/0
У меня также есть nf_conntrack_ftp
загружен в Firewall
nf_conntrack_ftp 13057 0
nf_conntrack 79944 6 nf_conntrack_ftp,nf_conntrack_ipv4,nf_nat,iptable_nat,vzcpt,vzrst
В активном режиме все работает отлично. В пассивном режиме у меня следующая ошибка (на клиенте):
ftp> passive
Passive mode on.
ftp> dir
227 Entering Passive Mode (10,10,12,171,86,26)
ftp: connect: No route to host
Я предполагаю, что клиент имеет тенденцию подключаться к моему частному IP (10.10.12.171
). Как это поменять?
Есть два решения:
Как упоминалось в @ andrii-kupchanko, вы можете изменить конфигурацию ftp-сервера. Это изменение заставляет сервер отправлять внешний IP-адрес (Public_IP2
) клиенту в качестве IP для пассивного обратного соединения. Недостатком является необходимость перенаправления пассивного соединения обратно на резидентный FTP-сервер частной подсети (через iptables) и статически привязанные порты, используемые пассивными соединениями.
Вам просто нужно два модуля nf_conntrack_ftp
и nf_nat_ftp
. Из-за отсутствия второго модуля пассивное подключение к серверу за шлюзом не работало.
Ваш ftp-сервер должен быть настроен, так как он находится за NAT. Вы не сказали, какое программное обеспечение ftp-сервера используете, поэтому я предоставлю пример требуемой директивы конфигурации для proFTPd:
# If your host was NATted, this option is useful in order to
# allow passive tranfers to work. You have to use your public
# address and opening the passive ports used on your firewall as well.
MasqueradeAddress Public_IP2