Хорошо, поэтому я использую простой ftp-клиент linux для загрузки / выгрузки файлов с ftp-серверов. У меня есть брандмауэр iptables, который блокирует большинство портов, и мне нужно закрыть брандмауэр, чтобы он работал. Хотя порт 21 открыт, я думаю, это объясняет, почему работает загрузка, а не загрузка. Следующая команда отлично работает с включенным брандмауэром:
wget ftp://user:pass@server.com
У меня просто возникают проблемы, когда я на самом деле подключаюсь к серверу и пытаюсь "положить" / закачать файл на сервер. Вот пример вывода netstat порта, который использовался в то время, но он всегда отличается.
netstat -a | grep ServerIP
tcp 0 197520 myIP.:59622 ServerIP:ftp-data ESTABLISHED
tcp 0 0 myIP.:40341 ServerIP:ftp ESTABLISHED
Оба порта в диапазоне myIP заблокированы, и я не могу угадать, какие порты мне нужно открыть. Поиск в Google тоже не работает. Во-вторых, если я попробую что-то подобное на iptables, у меня появится ошибка:
-A INPUT -p tcp --match multiport --dport 40000:40500 -j ACCEPT
iptables-restore v1.4.8: too many ports specified
Во-вторых, зачем мне открывать порты, если у меня есть следующая строка до того, как порты были заблокированы в файле конфигурации:
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Возможная причина в том, что вы используете активный FTP.
FTP имеет активный и пассивный режимы.
Активный:
В активном режиме FTP клиент подключается со случайного непривилегированного порта (N> 1023) к командному порту FTP-сервера, порту 21. Затем клиент начинает прослушивать порт N + 1 и отправляет FTP-команду PORT N + 1 FTP. сервер. Затем сервер снова подключится к указанному клиентом порту данных из своего локального порта данных, то есть порта 20.
Пассивный:
Чтобы решить проблему инициации сервером соединения с клиентом, был разработан другой метод для FTP-соединений. Это было известно как пассивный режим, или PASV, после команды, использованной клиентом, чтобы сообщить серверу, что он находится в пассивном режиме. В пассивном режиме FTP клиент инициирует оба подключения к серверу, решая проблему брандмауэра, фильтрующего входящее соединение порта данных с клиентом с сервера. При открытии FTP-соединения клиент открывает два случайных непривилегированных порта локально (N> 1023 и N + 1). Первый порт связывается с сервером через порт 21, но вместо того, чтобы затем выдать команду PORT и разрешить серверу подключиться обратно к его порту данных, клиент выдает команду PASV. В результате сервер затем открывает случайный непривилегированный порт (P> 1023) и отправляет P обратно клиенту в ответ на команду PASV. Затем клиент инициирует соединение от порта N + 1 к порту P на сервере для передачи данных.
- Активный FTP против пассивного FTP, окончательное объяснение
Это означает, что у вас есть два варианта:
Я бы выбрал вариант 1
Для выполнения варианта 2 из Ответ Кристофера Перрина, вы можете использовать recent
расширение соответствия. Он добавляет исходный IP-адрес в список, который вы можете проверить в последующих правилах. Для этих правил я предположил eth0
это ваш WAN-интерфейс.
iptables -A FORWARD -o eth0 -p tcp --dport 21 -m state --state ESTABLISHED -m recent --name trustedftp --set
iptables -A FORWARD -i eth0 -p tcp --sport 20 -m recent --name trustedftp --seconds 30 --rcheck -j ACCEPT
Я не тестировал это, но думаю, что это должно сработать.