我已连接到 OpenVPN 服务器并想要列出 FTP 服务器上的所有文件。
ftp> ls
500 I won't open a connection to 10.125.1.20 (only to 31.x.x.100)
ftp: bind: Address already in use
ftp>
该tun
接口的 IP 为 10.125.1.20,并且我的 FTP 客户端(ftp
Linux 中的命令)似乎将该 IP 报告给 FTP 服务器,而不是 OpenVPN 服务器提供的 IP。
我可以使用 iptables 转发来让它工作吗?
答案1
看起来您正在连接到 OpenVPN 服务器的主机上运行 FTP 客户端,并且您的流量在 VPN 内部路由(因此,对于外部世界,您的源 IP 地址是您的 OpenVPN 服务器的外部接口之一)。
这是真的吗?
如果没有……请提供详细信息。
如果是,那么您的问题恰恰与 OpenVPN “盒子” 有关:
正确地对您的“标准” IP 连接进行 NAT (事实上,您能够成功连接到远程 FTP 服务器)
是不是正确地对 FTP 协议进行 NAT(不幸的是,它不太适合 NAT,并且要进行 NAT,需要特殊处理)。
要解决您的问题,您应该确保在 NAT 盒(OpenVPN)上加载了正确的内核模块。在我的 Ubuntu 中(可能也在 CentOS 6 上):
# modprobe nf_conntrack_ftp
该模块将仔细监视沿 FTP“控制”连接(您能够建立、进行身份验证和“启动”文件传输的连接)流动的所有流量,以检查您的 FTP 客户端已声明用于文件传输的客户端端口,并正确“破坏”控制连接(通过强加 NAT 盒来“伪造”这些端口)。
换句话说:
- 没有上述模块:
- 1)FTP客户端与远程服务器建立FTP连接;
- 2) FTP 客户端想要启动文件传输(简单的“ls”)。因此...
- 3)...FTP客户端“打开”一个TCP端口,以便FTP服务器连接回该端口来传输内容;
- 4)...FTP 客户端使用在 1)点建立的控制连接“告诉”FTP 服务器哪个端口已打开
- 5) 不幸的是,如果没有“特殊处理”,您的远程 FTP 服务器(即沿着在第 1 点建立的连接正确读取/写入)将接收在步骤 4) 中指定的包含您的“私有”IP 地址的 IP/PORT 组合。
- 6) 因此 FTP 服务器看到控制连接来自一个 IP,而数据连接与另一个 IP 相关。它(正确地)不喜欢这种情况,因为它可能导致某种反射/DDOS 情况。因此,它会向您发送您看到的错误消息。
。
- 已加载上述模块
- 除了步骤 5,其他一切都和上面一样。这样的步骤变成了……
- 5) 借助 conntrack_ftp 模块,您的 NAT 盒会打开自己的 TCP 端口(在外部接口上),并准备在这些端口上接收 FTP 数据流量。一旦收到,它会将此类流量转发回您的 FTP 客户端。此外,“控制连接”被破坏,因此需要用 NAT 盒的 IP/PORT 替换客户端发送的 IP/PORT 组合。
- ...并且由于这一点,一切都应该顺利进行:-)(...或者,至少,我希望)。