为什么vsftpd(在防火墙之后)返回其pasv地址的内部IP地址?

我在另一个Debian防火墙后面的Debian服务器上使用vsftpd。 natting是正确的,我可以从外部连接到ftp服务器。 但是,当客户端发出PASV命令时,ftp服务器返回其内部IP(192.168.0.19)。

我没有在conf文件中设置pasv_address指令,以便“地址从传入连接的套接字中获取”(从手册中复制出来)。 在我看来,当外部客户端发出PASV ,应该返回防火墙的外部IP地址,当内部客户端连接时,应该返回内部FTP服务器的IP。

当我将pasv_address指令设置为防火墙的外部IP时,一切都在外部工作,但是在内部中断。 当我将其设置为内部IP地址或注释掉pasv_address ,内部客户端工作,但外部客户端不工作。

任何人有任何见解?

编辑1:这里是服务器端的日志文件:

 Thu Sep 7 10:36:15 2017 [pid 9093] FTP command: Client "xxxx", "USER yyy" Thu Sep 7 10:36:15 2017 [pid 9093] [yyy] FTP response: Client "xxxx", "331 Please specify the password." Thu Sep 7 10:36:15 2017 [pid 9093] [yyy] FTP command: Client "xxxx", "PASS <password>" Thu Sep 7 10:36:15 2017 [pid 9092] [yyy] OK LOGIN: Client "xxxx" Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP response: Client "xxxx", "230 Login successful." Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP command: Client "xxxx", "OPTS utf8 on" Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP response: Client "xxxx", "200 Always in UTF8 mode." Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP command: Client "xxxx", "PWD" Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP response: Client "xxxx", "257 "/"" Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP command: Client "xxxx", "CWD /DownloadProduction/" Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP response: Client "xxxx", "250 Directory successfully changed." Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP command: Client "xxxx", "TYPE A" Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP response: Client "xxxx", "200 Switching to ASCII mode." Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP command: Client "xxxx", "PASV" Thu Sep 7 10:36:15 2017 [pid 9094] [yyy] FTP response: Client "xxxx", "227 Entering Passive Mode (192,168,0,19,192,27)." 

编辑2:我能够使用ProFTPD得到这个工作。 以下是Serverfault的情况: 防火墙后面的ProFTPd服务器返回WAN和LAN连接的内部IP地址

如果您位于外部防火墙之后,则传入连接实际上来自外部防火墙。 所以服务器的IP地址就是它的内部IP地址。 你所描述的是一个“正确”的行为。 FTP服务器不知道(也不可能)防火墙的外部IP地址。


你可以做的是分配两个IP地址到FTP服务器。 一个用于外部使用,一个用于内部使用。 并configurationFTP服务器返回外部IP地址连接的防火墙外部 IP地址; 和内部IP地址连接的内部 IP地址。

虽然我不确定,但如果vsftpd允许这样的configuration。 ProFTPD的确如此。

FTP通常会引起头疼,因为它不会在已经build立的控制连接上进行数据传输,而是需要打开一个额外的连接来传输数据。 FTP的第一个版本要求服务器打开这个连接到客户端 – 有时候NAT是未知的。 为了使这个工作与NAT,PASV发明了,所以客户可以打开第二个连接。 更好,但是 – 正如你所经历的 – 不是最佳的。

我有三个select:

  • 你使用sftp来代替 – 它不会遇到这个问题,因为它本质上是使用ssh来控制和数据在一个和唯一的一个连接。 当然这是一个不同的协议,所以根据你的环境,这可能不是一个选项。
  • 而不是在Debian防火墙上进行NAT,而是使用一些ftp代理软件,例如“ftp-proxy”。
  • 你设置了两个vsftp服务器,一个监听标准端口上的内部连接,另外一个监听2121,供外部使用,将pasv_addressconfiguration为防火墙的外部IP。 NAT需要适应将端口21转换成端口2121。

为了使用vsfptd得到这个工作,我做了一些事情:

  1. 更改了现有vsfptd服务的conf文件
    • 听取端口2121
    • 回应外部IP
  2. 将端口21从防火墙转发到ftp服务器上的端口2121
  3. 添加了第二个vsftpd服务(名为vsftpd-internal)
    • 听取默认端口21
    • 回应内部知识产权

这使得现有的服务仅处理外部连接,而新的vsftpd内部服务仅处理内部连接。