当我开始设置 vsftpd 服务器时,我遇到了很多问题,但这次我无法弄清楚到底出了什么问题。
我在工作时有一台运行 vsftpd 的 ubuntu 14.04 服务器。该服务器位于 DMZ 中的防火墙后面,并已分配特定的内部和全局 IP 地址。从本地主机以及内部网络进行连接均可正常工作。
到目前为止一切顺利,但是当我尝试通过其全局 IP 地址访问 FTP 服务器时(无论是从内部网络还是其他任何地方),FileZilla 只会给我以下信息:
Status: Connecting to <global.ip>:21...
Status: Connection attempt failed with "ECONNREFUSED - Connection refused by server".
Error: Could not connect to server
我可以排除错误的 IP 地址导致的原因,因为输入不存在的 IP 会导致超时错误,而对全局 IP 运行 whois 检查会给我提供我们公司的互联网服务提供商。
我在 vsftpd.conf 中设置了 50.000 范围内的被动端口,防火墙也会转发来自端口 20、21 和 50.000-50.050 的请求。然后我又在 iptables 配置中添加了一些规则,以允许所需的流量通过。
作为参考,这是我的 iptables 设置:
~$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere
tcp dpts:50000:50050
ACCEPT tcp -- anywhere anywhere
tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere
tcp dpt:ftp
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere
tcp spt:ftp-data
我的 vsftpd.conf:
listen=YES
local_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
idle_session_timeout=600
ftpd_banner=Welcome
chroot_local_user=YES
ls_recurse_enable=YES
secure_chroot_dir=/var/run/vsftpd/empty
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_ciphers=HIGH
rsa_cert_file=/home/awacs/vsftp.crt
rsa_private_key_file=/home/awacs/vsftp_clear.key
#pasv_address=<global.ip>
pasv_min_port=50000
pasv_max_port=50050
listen_port=21
pasv_enable=YES
#listen_address=<global.ip>
如您所见,我尝试了配置中的pasv_address
和listen_address
参数。listen_address 导致服务器仅接受来自全局 IP 的请求,这使其根本没有响应。设置 pasv_address 也不令人满意,因为外部请求仍然不起作用,来自内部网络的连接卡在目录 LIST 命令处。
如果有人能告诉我我做错了什么或忽略了什么,我会非常高兴。我再次强调,服务器在内部网络运行正常,但我无法让它通过全局 IP 进行连接。提前谢谢您。