Я установил vsftpd и настроил его. Когда я пытаюсь подключиться к ftp-серверу с помощью Transmit, ему удается подключиться, но он зависает в листинге "/"
Затем я получаю сообщение: Не удалось получить список файлов для «/». Истекло время контрольного соединения.
Это как-то связано с моими iptables? Мои правила перечислены ниже:
*filter
# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
# Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allows all outbound traffic
# You can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT
# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
# Allows SSH connections
#
# THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE
#
-A INPUT -p tcp -m state --state NEW --dport 30000 -j ACCEPT
# Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
# log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
# Reject all other inbound - default deny unless explicitly allowed policy
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT
Конфигурация вашего сервера iptables не является (напрямую) проблемой. Скорее всего, подключение к серверу для передачи данных FTP заблокировано для доступа к вашему клиентскому компьютеру. По умолчанию FTP использует так называемый «активный» режим, при котором сервер фактически пытается открыть соединение для передачи данных обратно клиенту. Потребительские маршрутизаторы NAT обычно блокируют это, что приводит к указанному вами таймауту подключения.
Настройте свой FTP-клиент на использование «пассивного» режима, и он должен работать. Если нет, проверьте, что nf_conntrack_ftp
модуль ядра (старые ядра называют его ip_conntrack_ftp
) загружается на сервер:
sudo lsmod | grep conntrack_ftp
Если приведенная выше команда ничего не возвращает, значит, модуль не загружен, и вам необходимо загрузить его следующим образом:
sudo modprobe nf_conntrack_ftp
Кроме того, вы захотите убедиться, что модуль загружается во время загрузки, поместив nf_conntrack_ftp
в /etc/modules
.
В nf_conntrack_ftp
Модуль ядра отслеживает состояние FTP-соединений на сервере. Это позволит "пассивному" режиму подключения с вашего клиентского компьютера быть принятым правилом состояния RELATED в вашей цепочке INPUT.
Во-первых, убедитесь, что vsftpd привязан к уникальным портам как для активного, так и для пассивного режима:
ftp_data_port=20
listen_port=21
pasv_min_port=64000
pasv_max_port=64321
Теперь измените свои iptables, чтобы убедиться, что эти порты могут проходить через правила, и вы должны быть настроены. По умолчанию пассивные порты случайны; Установив указанное выше и исправив iptables, вы решите «проблему двойного брандмауэра», чтобы клиенты могли работать откуда угодно.
Я не занимаюсь iptables, но из набора правил, который вы показываете, ясно как день, что вам нужно узнать немного больше о том, как работает FTP.
FTP - это «странный» сервис, поскольку у него есть порт управления и порт данных. Недостаточно открыть только порт 21, это только порт управления. Порты данных зависят от того, используете ли вы активную или пассивную передачу по ftp.
Я не знаю, как работает iptables, но вам нужно улучшить набор правил, чтобы он также мог принимать трафик через порт 20 для ftp-данных (если вы хотите использовать стандартные передачи портов ftp)
В противном случае вам необходимо настроить фильтр пакетов для работы с пассивной передачей данных и указать своему клиенту также использовать эту форму связи / передачи данных.
Вы найдете этот сайт полезным: http://www.mdjnet.dk/ftp.html
Без правила на выходе для ESTABLISHED, RELATED он не позволит порту 20 ftp-data возвращать вам данные.
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -m conntrack --ctstate NEW -j ACCEPT