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

Не удается открыть порт ftp через firewalld

Я пытаюсь открыть порт ftp в общедоступной зоне, и firewall-cmd выходит с очень непонятным ответом. Вывод команды:

firewall-cmd --zone=public --add-service=ftp
Error: COMMAND_FAILED

ОС: CentOS Linux версии 7.3.1611 (Core)


Обновление исходного вопроса с более подробной информацией.

Выход journalctl:

~ firewall-cmd --zone=public --add-service=ftp
Error: COMMAND_FAILED
~ journalctl -xf
Mar 06 00:46:42 hostname firewalld[3496]: ERROR: COMMAND_FAILED

вывод отладки:

~ firewalld --nofork --debug=10
<...>
2017-03-06 00:49:57 DEBUG1: zone.addService('public', 'ftp', 0)
2017-03-06 00:49:57 DEBUG4: <class 'firewall.core.fw_transaction.FirewallZoneTransaction'>.execute(True)
2017-03-06 00:49:57 DEBUG4: <class 'firewall.core.fw_transaction.FirewallZoneTransaction'>.prepare(True, ...)
2017-03-06 00:49:57 DEBUG4: <class 'firewall.core.fw_transaction.FirewallZoneTransaction'>.prepare(True, ...)
2017-03-06 00:49:57 DEBUG4: <class 'firewall.core.fw_transaction.FirewallZoneTransaction'>.pre()
2017-03-06 00:49:57 DEBUG2: <class 'firewall.core.ipXtables.ip4tables'>: /usr/sbin/iptables-restore /run/firewalld/temp.tptEtP: 89
       1: *filter
       2: -A IN_public_allow -p tcp --dport 21 -m conntrack --ctstate NEW -j ACCEPT
       3: COMMIT
2017-03-06 00:49:57 DEBUG2: <class 'firewall.core.ipXtables.ip6tables'>: /usr/sbin/ip6tables-restore /run/firewalld/temp.CYsjiA: 89
       1: *filter
       2: -A IN_public_allow -p tcp --dport 21 -m conntrack --ctstate NEW -j ACCEPT
       3: COMMIT
2017-03-06 00:49:57 DEBUG2: <class 'firewall.core.modules.modules'>: /sbin/modprobe nf_conntrack_ftp
2017-03-06 00:49:57 DEBUG2: <class 'firewall.core.ipXtables.ip4tables'>: /usr/sbin/iptables-restore /run/firewalld/temp.1dBrUZ: 89
       1: *filter
       2: -D IN_public_allow -p tcp --dport 21 -m conntrack --ctstate NEW -j ACCEPT
       3: COMMIT
2017-03-06 00:49:57 DEBUG2: <class 'firewall.core.ipXtables.ip6tables'>: /usr/sbin/ip6tables-restore /run/firewalld/temp.vbUyZC: 89
       1: *filter
       2: -D IN_public_allow -p tcp --dport 21 -m conntrack --ctstate NEW -j ACCEPT
       3: COMMIT
2017-03-06 00:49:57 ERROR: COMMAND_FAILED

Еще одно обновление: если я сделаю:

~ iptables -A IN_public_allow -p tcp --dport 21 -m conntrack --ctstate NEW -j ACCEPT

служба ftp работает. Однако хотелось бы управлять всем через firewalld. Так что мне интересно, это сбой firewalld или ошибка в конфигурации.

Та же проблема, но --add-port у меня сработал:

# firewall-cmd --zone=public --add-port=21/tcp

Это решает проблему гостя LXC с хостом, который его поддерживает. Поддерживает ли ваш LXC это?

Хост должен иметь поддержку modprobe nf_conntrack_ftp lsmod показывает nf_conntrack_ftp? если да, добавьте nf_conntrack_ftp в / etc / modules. Захватить вывод modinfo nf_conntrack_ftp для дальнейшего использования.

Поддерживается в вашем LXC? / sys / module / nf_conntrack_ftp существует? / proc / sys / net / netfilter / nf_conntrack_helper существует? mkdir -p /lib/modules/4.4.67-1-pve/kernel/net/netfilter/ замените 4.4.67-1-pve вашим хостом, я использую Proxmox с этим ядром. коснитесь всех этих файлов .ko с хоста, поместите вывод modinfo nf_conntrack_ftp в резервную копию файла nf_conntrack_ftp.ko. modinfo замените его этим сценарием

#!/bin/bash
cat /lib/modules/4.4.67-1-pve/kernel/net/netfilter/$1.ko

Замените путь тем, что вы создали ранее. Сделайте файл исполняемым. Вы хотите, чтобы modinfo nf_conntrack_ftp выводил на вашем хосте тот же результат, что и на вашем гостевом компьютере.

Затем нам нужно заменить modprobe следующим скриптом.

#!/bin/bash
exit 0

Сделайте его исполняемым. Поскольку это гость, у вас даже нет модулей для проверки.

Отлично. Теперь вы можете обмануть /usr/lib/python2.7/site-packages/firewall/functions.py, чтобы ваш гость мог делать что-то с помощью modinfo.

Вы также обманываете /usr/lib/python2.7/site-packages/firewall/core/modules.py заменой modprobe.

Опять же, я считаю, что это нормально, что modinfo и modprobe заменены этими поддельными скриптами, потому что гость в контейнере в любом случае не имеет доступа к модулям. Вот почему это не работает.

Я также думаю, что проект firewalld должен исправить это, поскольку это кажется непреднамеренной ошибкой.