FTP 相关连接与 iptables 一起工作需要哪些内核模块?

FTP 相关连接与 iptables 一起工作需要哪些内核模块?

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 规则)

相关内容