写在前面
现在 WordPress 安装、更新插件或主题时都需要通过 FTP 进行,由于之前并没有安装导致现在无法更新插件了。想着 FTP 这么常用的东西应该不难弄吧,就着手开始折腾了,没想到还是踩了坑,故在这里记录一下在 Debian 下的安装过程。
vsftpd
安装与配置
FTP 本身的安装与配置确实并不复杂,都是常规操作,过程如下:
sudo apt update sudo apt install vsftpd
等待安装完成后需要进行一些简单的配置,vsftpd 的配置文件路径默认为 /etc/vsftpd.conf
,修改配置如下:
# Example config file /etc/vsftpd.conf # # The default compiled in settings are fairly paranoid. This sample file # loosens things up a bit, to make the ftp daemon more usable. # Please see vsftpd.conf.5 for all compiled in defaults. # # READ THIS: This example file is NOT an exhaustive list of vsftpd options. # Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's # capabilities. # # # Run standalone? vsftpd can run either from an inetd or as a standalone # daemon started from an initscript. listen=NO # # This directive enables listening on IPv6 sockets. By default, listening # on the IPv6 "any" address (::) will accept connections from both IPv6 # and IPv4 clients. It is not necessary to listen on *both* IPv4 and IPv6 # sockets. If you want that (perhaps because you want to listen on specific # addresses) then you must run two copies of vsftpd with two configuration # files. listen_ipv6=YES # # Allow anonymous FTP? (Disabled by default). anonymous_enable=NO # # Uncomment this to allow local users to log in. local_enable=YES # # Uncomment this to enable any form of FTP write command. write_enable=YES # # Default umask for local users is 077. You may wish to change this to 022, # if your users expect that (022 is used by most other ftpd's) local_umask=022 # # Uncomment this to allow the anonymous FTP user to upload files. This only # has an effect if the above global write enable is activated. Also, you will # obviously need to create a directory writable by the FTP user. #anon_upload_enable=YES # # Uncomment this if you want the anonymous FTP user to be able to create # new directories. #anon_mkdir_write_enable=YES # # Activate directory messages - messages given to remote users when they # go into a certain directory. dirmessage_enable=YES # # If enabled, vsftpd will display directory listings with the time # in your local time zone. The default is to display GMT. The # times returned by the MDTM FTP command are also affected by this # option. use_localtime=YES # # Activate logging of uploads/downloads. xferlog_enable=YES # # Make sure PORT transfer connections originate from port 20 (ftp-data). connect_from_port_20=NO # # If you want, you can arrange for uploaded anonymous files to be owned by # a different user. Note! Using "root" for uploaded files is not # recommended! #chown_uploads=YES #chown_username=whoever # # You may override where the log file goes if you like. The default is shown # below. xferlog_file=/var/log/vsftpd.log # # If you want, you can have your log file in standard ftpd xferlog format. # Note that the default log file location is /var/log/xferlog in this case. #xferlog_std_format=YES # # You may change the default value for timing out an idle session. #idle_session_timeout=600 # # You may change the default value for timing out a data connection. #data_connection_timeout=120 # # It is recommended that you define on your system a unique user which the # ftp server can use as a totally isolated and unprivileged user. #nopriv_user=ftpsecure # # Enable this and the server will recognise asynchronous ABOR requests. Not # recommended for security (the code is non-trivial). Not enabling it, # however, may confuse older FTP clients. #async_abor_enable=YES # # By default the server will pretend to allow ASCII mode but in fact ignore # the request. Turn on the below options to have the server actually do ASCII # mangling on files when in ASCII mode. # Beware that on some FTP servers, ASCII support allows a denial of service # attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd # predicted this attack and has always been safe, reporting the size of the # raw file. # ASCII mangling is a horrible feature of the protocol. #ascii_upload_enable=YES #ascii_download_enable=YES # # You may fully customise the login banner string: #ftpd_banner=Welcome to blah FTP service. # # You may specify a file of disallowed anonymous e-mail addresses. Apparently # useful for combatting certain DoS attacks. #deny_email_enable=YES # (default follows) #banned_email_file=/etc/vsftpd.banned_emails # # You may restrict local users to their home directories. See the FAQ for # the possible risks in this before using chroot_local_user or # chroot_list_enable below. #chroot_local_user=YES # # You may specify an explicit list of local users to chroot() to their home # directory. If chroot_local_user is YES, then this list becomes a list of # users to NOT chroot(). # (Warning! chroot'ing can be very dangerous. If using chroot, make sure that # the user does not have write access to the top level directory within the # chroot) chroot_local_user=YES chroot_list_enable=YES # (default follows) chroot_list_file=/etc/vsftpd.chroot_list # # You may activate the "-R" option to the builtin ls. This is disabled by # default to avoid remote users being able to cause excessive I/O on large # sites. However, some broken FTP clients such as "ncftp" and "mirror" assume # the presence of the "-R" option, so there is a strong case for enabling it. #ls_recurse_enable=YES # # Customization # # Some of vsftpd's settings don't fit the filesystem layout by # default. # # This option should be the name of a directory which is empty. Also, the # directory should not be writable by the ftp user. This directory is used # as a secure chroot() jail at times vsftpd does not require filesystem # access. secure_chroot_dir=/var/run/vsftpd/empty # # This string is the name of the PAM service vsftpd will use. pam_service_name=vsftpd # # This option specifies the location of the RSA certificate to use for SSL # encrypted connections. rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key ssl_enable=NO # # Uncomment this to indicate that vsftpd use a utf8 filesystem. #utf8_filesystem=YES # enable pasv mode pasv_enable=YES pasv_min_port=6000 pasv_max_port=7000
各个选项具体含义参见默认的 vsftpd.conf 文件里面注释,其中需要注意的是下面这两组参数。
chroot_local_user=YES chroot_list_enable=YES # (default follows) chroot_list_file=/etc/vsftpd.chroot_list 与 pasv_enable=YES pasv_min_port=6000 pasv_max_port=7000
在 chroot_local_user
设为 YES
的情况下,如果 chroot_list_enable
设为 YES
, 那么 chroot_list_file
里面列出的用户有权限访问用户主目录之外的目录;一般情况下如不允许所有用户访问用户主目录之外的目录,直接设置 chroot_local_user
为 NO
即可。
而 pasv_enable
设置为 YES
代表 FTP 使用 PASV(被动)模式,开启此模式是为了方便我的 FTP 客户端连接服务器。所谓被动模式,指的是 FTP 服务器 “被动” 等待客户端来连接自己的数据端口,其过程具体是:当开启一个 FTP 连接时,客户端打开两个任意的非特权本地端口(N >1024 和 N+1)。第一个端口连接服务器的 21 端口,但与主动方式的 FTP 不同,客户端不会提交 PORT 命令并允许服务器来回连它的数据端口,而是提交 PASV 命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送 PORT P 命令给客户端。然后客户端发起从本地端口 N+1 到服务器的端口 P 的连接用来传送数据。pasv_min_port
与 pasv_max_port
为端口号的最大最小范围。
添加用户
这里使用 Linux 系统本身存在的用户,作为 FTP 用户,具体哪些用户可以登录 FTP,可以通过 vsftpd.chroot_list
指定,此文件中指定的本地用户被授予访问 FTP 服务器的权限。
sudo adduser ftpuser # 添加新用户 echo "ftpuser" | sudo tee -a /etc/vsftpd.userlist # 将FTP用户添加到vsftpd用户列表文件
重启 vsftpd,使配置生效。
sudo systemctl restart vsftpd.service
修改防火墙设置
为了能够进行外部连接,需要修改防火墙设置开启对应端口,一般 FTP 默认为 21 端口。若开启了 PASV 模式,还需特别开启 pasv_min_port
与 pasv_max_port
范围内的端口。
iptables -I INPUT -p tcp --dport 6000:7000 -j ACCEPT
配置用户权限
为了可以使用新添加的用户为 WordPress 对主题或插件进行操作,需要赋予 ftpuser
用户对 Wordpress 所在目录的读写权限。
首先检查哪个组拥有 WordPress 所在路径(一般为 www-data
),然后需确保该组递归拥有该目录。
sudo chown -R www-data.www-data /var/www/wordpress
ftpuser
需要属于 www-data
组,可以使用下面的命令进行添加:
sudo usermod -a -G www-data ftpuser groups ftpuser # 查看是否添加成功
之后,将 ftpuser
的默认文件夹设置为 WordPress 目录。
usermod -d /var/www/wordpress ftpuser
最后,需要赋予 ftpuser
用户对 WordPress 目录下文件的读写权限。
sudo chmod -R g+rw /var/www/wordpress
至此便可以通过 ftpuser
用户与其对应的密码作为 WordPress 的 FTP 凭据,完成对主题或插件的操作。
参考链接: