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

Проблема с FTP на веб-сервере Centos 6.6 с iptables

Я завершил настройку 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 просматривается по порядку.
  • Упрощенно: обработка iptables останавливается, когда пакет соответствует правилу, которое либо разрешает, либо запрещает доступ.
  • Вы можете настроить iptables как простой пакетный фильтр, где каждый пакет проверяется отдельно, или сохранный брандмауэр при учете информации о подключении.

Обычно самое первое правило в конфигурации межсетевого экрана с отслеживанием состояния - это правило, которое разрешает доступ пакетам из уже установленных соединений. Идея состоит в том, что для того, чтобы соединение было установлено в первую очередь, оно должно быть разрешено явным правилом далее, и повторение всех последующих проверок является пустой тратой усилий (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-ответ.