我在嵌入 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
基本上较新的内核(> = 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
(但也请阅读有关此的博客以获取长期解决方案)。也许您没有设置所有规则,或者您只是没有使用任何防火墙?