![即使所有端口都已正确转发,FTP over TLS 仍被拒绝](https://linux22.com/image/766213/%E5%8D%B3%E4%BD%BF%E6%89%80%E6%9C%89%E7%AB%AF%E5%8F%A3%E9%83%BD%E5%B7%B2%E6%AD%A3%E7%A1%AE%E8%BD%AC%E5%8F%91%EF%BC%8CFTP%20over%20TLS%20%E4%BB%8D%E8%A2%AB%E6%8B%92%E7%BB%9D.png)
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
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YES
user_sub_token=$USER
local_root=/home/$USER/ftp
pasv_min_port=30000
pasv_max_port=31000
userlist_enable=YES
userlist_file=/etc/vsftpd.user_list
userlist_deny=NO
我已经转发了端口 20、21 和 pasv 端口。我知道我的 ISP 没有阻止它们,因为在我使用 tls 之前,我能够从外部 IP 正常连接并且端口是开放的。
Status: Server sent passive reply with unroutable address. Using server address instead
但我尝试连接时仍然
答案1
从OP问题的零碎描述中我可以推测:
- 问题是关于在进行 NAT 的路由器后面使用 IPv4 从隐藏/私有地址提供 FTPS(或带有 starttls 的 FTP)服务的服务器。
- 服务器
listen_ipv6=YES
监听 IPv4 和 IPv6,绑定地址默认为 [::]。 - 此 NAT 路由器是转发端口端口 21 和预分配的端口 30000-31000 到服务器(注意:端口 20 是传出的源端口20,仅用于主动模式,不应转发)。
- 由于使用了 TLS,因此经典自适应网格网关支持(例如,在 Linux 上是内核模块
nf_nat_ftp
)是无用的,因为它无法解密控制流量以拦截和更改返回给客户端的 PASV 答案。客户端将因无法访问的地址(或只是与它连接的地址不同的地址)而失败或抱怨。
在这种情况下和这种配置下,服务器只能在主动模式下正常工作。如果客户端(出于同样的原因)只能执行被动模式,那么数据传输将无法正常工作。
服务器必须了解网络设置才能在被动模式下正常工作。
为了FTP服务器,存在一个特定设置:pasv_address
pasv_address
使用此选项可覆盖 vsftpd 响应 PASV 命令时公布的 IP 地址。提供一个数字 IP 地址,除非
pasv_addr_resolve
已启用,在这种情况下,您可以提供一个主机名,该主机名将在启动时为您进行 DNS 解析。默认值:(无 - 地址取自传入的连接套接字)
因此,您应该使用此附加条目将网关转发端口的公共 IP 地址添加到配置中(此处的示例网关的公共 IP 地址为 192.0.2.2):
pasv_address=192.0.2.2
(或者解析到该地址的主机名,但这也需要pasv_addr_resolve=YES
)
我猜想该参数listen_ipv6=YES
对于实际的 IPv6 客户端可能不再有用,因为 PASV 命令不会收到正确的答案。在这种情况下,可能应该有两个单独的实例sftpd,一个用于 IPv4(listen=YES
+ listen_ipv6=NO
),设置如上所述,如果实际使用,则一个用于 IPv6(listen=NO
+listen_ipv6=YES
与listen_address6
[::] 不同,并且可能没有特定设置passv_address
)。