我正在尝试在公共区域中打开 ftp 端口,防火墙命令以非常不具描述性的响应退出。命令输出为:
firewall-cmd --zone=public --add-service=ftp
Error: COMMAND_FAILED
操作系统:CentOS Linux 版本 7.3.1611(核心)
更新原始问题并添加更多细节。
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 服务正在运行。但是我想通过防火墙管理一切。所以我想知道这是否是防火墙故障或配置错误。
答案1
同样的问题,但是--add-port 对我有用:
# firewall-cmd --zone=public --add-port=21/tcp
答案2
这解决了 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 执行操作。
您还使用 modprobe 替换来欺骗 /usr/lib/python2.7/site-packages/firewall/core/modules.py。
再次,我觉得用这些假脚本替换 modinfo 和 modprobe 是可以的,因为容器中的客户机无论如何都无法访问模块。这个事实就是它不起作用的原因。
我还认为,firewalld 项目应该修复这个问题,因为它看起来像是一个无意的错误。