![FTP 相关连接与 iptables 一起工作需要哪些内核模块?](https://linux22.com/image/1541406/FTP%20%E7%9B%B8%E5%85%B3%E8%BF%9E%E6%8E%A5%E4%B8%8E%20iptables%20%E4%B8%80%E8%B5%B7%E5%B7%A5%E4%BD%9C%E9%9C%80%E8%A6%81%E5%93%AA%E4%BA%9B%E5%86%85%E6%A0%B8%E6%A8%A1%E5%9D%97%EF%BC%9F.png)
Gentoo
我正在运行内核的PC 上设置限制性防火墙4.8.17
。我想使用以下规则为传出连接启用 FTP PASSV 模式:
iptables -A OUTPUT -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate RELATED -j ACCEPT
PASSV FTP 在NEW
添加上述规则后运行良好,但对我的需求来说太宽松了。我的配置在另一台机器(使用较旧的内核)上也能正常工作。我比较了两个配置中的内核选项,但找不到缺少什么。那么,RELATED
连接需要哪些模块才能正常工作iptables
?
我的内核配置了以下选项:
host ~ # zcat /proc/config.gz | grep 'NETFILTER\|_XT_\|_NF_' | grep -v "^#"
CONFIG_NETFILTER=y
CONFIG_NETFILTER_ADVANCED=y
CONFIG_NETFILTER_INGRESS=y
CONFIG_NETFILTER_NETLINK=y
CONFIG_NF_CONNTRACK=y
CONFIG_NF_LOG_COMMON=m
CONFIG_NF_CONNTRACK_PROCFS=y
CONFIG_NF_CONNTRACK_EVENTS=y
CONFIG_NF_CONNTRACK_FTP=m
CONFIG_NF_CT_NETLINK=y
CONFIG_NETFILTER_XTABLES=y
CONFIG_NETFILTER_XT_TARGET_LOG=m
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
CONFIG_NETFILTER_XT_MATCH_HELPER=m
CONFIG_NETFILTER_XT_MATCH_SOCKET=m
CONFIG_NETFILTER_XT_MATCH_STATE=m
CONFIG_NF_DEFRAG_IPV4=y
CONFIG_NF_CONNTRACK_IPV4=y
CONFIG_NF_CONNTRACK_PROC_COMPAT=y
CONFIG_NF_LOG_IPV4=m
CONFIG_IP_NF_IPTABLES=y
CONFIG_IP_NF_FILTER=y
CONFIG_NF_LOG_IPV6=m
我已加载以下模块:
host ~ # lsmod
Module Size Used by
xt_state 1543 0
xt_helper 1619 0
nf_conntrack_ftp 7270 0
我的 iptables 如下所示:
host ~ # iptables -nvL --line-numbers
Chain INPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
2 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
3 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ctstate NEW
Chain FORWARD (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
2 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spts:1024:65535 dpts:1:1024 ctstate NEW
3 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
4 0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp spts:1024:65535 dpt:53 ctstate NEW
5 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spts:1024:65535 dpts:1024:65535 ctstate RELATED
6 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 255
答案1
从内核 4.7 开始(也适用于内核 4.8.17):
https://www.kernel.org/doc/Documentation/networking/nf_conntrack-sysctl.txt
nf_conntrack_helper - BOOLEAN 0 - disabled (default) not 0 - enabled Enable automatic conntrack helper assignment. If disabled it is required to set up iptables rules to assign helpers to connections. See the CT target description in the iptables-extensions(8) man page for further information.`
这样做:
echo 1 > /proc/sys/net/netfilter/nf_conntrack_helper
应该恢复到内核 4.7 之前的默认设置并使其正常工作。
现在,此博客中描述了新的(更安全的)方法: https://home.regit.org/netfilter-en/secure-use-of-helpers/
答案2
我已经使用了ip_conntrack_ftp
内核模块,但你的nf_conntrack_ftp
模块似乎是 nftable 版本。那么它可能没问题。
但是,要允许被动出站连接,您可以尝试:
iptables -A INPUT -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED -j ACCEPT
你还应该告诉 iptables 他必须首先跟踪 FTP 命令通道(非特权端口仅用于数据传输)
iptables -A INPUT -p tcp -m tcp --sport 21 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate ESTABLISHED,NEW -j ACCEPT
信用: 这里,与传入被动连接有关(即在服务器上添加了 iptables 规则)