У меня есть следующая конфигурация:
Клиент FTP (public_IP1) => Интернет => Брандмауэр (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
). Как изменить его?
Ваш 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
Существует два решения:
Как уже упоминалось, @andrii-kupchanko можно изменить конфигурацию ftp-сервера. Это изменение заставляет сервер посылать внешний IP (Public_IP2
) клиенту как IP для пассивного обратного соединения. Недостатком является необходимость переадресации пассивного соединения обратно на резидентный FTP-сервер частной подсети (через iptables) и статически связывающие порты, используемые пассивными соединениями
Вам нужно всего два модуля nf_conntrack_ftp
и nf_nat_ftp
. Из-за отсутствия второго модуля пассивное соединение с сервером за шлюзом не работало.