iptables/netfilter:“nf_nat_ftp”在最新的 Linux 内核中无法正常工作

iptables/netfilter:“nf_nat_ftp”在最新的 Linux 内核中无法正常工作

我在嵌入 Ubuntu-16.04.02-LTE 的 Linux 内核 4.10-28-generic 中遇到以下问题。我的机器有两个以太网适配器,即以下几个:

enp0s3:198.168.56.2(内部网络)
enp0s8:172.22.181.41(外部网络)

在连接到enp0s3的内部网络中,有一个FTP服务器和一个telnet服务器,我想从通过enp0s8连接的外部网络访问。
要求启用 FTP 模式。

为了完成此任务,我使用以下 iptables 规则:

modprobe nf_conntrack_ftp  
modprobe nf_nat_ftp  
sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"  

## Masquerade settings
iptables -A POSTROUTING -t nat -o enp0s3 -j MASQUERADE
iptables -A POSTROUTING -t nat -o enp0s8 -j MASQUERADE  

## ftp rules
iptables -t nat -I PREROUTING  -p tcp -m tcp --dport 20         -i enp0s8 -j DNAT --to-destination 192.168.56.2:20 
iptables -t nat -I PREROUTING  -p tcp -m tcp --dport 21         -i enp0s8 -j DNAT --to-destination 192.168.56.2
iptables -t nat -I PREROUTING  -p tcp -m tcp --dport 1024:65535 -i enp0s8 -j DNAT --to-destination 192.168.56.2:1024-65535

## telnet rules
iptables -t nat -I PREROUTING -p tcp -m tcp --dport 23 -i enp0s8 -j DNAT --to-destination 192.168.56.2`

这些规则适用于具有 Linux 内核 2.6.32-38-generic 的 Ubuntu-10,但无法建立新内核的数据连接:当客户端发出 PORT 命令时,服务器会收到该服务器的 IP 地址。外部网络而不是内部网络。根据服务器端运行的“netstat”,似乎“nf_nat_ftp”模块工作得不好,即它没有将客户端IP地址(外部地址)替换为输入接口enp0s8(内部地址)之前的IP地址将命令转发到服务器。因此,服务器在尝试与外部 IP 地址建立连接(SYN 状态)时陷入困境。
FTP 在被动模式下工作以及 telnet 连接都没有问题。

您能给我一个解决这个问题的建议吗?这是回归还是我需要根据一些新要求更改我的 iptables 规则?

先感谢您!

最好的问候,斯特凡诺

答案1

我已经在 superuser.com 上回答了这个问题

基本上较新的内核(> = 4.7)正在弃用自动帮助程序模块的端口分配,转而采用显式规则。

获得旧行为的简短修复:

echo 1 > /proc/sys/net/netfilter/nf_conntrack_helper

更好的长期修复(需要更多工作但提供更好的控制):

有关更多信息,请参阅 iptables-extensions(8) 手册页中的 CT 目标描述。

另请阅读此博客的示例:

https://home.regit.org/netfilter-en/secure-use-of-helpers/

重要提示:您的许多 FTP 规则没有任何意义(您只需要第二条规则)。例如,没有这样的--dport 20。曾经。主动 FTP 使用来源端口 20,从不目的地端口 20。 nf_conntrack_ftp/nf_nat_ftp 已经处理了这一切。根本不要尝试 nat 相关连接,这是助手的工作。

如果您使用防火墙,则在防火墙规则(filter不是nat)中,您只需要通常的规则-m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT (但也请阅读有关此的博客以获取长期解决方案)。也许您没有设置所有规则,或者您只是没有使用任何防火墙?

相关内容