Я завершил настройку iptables, но вход в систему / подключение по FTP не работает. NAT / брандмауэр на уровне оборудования / маршрутизатора перенаправляется правильно.
Я добавил запись для ftp, но она не работает.
В. Почему здесь не разрешены FTP-соединения?
Моя текущая конфигурация iptables:
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:http state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:https state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp spt:ssh state ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp spt:https state ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp spt:http state ESTABLISHED
ACCEPT icmp -- anywhere anywhere icmp echo-request
ACCEPT icmp -- anywhere anywhere icmp echo-reply
ACCEPT all -- anywhere anywhere
ACCEPT udp -- anywhere anywhere udp spt:domain
ACCEPT tcp -- anywhere anywhere tcp dpt:http limit: avg 25/min burst 100
ACCEPT tcp -- anywhere cpc15-bmly9-2-0-custx.2-3.cable.virginm.net tcp spts:1024:65535 dpt:ftp state NEW,ESTABLISHED
ACCEPT tcp -- anywhere cpc15-bmly9-2-0-custx.2-3.cable.virginm.net tcp spts:1024:65535 dpts:1024:65535 state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere cpc15-bmly9-2-0-custx.2-3.cable.virginm.net tcp spts:1024:65535 dpt:ftp-data state ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:29292 state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp state NEW,ESTABLISHED
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp spt:ssh state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp spt:http state ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp spt:https state ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:https state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:http state NEW,ESTABLISHED
ACCEPT icmp -- anywhere anywhere icmp echo-reply
ACCEPT icmp -- anywhere anywhere icmp echo-request
ACCEPT all -- anywhere anywhere
ACCEPT udp -- anywhere anywhere udp dpt:domain
ACCEPT tcp -- cpc15-bmly9-2-0-custx.2-3.cable.virginm.net anywhere tcp spt:ftp dpts:1024:65535 state ESTABLISHED
ACCEPT tcp -- cpc15-bmly9-2-0-custx.2-3.cable.virginm.net anywhere tcp spts:1024:65535 dpts:1024:65535 state ESTABLISHED
ACCEPT tcp -- cpc15-bmly9-2-0-custx.2-3.cable.virginm.net anywhere tcp spt:ftp-data dpts:1024:65535 state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp spt:29292 state ESTABLISHED
ОБНОВИТЬ обновлено, но все еще не разрешает соединение
[root@host ~]# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:http state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:https state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp spt:ssh state ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp spt:https state ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp spt:http state ESTABLISHED
ACCEPT icmp -- anywhere anywhere icmp echo-request
ACCEPT icmp -- anywhere anywhere icmp echo-reply
ACCEPT all -- anywhere anywhere
ACCEPT udp -- anywhere anywhere udp spt:domain
ACCEPT tcp -- anywhere anywhere tcp dpt:http limit: avg 25/min burst 100
ACCEPT tcp -- anywhere cpc15-bmly9-2-0-custx.2-3.cable.virginm.net tcp spts:1024:65535 dpt:ftp state NEW,ESTABLISHED
ACCEPT tcp -- anywhere cpc15-bmly9-2-0-custx.2-3.cable.virginm.net tcp spts:1024:65535 dpts:1024:65535 state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere cpc15-bmly9-2-0-custx.2-3.cable.virginm.net tcp spts:1024:65535 dpt:ftp-data state ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:29292 state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp ctstate ESTABLISHED /* Allow ftp connections on port 21 */
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp-data ctstate RELATED,ESTABLISHED /* Allow ftp connections on port 20 */
ACCEPT tcp -- anywhere anywhere tcp spts:1024:65535 dpts:1024:65535 ctstate ESTABLISHED /* Allow passive inbound connections */
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp spt:ssh state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp spt:http state ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp spt:https state ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:https state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:http state NEW,ESTABLISHED
ACCEPT icmp -- anywhere anywhere icmp echo-reply
ACCEPT icmp -- anywhere anywhere icmp echo-request
ACCEPT all -- anywhere anywhere
ACCEPT udp -- anywhere anywhere udp dpt:domain
ACCEPT tcp -- cpc15-bmly9-2-0-custx.2-3.cable.virginm.net anywhere tcp spt:ftp dpts:1024:65535 state ESTABLISHED
ACCEPT tcp -- cpc15-bmly9-2-0-custx.2-3.cable.virginm.net anywhere tcp spts:1024:65535 dpts:1024:65535 state ESTABLISHED
ACCEPT tcp -- cpc15-bmly9-2-0-custx.2-3.cable.virginm.net anywhere tcp spt:ftp-data dpts:1024:65535 state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp spt:29292 state ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp ctstate NEW,ESTABLISHED /* Allow ftp connections on port 21 */
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp-data ctstate ESTABLISHED /* Allow ftp connections on port 20 */
ACCEPT tcp -- anywhere anywhere tcp spts:1024:65535 dpts:1024:65535 ctstate RELATED,ESTABLISHED /* Allow passive inbound connections */
Ряд общих вещей:
Обычно самое первое правило в конфигурации межсетевого экрана с отслеживанием состояния - это правило, которое разрешает доступ пакетам из уже установленных соединений. Идея состоит в том, что для того, чтобы соединение было установлено в первую очередь, оно должно быть разрешено явным правилом далее, и повторение всех последующих проверок является пустой тратой усилий (iptables -L -v -n
отобразит следующее):
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 2789K 866M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
Синтаксис для его создания (еще одно распространенное обозначение для отображения конфигураций iptables):
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Хотя обычно сама команда iptables опускается.
В вашей конфигурации отсутствует это первое правило.
Последующие правила должны разрешать только НОВЫЕ соединения для протоколов, которые вы хотите разрешить, а не одновременно НОВЫЕ и ПРИНЯТЫЕ, как вы были:
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh state NEW,ESTABLISHED
но для разрешения SSH достаточно:
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
Ваша проблема с FTP: FTP - необычный протокол в том смысле, что два используются соединения. Первое - это управляющее соединение, по умолчанию FTP-сервер будет прослушивать TCP-порт 21 для этого.
Управляющее соединение используется для аутентификации и выдачи команд. Фактическая передача файлов и такие вещи, как вывод списка каталогов, переходят второе TCP-соединение, DATA-соединение. При активном FTP это соединение DATA будет инициировано с сервера fTP через TCP-порт 20 и подключаться к FTP-клиенту. Активный FTP не слишком хорошо работает с пользователями, находящимися за брандмауэрами, а шлюзы NAT в основном вышли из употребления.
Большинство FTP-серверов вместо этого поддерживают пассивный FTP. При пассивном FTP сервер FTP открывает прослушиватель соединения DATA на втором порту, к которому затем может подключиться клиент FTP. Проблема брандмауэра в том, что порт DATA может быть любым доступным непривилегированным портом в диапазоне 1024-65536.
В брандмауэре без сохранения состояния это обычно решается путем ограничения количества пассивных портов, которые FTP-сервер может назначить, а затем явного открытия этих портов. т.е. ограничить пассивный диапазон портами 21000-21050 и:
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --match multiport --dports 21000:21050 -j ACCEPT
В брандмауэре с отслеживанием состояния вам не нужно явно открывать порт DATA, вспомогательный модуль netfilter распознает динамический порт, который назначается, и динамически откроет этот порт для правильного клиента, пометив соединение DATA как RELATED
после чего он будет соответствовать этому общему первому правилу:
iptables -I INPUT -p tcp -m state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
Для этого требуется правильная модуль ядра загружается, в случае FTP вручную путем запуска, например insmod nf_conntrack_ftp
, который можно сделать постоянным, отредактировав /etc/sysconfig/iptables-config
и добавляем вспомогательный модуль nf_conntrack_ftp
в переменную IPTABLES_MODULES.
Примечание: Модуль отслеживания FTP-соединения завершится ошибкой, если FTP используется с SSL, поскольку управляющее соединение будет зашифровано, и nf_conntrack_ftp больше не сможет читать PASV-ответ.