1.问题环境
系统环境 | 物理机 |
网络环境 | 私有网络 |
硬件环境 | 处理器 | arm |
软件环境 | 操作系统版本 | V10-SP1-0518-arm |
内核版本 | 4.19.90-23.15.ky10.aarch64 |
2.问题描述
iptables转发端口访问ftp目录空白,同一个脚本在redhat7.8上正常
2023/2/27,iptables转发端口访问ftp目录空白,环境中ftp转发模块和ip_forward都开启了.
现场测试iptables转发端口,访问ftp不生效,无法telnet通,使用firewalld可以正常访问。
2.1.测试红帽7.8转发ftp
红帽7.8转发机配置如下所示,经测试可以转发ftp。
# 开启转发 echo 1 > /proc/sys/net/ipv4/ip_forward
# 清空iptables iptables -F iptables -X iptables -Z iptables -F -t nat iptables -X -t nat iptables -Z -t nat
# 加载模块 modprobe ip_conntrack_ftp port=21,55550 modprobe ip_nat_ftp
#用于将TCP流量的目标端口10021重定向到IP地址为203.40.64.2的主机上的端口21。其中,-t nat选项指定了iptables表为nat表,-A PREROUTING选项指定了规则应用于PREROUTING链,-p tcp选项指定了匹配TCP协议的流量,-d 203.3.105.3选项指定了匹配目标IP地址为203.3.105.3的流量,–dport 10021选项指定了匹配目标端口为10021的流量,-j DNAT选项指定了匹配的流量应该被重定向,–to-destination 203.40.64.2:21选项指定了重定向到的IP地址为203.40.64.2的主机上的端口21。 iptables -t nat -A PREROUTING -p tcp -d 203.3.105.3 --dport 20021 -j DNAT --to-destination 203.40.64.2:21
#用于将TCP流量源地址改为本机地址。其中,-t nat选项指定了iptables表为nat表,-A POSTROUTING选项指定了规则应用于POSTROUTING链,tcp选项指定了匹配TCP协议的流量,–destination 203.40.64.2选项指定了匹配目标IP地址为203.40.64.2的流量,-j MASQUERADE选项指定了匹配的流量源地址应该被改为本机地址。 iptables -t nat -A POSTROUTING tcp --destination 203.40.64.2 -j MASQUEREADE |
麒麟V10 SP1 不可行。
# 开启转发 echo 1 > /proc/sys/net/ipv4/ip_forward
# 清空iptables iptables -F iptables -X iptables -Z iptables -F -t nat iptables -X -t nat iptables -Z -t nat
# 加载模块 modprobe nf_conntrack_ftp modprobe nf_nat modprobe ip_tables
iptables -t nat -A PREROUTING -p tcp -d 203.3.110.29 --dport 10021 -j DNAT --to-destination 203.40.64.2:21
iptables -t nat -A POSTROUTING tcp --destination 203.40.64.2 -j MASQUEREADE |
3. 问题复现
3.1.测试机准备
测试服务器功能 | IP地址 |
vsftpd服务器 | 192.168.122.210 |
ftp转发机 | 192.168.122.117 |
ftp客户端 | 192.168.122.176 |
3.2. ftp服务器搭建
# 1、关闭和禁用防火墙 systemctl stop firewalld systemctl disable firewalld
# 2、安装vsftpd yum install vsftpd
# 3、配置vsftpd.conf vim /etc/vsftpd/vsftpd.conf
# 4、开启vsftpd systemctl start vsftpd systemctl enable vsftpd |
/etc/vsftpd/vsftpd.conf的配置如下所示
anonymous_enable=YES local_enable=YES write_enable=YES local_umask=022 anon_upload_enable=YES anon_mkdir_write_enable=YES dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=YES listen_ipv6=NO pam_service_name=vsftpd cmds_denied=
pasv_enable=YES pasv_min_port=30000 pasv_max_port=31000 |
3.3.ftp转发机配置
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F iptables -X iptables -Z iptables -F -t nat iptables -X -t nat iptables -Z -t nat
modprobe nf_conntrack_ftp modprobe nf_nat_ftp modprobe ip_tables
#用于Linux系统的iptables防火墙。第一个命令是将所有TCP协议的10021端口的流量重定向到192.168.122.210的21端口,即将流量从10021端口转发到192.168.122.210的21端口。 iptables -t nat -A PREROUTING -p tcp --dport 10021 -j DNAT --to-destination 192.168.122.210:21
# 将所有目标地址为192.168.122.210的TCP协议流量进行伪装,即将源地址改为防火墙的地址,以便返回流量时可以正确路由回来。 iptables -t nat -A POSTROUTING -p tcp --destination 192.168.122.210 -j MASQUERADE |
3.4. ftp客户端测试
lftp 192.168.122.117:10021去访问转发机,转发机由于配置了转发,会将相关的ftp包转发到ftp服务器上。
4.问题分析
4.1.抓包分析
4.1.1. 抓取ftp服务端的包
1、抓取ftp服务器上的包,192.168.122.176对192.168.122.117:10021的请求完全转化为了192.168.122.117:42908对192.168.122.210:21的请求了。
2、vsftp服务器(192.168.122.210:21)将ftp-data端口(30398)告诉给ftp客户端转发机(192.168.122.117:42908),ftp客户端转发机(192.168.122.117:42908)会将这个端口号给正真的ftp客户端(192.168.122.176)。
3、ftp客户端应该去连接vsftp服务器(192.168.122.210:30398),但是vsftp服务器没有收到ftp客户端的连接请求。
4.1.2.抓取ftp客户端的包
可见客户端有去连接ftp服务器提供的ftp-data端口,但是转发机没有转发。
4.1.3.根据抓包整理问题示意图
4.2.验证分析
不加载nf_conntrack_ftp和nf_nat_ftp 相关模块,添加一个端口的转发范围,对于客户端目的端口为30000:31000的包都进行转发,重定向到ftp服务器。
转发机的配置如下:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F iptables -X iptables -Z iptables -F -t nat iptables -X -t nat iptables -Z -t nat
#用于Linux系统的iptables防火墙。第一个命令是将所有TCP协议的10021端口的流量重定向到192.168.122.210的21端口,即将流量从10021端口转发到192.168.122.210的21端口。 iptables -t nat -A PREROUTING -p tcp --dport 10021 -j DNAT --to-destination 192.168.122.210:21
# 转发机上添加转发规则,已知被动端口范围是30000:31000,转发所有客户端目的端口在30000:31000的包,都重定向到192.168.122.210的30000:31000的端口中 iptables -t nat -A PREROUTING -p tcp --dport 30000:31000 -j DNAT --to-destination 192.168.122.210
# 将所有目标地址为192.168.122.210的TCP协议流量进行伪装,即将源地址改为防火墙的地址,以便返回流量时可以正确路由回来。 iptables -t nat -A POSTROUTING -p tcp --destination 192.168.122.210 -j MASQUERADE |
经验证可行,说明问题原因就是被动端口的连接,转发机没有转发导致,nf_conntrack_ftp和nf_nat_ftp没有生效导致。
4.3. 资料查询
经过资料查询需要sysctl -w net.netfilter.nf_conntrack_helper=1,nf_conntrack_ftp和nf_nat_ftp才会生效。
5.问题小结
执行sysctl -w net.netfilter.nf_conntrack_helper=1,就可以了。转发机的正确配置如下。
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F iptables -X iptables -Z iptables -F -t nat iptables -X -t nat iptables -Z -t nat
modprobe nf_conntrack_ftp modprobe nf_nat_ftp modprobe ip_tables
sysctl -w net.netfilter.nf_conntrack_helper=1
#用于Linux系统的iptables防火墙。第一个命令是将所有TCP协议的10021端口的流量重定向到192.168.122.210的21端口,即将流量从10021端口转发到192.168.122.210的21端口。 iptables -t nat -A PREROUTING -p tcp --dport 10021 -j DNAT --to-destination 192.168.122.210:21
# 将所有目标地址为192.168.122.210的TCP协议流量进行伪装,即将源地址改为防火墙的地址,以便返回流量时可以正确路由回来。 iptables -t nat -A POSTROUTING -p tcp --destination 192.168.122.210 -j MASQUERADE |
6.参考
NAT环境FTP服务器的映射及访问过程详解_ftp nat-CSDN博客
FTP 协议 基于 Netfilter Conntrack 的 动态端口 开放_conntrack ftp-CSDN博客
linux 如何修复nf_conntrack:出于安全原因,默认自动助手分配已关闭 _大数据知识库
http://e.betheme.net/article/show-240090.html?action=onClick