如何为活动模式下的FTP服务器指定客户端数据端口?

0 投票
3 回答
1705 浏览
提问于 2025-04-16 01:50

我用Python的ftplib库连接一个运行在主动模式的FTP服务器。主动模式的意思是,当我们之间传输数据时,服务器会在我的客户端机器上随机选择一个端口来连接。

我可以指定客户端的数据端口(或者端口范围),让服务器连接到特定的端口吗?我不想在我的防火墙iptables中为FTP服务器打开所有端口。

3 个回答

-2

从Python 3.3开始,ftplib中的一些函数在建立连接时,可以使用一个叫source_addr的参数,这个参数可以让你做到这一点。

0

你可以重新实现FTP中的sendport方法,这样就能发送你想要的IP地址,而不是自动推测出来的那个。可以参考下面的代码:

class PatchedFTP(FTP):
    def sendport(self, host, port):
        return super(MyFTP, self).sendport("192.0.2.1", port)

ftp = PatchedFTP(ftp_server)

# the rest of the code would be the same

不过通常来说,更好的解决办法是使用被动模式。很多人尝试使用主动模式,因为被动模式在默认代码下无法正常工作,原因是的外部IP报告错误。想要找到解决方法,可以查看这里:
无法使用ftplib列出FTP目录 - 但FTP客户端可以正常工作

1

用标准的 ftplib模块 是无法做到这一点的。

你要么得找一个其他的库来实现这个功能,要么如果你有勇气的话,可以对你的 FTP 对象里的 makeport() 方法进行修改。

撰写回答