VM 内无 SSL 的 vsftpd 被动模式

VM 内无 SSL 的 vsftpd 被动模式

这是我的情况:有人需要从一台非常老旧的主机推送一些文件,而这台主机只能使用普通 FTP(无 SSH、无 SSL)。在我的环境中,我有一个装有 Ubuntu 16.04.2 LTS(GNU/Linux 4.4.0-139-generic x86_64)镜像的虚拟机,我在其中设置了一个 vsftpd 服务器。虚拟机有公共地址XXX.XXX.XXX.XXX.,但是内部地址不同:

$ ifconfig   
ens3      Link encap:Ethernet  HWaddr aa:aa:aa:aa:aa:aa  
          inet addr:YYY.YYY.YYY.YYY  Bcast:YYY.YYY.YYY.255  Mask:255.255.255.0
          inet6 addr: aaaa::aaaa:aaaa:aaaa:aaaa/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
          RX packets:676755 errors:0 dropped:0 overruns:0 frame:0
          TX packets:244476 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:712807318 (712.8 MB)  TX bytes:20949942 (20.9 MB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:355 errors:0 dropped:0 overruns:0 frame:0
          TX packets:355 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:23535 (23.5 KB)  TX bytes:23535 (23.5 KB)

我无法从外部控制该虚拟机。我在系统上请求它,系统会给我一个 IP 地址、用户和密码。天知道这个虚拟机在哪里。

因此,我对 vsftpd 进行了以下配置:

listen_address=XXX.XXX.XXX.XXX. # External IP here.
pasv_address=XXX.XXX.XXX.XXX.   # External IP here too.
listen=NO
listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
chroot_list_enable=NO
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=YES
allow_writeable_chroot=YES

使用此配置,我可以远程访问服务器并推送文件,没有任何问题。请注意,配置文件 ( XXX.XXX.XXX.XXX) 上的 IP 是外部 IP,而不是内部 IP ( YYY.YYY.YYY.YYY)。

但是,正如标题所示,我的合作伙伴无法使用 SSL 连接。由于启用 SSL 时 vsftpd 不接受用户/密码明文身份验证,因此我必须将其关闭:

ssl_enable=NO

但是现在,我遇到了很多问题。这是我尝试连接服务器时的一个示例:

$ ftp XXX.XXX.XXX.XXX
Connected to XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX).
220 (vsFTPd 3.0.3)
Name (XXX.XXX.XXX.XXX:alice): bob
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (0,0,0,0,39,107).
ftp: connect: Connection refused

请注意,“alice”和“bob”是我服务器上的有效用户。因此,这里的问题是,当 FTP 被动接收文件等时,它会将 de IP 更改为(0,0,0,0,39,107),即服务器中的 localhost,即使我明确要求使用地址XXX.XXX.XXX.XXX.

互联网上有一些资料将此问题与 NAT 转换联系起来(看起来是这样),但我尝试了他们的解决方案。大多数都要求我们设置pasv_address(有时是端口范围),但都不起作用。

现在,另一个怪人:

listen_ipv6=NO
ssl_enable=YES

现在,我甚至无法连接到服务器,也无法连接到远程机器:

$ hostname
my_laptop

$ ftp XXX.XXX.XXX.XXX
ftp: connect: Connection refused

也不是本地主机:

$ hostname
my_server

$ ftp localhost
ftp: connect: Connection refused

后者是有意义的,因为list_address它指向外部 IP 地址。但即使我注释了那一行,我仍然无法连接。

我很清楚问题出在地址配置上,因为它似乎响应 IPv6 本地主机。但是,我不是这方面的专家,所以我寻求你的帮助。谢谢!

答案1

我可以连接到我的 vsftp 服务器,一切cd <some_dir>正常。但是ls失败get foo.txt

ftp: connect: Connection refused

这是在没有防火墙、没有 iptables 的本地局域网上。

解决方案是pasv_address从我的中删除/etc/vsftp.conf(然后重新启动 vsftp)

相关内容