2021年5月

使用宝塔很长时间,很早就发现宝塔安装的FTP不能使用被动模式。也尝试过解决,之前以为是端口不通,但开放端口后,发现还是不行。由于时间问题,也没再深入去解决,毕竟还可以用主动模式。

最近开始使用起vscode,然后安装了sftp同步插件,但发现同步文件非常慢,每次修改完文件都要十多秒才能把文件上传上去,效率太慢了。
于是打开调试模式,排查问题,最后发现这个插件不能指定使用主动模式,只能被动模式失败后才切换到主动模式,所以每次同步文件都要十多秒。
关键日志:

命令:    PASV
响应:    227 Entering Passive Mode (172,18,13,228,154,214)

客户端发出PASV被动模式命令,服务器返回了一个VPC内网IP,客户端尝试连接这个内网IP,但因为不是同一个内网,所以是连接不上的,指导超时才切换成主动模式。

服务器有两个IP,一个VPC内网IP,一个外网IP,pure-ftpd优先获取到了内网IP告知客户端将其作为被动模式IP,所以导致了被动模式不能使用的问题。
这种情况,我们只需要在配置文件里指定被动模式IP即可解决。编辑pure-ftpd的配置,搜索ForcePassiveIP,取消注释这行配置,修改IP为你的服务器外网IP。

这里假设你的服务器IP为8.8.8.8
ForcePassiveIP 8.8.8.8

保存,重启服务器,over

如果还是不行,那么要看看防火墙和安全组有没有放行被动模式的端口,宝塔安装的pure-ftpd软件的被动模式端口默认是3900040000,所以要先在防火墙和服务器安全组里放通这个端口范围。

服务器安全组是指阿里云或腾讯云的服务器,其它云服务器厂商基本都有

自己使用的服务器,为了方便远程修改同步文件,特地去ftp服务器有点浪费。linux服务器自带sftp功能,也能满足文件上传下载的功能,所以,整起!

安装宝塔面板后,系统里面已经有www用户了,但是是没有设置密码的,所以我们先设置下密码

sudo passwd www

然后输入两次密码即可完成密码设置

Changing password for user www.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

编辑openssh配置文件

vim /etc/ssh/sshd_config

找到下面这行配置

Subsystem sftp /usr/libexec/openssh/sftp-server

然后注释掉它

#Subsystem sftp /usr/libexec/openssh/sftp-server

接着在配置文件最后面新增以下配置

Subsystem sftp internal-sftp

Match User www
    ChrootDirectory /www/wwwroot
    X11Forwarding no
    AllowTcpForwarding no
    PermitTTY no
    ForceCommand internal-sftp

保存配置文件,然后重启openssh服务

service sshd restart

大功告成