Мой текущий сценарий включает в себя разрешение различных правил, но мне нужно, чтобы ftp был доступен из любой точки мира. ОС — Cent 5, и я использую VSFTPD. Я не могу понять правильный синтаксис. Все остальные правила работают правильно.
## Filter all previous rules
*filter
## Loopback address
-A INPUT -i lo -j ACCEPT
## Established inbound rule
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
## Management ports
-A INPUT -s x.x.x.x/24 -p icmp -m icmp --icmp-type any -j ACCEPT
-A INPUT -s x.x.x.x/23 -p icmp -m icmp --icmp-type any -j ACCEPT
-A INPUT -s x.x.x.x/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -s x.x.x.x/23 -p icmp -m icmp --icmp-type any -j ACCEPT
-A INPUT -s x.x.x.x/23 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -i lo -j ACCEPT
## Allow NRPE port (Nagios)
-A INPUT -s x.x.x.x -p tcp -m state --state NEW -m tcp --dport 5666 -j ACCEPT
-A INPUT -s x.x.x.x -p tcp -m state --state NEW -m tcp --dport 5666 -j ACCEPT
##Allow FTP
## Default rules
:INPUT DROP [0:0]
:FORWARD DROP
:OUTPUT ACCEPT [0:0]
COMMIT
Ниже приведены правила, которые я опробовал.
##Allow FTP
-A INPUT --dport 21 any -j ACCEPT
-A INPUT --dport 20 any -j ACCEPT
-A INPUT -p tcp --dport 21 -j ACCEPT
-A INPUT -p tcp --dport 20 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 20 -j ACCEPT
-A INPUT -p tcp -s 0/0 -d 0/0 --destination-port 20 -j ACCEPT
-A INPUT -p tcp -s 0/0 -d 0/0 --destination-port 21 -j ACCEPT
-A INPUT -s 0.0.0.0/0 -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
-A INPUT -s 0.0.0.0/0 -p tcp -m state --state NEW -m tcp --dport 20 -j ACCEPT
решение1
Вот документ, к которому я отсылаю людей, чтобы они могли следовать протоколу FTP:http://slacsite.com/other/ftp.html
- Для работы FTP в активном режиме необходимо разрешить входящие соединения на порт TCP 21 и исходящие соединения с порта 20.
- Для работы FTP в пассивном режиме необходимо разрешить входящие соединения на порт TCP 21 и входящие соединения на случайно сгенерированный порт на сервере (что требует использования модуля conntrack в netfilter).
У вас нет ничего re: your OUTPUT chain в вашем посте, поэтому я включу это здесь тоже. Если ваша OUTPUT chain — default-drop, то это имеет значение.
Добавьте эти правила в конфигурацию iptables:
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
Для поддержки пассивного режима FTP вам необходимо загрузить модуль ip_conntrack_ftp при загрузке. Раскомментируйте и измените строку IPTABLES_MODULES в файле /etc/sysconfig/iptables-config следующим образом:
IPTABLES_MODULES="ip_conntrack_ftp"
Сохраните конфигурацию iptables и перезапустите iptables.
service iptables save
service iptables restart
Чтобы полностью исключить проблему с VSFTPD, остановите VSFTPD, убедитесь, что он не прослушивает порт 21 с помощью «netstat -a», а затем выполните:
nc -l 21
Это запустит netcat, прослушивающий порт 21, и будет передавать ввод в вашу оболочку. С другого хоста, TELNET на порт 21 вашего сервера и проверьте, что вы получаете TCP-соединение и что вы видите вывод в оболочке, когда вводите TELNET-соединение.
Наконец, снова запустите VSFTPD, убедитесь, что он прослушивает порт 21, и попробуйте подключиться снова. Если подключение к netcat сработало, то ваши правила iptables в порядке. Если подключение к VSFTPD не работает после того, как netcat заработал, то что-то не так с вашей конфигурацией VSFTPD.
решение2
Попробуйте это правило. Примечание: $EXTIP
это ваш внешний IP-адрес для FTP-сервера.
-A INPUT -i $EXTIP -m state --state NEW,ESTABLISHED,RELATED -p TCP -s 0.0.0.0 -d $EXTIP --dport 21 -j ACCEPT
решение3
В моем случае не хватало модуля ядра ip_conntrack_ftp. Его нужно загрузить. Так что можете попробовать это:
modprobe ip_conntrack_ftp
А также добавьте ip_conntrack_ftp в /etc/modules, чтобы все заработало после перезапуска.