我有一个 JVM 应用程序作为 FTP 客户端,当禁用 ufw 时它可以正常工作,但是当我使用以下命令启用 ufw 时:
ufw allow ftp
然后检查状态输出:
Status: active
Logging: on (medium)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
21/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
21/tcp (v6) ALLOW IN Anywhere (v6)
我的应用程序看起来像这样(登录到 FTP,列出文件,获取文件),当启用 ufw 时它会卡在 STUCK_HERE:
fun execute(){
val ftpClient = FTPClient()
ftpClient.connect(InetAddress.getByName("example.com"))
val loginResult = ftpClient.login("secretLogin", "secretPass")
val stockFile: FTPFile? = ftpClient.listFiles().firstOrNull {
it.name.startsWith("stock")
}.also {
println("FTP stock file name:${it?.name}, size:${it?.size}, type:${it?.type}")
}
// <- STUCK_HERE, this is not called
stockFile?.let { ftpFile ->
val outStream = BufferedOutputStream(FileOutputStream(Const.stockCsvName))
outStream.use {
ftpClient.retrieveFile(ftpFile.name, it)
}
}
ftpClient.disconnect()
}
因此我检查了客户端机器上的 ufw 日志,发现传入流量似乎被阻止了:
May 3 11:26:20 kernel: [2562852.155804] [UFW ALLOW] IN= OUT=eth0 SRC=OOO.OOO.OOO.OOO DST=III.III.III.III LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=60824 DF PROTO=TCP SPT=44076 DPT=21 WINDOW=502 RES=0x00 ACK RST URGP=0
May 3 11:26:23 kernel: [2562855.178073] [UFW BLOCK] IN=eth0 OUT= MAC=mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm SRC=III.III.III.III DST=OOO.OOO.OOO.OOO LEN=60 TOS=0x00 PREC=0x00 TTL=59 ID=48578 DF PROTO=TCP SPT=20 DPT=44745 WINDOW=64240 RES=0x00 SYN URGP=0
而且最有可能是通过传入的 FTP 流量端口,DPT=44745
我的 ufw 不允许这样做。
我的第一个问题:该港口DPT=44745
被称为临时端口?
另一个问题:我能以某种方式处理它吗?我的意思是保持 ufw 正常运行但允许 FTP?
到目前为止我只发现FTP 安全漏洞,但它并没有帮我找到解决方案。
整个设置在搭载 Ubuntu 20.04.3 LTS 的 DigitalOceans VPS 上运行。