Назад | Перейти на главную страницу

Настройка Linux iptables для подключений в режиме FTP PASV

Я делал множество поисков и каждый раз узнавал немного, но не нашел решения своей проблемы.

У меня есть настройка vsftpd, с использованием SSL / TLS я получил его, как мне нужно, но я не могу применить правила iptable ниже. В первую очередь не работает режим PASV. С участием iptables -F все работает как положено. Как только я применяю приведенные ниже правила, он подключается, но клиент (CuteFTP) пытается перейти в режим PASV, время ожидания истекает.

мои правила таблиц IP следующие:

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# ssh
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

# web
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

# ssl
#-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

# subversion
-A INPUT -p tcp -m tcp --dport 3690 -j ACCEPT

# ftp + active ftp + pasv ftp
-A INPUT -p tcp --dport 21 -m state --state ESTABLISHED,NEW -j ACCEPT
-A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
-A INPUT -p tcp --dport 50000:60000 -m state --state RELATED,ESTABLISHED -j ACCEPT

# mysql
-A INPUT -p tcp -m tcp --dport 3306 -s 67.181.185.126 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -s 98.224.120.34 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -s 174.143.169.230 -j ACCEPT

# ping
-A INPUT -p icmp -j ACCEPT


-A INPUT -i lo -j ACCEPT
-A INPUT -j DROP
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
COMMIT

Я загружаю их с помощью (в целях тестирования):

iptables-restore < /etc/iptables.test.rules

Для справки, я запускаю Ubuntu 10.04 LTS, а вот некоторые результаты, которые я получаю с помощью следующих команд:

lsmod

Module                  Size  Used by
xt_conntrack            2303  1
xt_helper               1155  0
nf_nat_ftp              1751  0
nf_nat                 12653  1 nf_nat_ftp
ipv6                  220702  16
xt_state                1215  4
nf_conntrack_ftp        5108  1 nf_nat_ftp
nf_conntrack_ipv4       9505  7 nf_nat
nf_conntrack           43972  7 xt_conntrack,xt_helper,nf_nat_ftp,nf_nat,xt_state,nf_conntrack_ftp,nf_conntrack_ipv4
iptable_filter          2218  1
ip_tables              13794  1 iptable_filter
nf_defrag_ipv4          1051  1 nf_conntrack_ipv4
dm_mirror              11338  0
dm_region_hash          6224  1 dm_mirror
dm_log                  7341  2 dm_mirror,dm_region_hash
dm_snapshot            23956  0
dm_mod                 50258  3 dm_mirror,dm_log,dm_snapshot

locate _ftp

/lib/modules/2.6.33.5-rscloud/kernel/net/ipv4/netfilter/nf_nat_ftp.ko
/lib/modules/2.6.33.5-rscloud/kernel/net/netfilter/ipvs/ip_vs_ftp.ko
/lib/modules/2.6.33.5-rscloud/kernel/net/netfilter/nf_conntrack_ftp.ko
/lib/security/pam_ftp.so
/usr/share/man/man8/pam_ftp.8.gz

Кроме того, мои пассивные порты vsftpd.conf настроены следующим образом:

pasv_min_port=50000
pasv_max_port=60000

Я также пробовал загрузить модуль с помощью modprobe ip_conntrack_ftp но это, похоже, не работает. Из вышеприведенного вывода кажется, что модуля даже нет в системе или он заменен nf_conntrack_ftp ... nf_ модули ...

ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ

Думаю, я нашел свой ответ: http://www.shorewall.net/FTP.html#Conntrack

Поскольку вспомогательные модули ftp должны читать и изменять команды, отправляемые по командному каналу, они не будут работать, если командный канал зашифрован с использованием TLS / SSL.

Кроме того, еще одним интересным фактом, который вызывал некоторую путаницу, было то, почему у меня nf_conntrack против ip_conntrack.

Если вы используете ядро ​​2.6.19 или более раннюю версию, имена модулей - ip_nat_ftp и ip_conntrack_ftp.

тест с uname -r (получает версию ядра)

Я протестировал вышеуказанное, отключив TLS / SSL, и PASV отлично работает с RELATED,ESTABLISHED. Однако основная причина, по которой я хочу использовать TLS / SSL, заключается в том, чтобы имя пользователя / пароли не отправлялись в открытом виде.

Это неверно:

-A INPUT -p tcp --dport 50000:60000 -m state --state RELATED,ESTABLISHED -j ACCEPT

Так должно быть :

-A INPUT -p tcp --dport 50000:60000 -m state --state RELATED,ESTABLISHED,NEW -j ACCEPT

Если вы загружаете модуль ядра ip_conntrack_ftp это должно помочь решить вашу проблему. Вы можете загрузить модуль с помощью следующей команды

modprobe ip_conntrack_ftp

Определите пассивный порт, который обычно больше 1023.

-A INPUT -p tcp --dport 50000:60000 -m state --state RELATED,ESTABLISHED -j ACCEPT

Измените эту строку, указав диапазон портов, используемых в пассивном режиме.