这与关于GCP的这个问题,但在 AWS 上,也尝试用不同的方法解决它。
我有一个 FTP 客户端尝试以 ftp 主动模式连接到位于 Internet 上的一些 ftp 服务器。FTP 客户端有私有地址,并且位于 NAT 实例服务器(不是 NAT 网关)后面
该 NAT 服务器也具有私有地址,并且本身位于 VPC Internet GW 后面。
图表:
FTP 客户端(10.60.0.0/24)--> NAT 服务器(10.254.254.0/24)--> IGW --> Internet --> 防火墙/NAT --> FTP 服务器
NAT 服务器是启用了伪装的 AWS NAT Linux(内核 4.9)。
使用 Active-FTP(端口模式)时,这不起作用。
我已经激活了 CT FTP 助手 (nf_nat_ftp) 及其触发 iptables 规则:
iptables -A PREROUTING -t raw -p tcp --sport 1024: --dport 21 -j CT --helper ftp
我可以看到“PORT”命令正在从 FTP 客户端的私有 IP 地址正确地转换为 NAT 服务器的私有 IP。
不幸的是,这还不够,因为 FTP 服务器正在接收仍然带有私有地址(NAT 服务器的地址)的 FTP“PORT”命令。
因此,从 ftp 服务器发起的 ftp 数据连接当然永远不会返回。
至少目前我无法“替换” ftp 客户端(它是遗留应用程序的一部分)。
有没有办法在 PORT 命令中“注入”公共 IP?我想到了一些想法,但我找不到证据来证明它们是否现实,或者我在浪费时间:
在 nat 服务器上使用公共 IP 地址创建一个“假”接口,并有选择地启用/禁用 CT 助手来修改 PORT 命令。不过,我在正确路由方面遇到了麻烦(更不用说说服自己值得一试了)
使用硬编码的公共 IP 修改 nf_nat_ftp 帮助模块(太丑了!)
修改 ftp 客户端上的端口命令(它是一台 Windows 机器),不知道是否已经存在用于此目的的驱动程序/工具
对 FTP 客户端进行暴力破解(可能是最现实的方法……?)
关于选项 3:我试过网状结构,这实际上可以改变 PORT 命令,但它似乎搞乱了 ftp 客户端的 nat!:(
当然也欢迎其他解决方案!
谢谢。
答案1
尝试回答我自己的问题在有限的用例上
限制是:nat 服务器后面只有 1 个处于主动模式的 ftp 客户端(它不适用于伪装)
- ftp 客户端:10.60.10.11
- nat 服务器:10.254.254.203
- 公网 IP:1.2.3.4
首先,在 nat 服务器上启动 netsed,本地端口 21,将所有包含“PORT 10,60,10,11”的数据包转换为“PORT 1,2,3,4”(因此保持端口号不变):
./netsed tcp 21 0 0 s/PORT%2010,60,10,11,/PORT%201,2,3,4,
其次,将流量从 ftp 客户端重定向到 netsed:
iptables -t nat -A PREROUTING -p tcp --dport 21 -j REDIRECT --to 21
这将使 ftp 服务器“高兴”,它将有效地尝试从端口 20 打开一个新连接到公有 IP。IGW 将放行,但 NAT 服务器不知道如何处理该连接(它不在 CT 中,它是一个新连接)。
所以,尽管可能很丑陋,现在将来自端口 20 的所有传入流量转发到内部 FTP 客户端:
iptables -t nat -A PREROUTING -p tcp -d 10.254.254.203 --sport 20 --dport 1024:65535 -j DNAT --to-destination 10.60.10.11:1024-65535
这有效!!
但是,除了是黑客攻击之外,它似乎仅限于 1 个 ftp 客户端。
感谢@Steffen 指出 CT 状态未设置。
答案2
有没有办法在 PORT 命令中“注入”公共 IP?
即使这是可能的,也无济于事。虽然服务器可能会接受带有公共 IP 地址的 PORT 命令,但它无法使用此 IP 地址和端口重新连接到 FTP 客户端,因为 IGW 上没有匹配的 NAT 状态。
如果您有两个 NAT(NAT 服务器和 IGW),那么这两个 NAT 都需要在 PORT 命令中转换地址并创建一个状态将服务器到新设置的IP、端口的连接传递到原始PORT命令的IP、端口。
我真的建议放弃 FTP,使用不需要动态数据连接的替代方案,例如 FTP。这种动态连接只会在其中一个 NAT 网关无法转换 PORT/PASV 时给您带来问题 - 可能是因为缺少 FTP 帮助程序,也可能是因为您使用的是 FTPS(即带 TLS 的 FTP),其中 NAT 网关甚至无法看到原始 IP、端口,也无法根据需要修改控制连接。改用 SFTP(通过 SSH 的 FTP)等协议,因为它们只使用单个 TCP 连接,所以不会出现 NAT 问题。