通过 iptables 将 FTP 流量转发到本地服务器

通过 iptables 将 FTP 流量转发到本地服务器


我有一个负载平衡基础设施,其中有一个边缘服务器作为负载平衡器,一些 Web 服务器作为后端服务器,还有一个 cpanel 服务器作为我的 ftp 服务器。我想通过 iptables 将 ftp 流量转发到负载平衡器服务器后面的 ftp 服务器。场景如下:

LB:
ens19:公共
IP ens18:192.168.1.105

ftp服务器:
eth0:192.168.1.110

LB的操作系统是CentOS 7,ftpserver的操作系统是CentOS 6。我已经禁用firewalld并安装了iptables。nat ftp流量的规则如下:

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited

-A FORWARD -j LOG

-A FORWARD -i ens19 -o ens18 -p tcp --syn --dport 21 -m conntrack --ctstate NEW -j ACCEPT

-A FORWARD -i ens19 -o ens18 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i ens18 -o ens19 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT


*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -i ens19 -p tcp --dport 21 -j DNAT --to-destination 192.168.1.110:21
-A POSTROUTING -o ens18 -p tcp --dport 21 -d 192.168.1.110 -j SNAT --to-source 192.168.1.105
-A POSTROUTING -s 192.168.1.0/24 -o ens19 -j MASQUERADE
COMMIT


我还在 iptables-config 文件中添加了以下行:
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"

并且 net.ipv4.ip_forward = 1。

当我想连接到 ftp 后,出现以下错误:

$> ftp public_ip
Connected to public_ip.
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 1 of 50 allowed.
220-Local time is now 11:19. Server port: 21.
220-This is a private system - No anonymous login
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
Name (public_ip:sinai): ftp_user_name
331 User [email protected] OK. Password required
Password:
230 OK. Current restricted directory is /
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful
425 Could not open data connection to port 29806: Connection timed out
ftp> 

我认为登录过程已完成,问题在于传输数据。您能帮我解决这个问题吗?
提前谢谢。

答案1

因此连接正常,但无法传输数据。FTP 使用 21TCP 建立连接,但使用 20TCP 发送/接收数据。尝试复制 20TCP 的转发/SNAT/DNAT 规则:

-A 转发 -i ens19 -o ens18 -p tcp --syn --dport20-m conntrack --ctstate NEW -j 接受

-A 预路由-i ens19 -p tcp --dport20-j DNAT --到目的地 192.168.1.110:21

-A POSTROUTING -o ens18 -p tcp --dport20-d 192.168.1.110 -j SNAT --到源 192.168.1.105

或者您可以尝试被动模式 FTP。在这种情况下,服务器重新连接到客户端(再次使用端口 20)来传输数据,这样出站连接应该可以顺利穿越 NAT 路由器。

相关内容