我正在尝试使用twisted 设置一个简单的 FTP 服务器:
sudo venv/bin/twistd ftp -p 21 -r /home/ftpuser/ftproot/ --auth file:/home/ftpuser/pass.dat
当我从 Mac 上运行它时,它运行得很好。但是当我在 ubuntu 机器上运行twisted FTP 时遇到这个错误。知道可能是什么原因造成的吗?
[twisted.scripts._twistd_unix.UnixAppLogger#info] reactor class: twisted.internet.epollreactor.EPollReactor.
[-] FTPFactory starting on 21
[twisted.protocols.ftp.FTPFactory#info] Starting factory <twisted.protocols.ftp.FTPFactory instance at 0x7f5d31173f80>
[FTP (ProtocolWrapper),0,100.35.194.233] DTPFactory.setTimeout set to 10 seconds
[FTP (ProtocolWrapper),0,100.35.194.233] DTPFactory starting on 38688
[twisted.protocols.ftp.DTPFactory#info] Starting factory <twisted.protocols.ftp.DTPFactory instance at 0x7f5d311712d8>
[-] timed out waiting for DTP connection
[-] Unexpected FTP error
[-] Unhandled Error
Traceback (most recent call last):
Failure: twisted.protocols.ftp.PortConnectionError: DTPFactory timeout
我在 docker 容器内运行时遇到了同样的问题,并通过向 FTP 工厂添加被动端口范围找到了解决方案。
p = Portal(CustomFTPRealm(root), [AllowAnonymousAccess()])
f = FTPFactory(p)
f.passivePortRange = range(50000, 50010) # add port range
reactor.listenTCP(port, f)
reactor.run()
此外,我需要在
Dockerfile
中声明暴露的端口
EXPOSE 21
EXPOSE 50000-50010
如果您使用
docker-compose.yml
,请不要忘记传递端口范围。
ports:
- "2121:2121"
- "50000-50010:50000-50010"