目录

个人网站服务器FTP的安装与配置

背景

网站从typecho转为wordpress后,为了实现wordprss版本和插件自动更新,需在服务器上部署ftp服务。

系统环境

系统:Ubuntu 18.04.1
服务商:腾讯云
实例配置:1核 2GB 1Mbps

安装步骤

  1. 安装vsftpd
1
sudo apt-get install vsftpd</code></pre>

检查版本

1
2
ubuntu@VM-0-4-ubuntu:~$ vsftpd -v
vsftpd: version 3.0.3

启动vsftpd,这里先采用默认配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
ubuntu@VM-0-4-ubuntu:~$ sudo systemctl start vsftpd
ubuntu@VM-0-4-ubuntu:~$ sudo systemctl status vsftpd
● vsftpd.service - vsftpd FTP server
   Loaded: loaded (/lib/systemd/system/vsftpd.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2021-11-12 11:36:31 CST; 3h 7min ago
  Process: 21831 ExecStartPre=/bin/mkdir -p /var/run/vsftpd/empty (code=exited, status=0/SUCCESS)
 Main PID: 21836 (vsftpd)
    Tasks: 1 (limit: 2123)
   CGroup: /system.slice/vsftpd.service
           └─21836 /usr/sbin/vsftpd /etc/vsftpd.conf

Nov 12 11:36:31 VM-0-4-ubuntu systemd[1]: Starting vsftpd FTP server..
Nov 12 11:36:31 VM-0-4-ubuntu systemd[1]: Started vsftpd FTP server.
  1. 编写配置文件
    在ubuntu系统中,vsftpd的配置文件在/etc/vsftpd.conf中,先备份原文件,然后进行配置
1
ubuntu@VM-0-4-ubuntu:~$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak

配置文件内容(我用到的配置)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
listen=NO   # 监听ipv4端口
listen_ipv6=YES # 监听ipv6端口,其与ipv4不能同时开启
anonymous_enable=NO # 关闭匿名登陆
local_enable=YES # 允许本地用户(服务器的用户)登陆
dirmessage_enable=YES # 激活目录欢迎信息功能
use_localtime=YES # 矫正时间为系统本地时间
xferlog_enable=YES # 让系统自动维护上传和下载的日志文件,默认日志文件为/var/log/vsftpd.log ,也可以通过xferlog_file来指定
connect_from_port_20=NO # 关闭通过端口20来进行数据传输
secure_chroot_dir=/var/run/vsftpd/empty # 必须有此参数,指定一个空目录,当vsftpd不需要访问文件时,就会将使用者限制在此目录
pam_service_name=vsftpd # 设置pam模块提供认证服务时所使用的配置文件名,即/etc/pam.d/vsftpd文件
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
write_enable=YES # 开启本地用户对服务器文件的写权限
userlist_enable=YES # 开启userlist文件中用户的筛选
userlist_deny=NO # 若是YES,则userlist文件中的用户禁止登陆,若是NO,则文件中的用户允许登陆
userlist_file=/etc/vsftpd/allowed_users # 指定userlist文件
chroot_local_user=YES # 将本地用户限制在主目录中
allow_writeable_chroot=YES # 当开启了chroot_local_user=YES,用户若对其主目录有写权限,就无法登陆,ftp会报错,加上此配置,就可允许写权限的存在
tcp_wrappers=YES # 是否使用tcp_wrappers作为主机访问控制方式。
# tcp_wrappers可以实现linux系统中网络服务的基于主机地址的访问控制
# 在/etc目录中的hosts.allow和hosts.deny两个文件用于设置tcp_wrappers的访问控制
# 前者设置允许访问记录,后者设置拒绝访问记录。
# 如想限制某些主机对FTP服务器192.168.57.2的匿名访问,编缉/etc/hosts.allow文件,如在下面增加两行命令:
# vsftpd:192.168.57.1:DENY 和vsftpd:192.168.57.9:DENY
# 表明限制IP为192.168.57.1/192.168.57.9主机访问IP为192.168.57.2的FTP服务器
# 此时FTP服务器虽可以PING通,但无法连接
listen_port=21 # 监听端口21 ,连接端口
pasv_enable=YES # 开启被动模式
pasv_min_port=6000 # 被动模式数据传输端口最小值
pasv_max_port=7000 # 被动模式数据传输端口最大值
pasv_address=10.0.0.0 # 这里写服务器的公网地址
  1. 创建登陆ftp所需要的用户
1
useradd -d /var/www/html -s /sbin/nologin xxx

/var/www/html为站点目录,设置/sbin/nologin是为了禁止xxx用户能登陆shell
更改/var/www/html站点目录的属主为xxx

1
sudo chown -R xxx /var/www/html

在userlist_file文件中加入xxx用户

1
sudo vim /etc/vsftpd/allowed_users
  1. 编辑/etc/pam.d/vsftpd ,将auth required pam_shells.so注释掉"/etc/pam.d/vsftpd"
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Standard behaviour for ftpd(8).
auth    required        pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed

# Note: vsftpd handles anonymous logins on its own. Do not enable pam_ftp.so.

# Standard pam includes
@include common-account
@include common-session
@include common-auth
#auth   required        pam_shells.so</code></pre>

需要注释的原因:若不注释,则会要求登入的用户必须能登陆shell,而我们创建的用户是/sbin/nologin

  1. 接下来是开放端口,根据配置文件,开启TCP的21端口和6000-7000端口
1
sudo iptables -A INPUT -p tcp --doport 6000:7000 -j ACCEPT

再去腾讯云控制台,在安全组规则里添加tcp的6000-7000的端口
https://sankurao-1253285426.file.myqcloud.com/blog_pages/ftp.png

  1. 重启服务,测试

遇到的坑

  1. 没开启21端口,导致只能本地连接,无法通过ip访问
  2. 没有注释/etc/pam.d/vsftpd 里的auth required pam_shells.so字段,导致ftp用户无法登入
  3. 未开启被动模式pasv,导致服务器无法通过20端口与客户端进行数据传输,现象是用户能登入,但ls看不到任何目录
1
2
3
ftp&gt; ls
200 PORT command successful. Consider using PASV.
425 Failed to establish connection.

ftp的主动模式:客户端和服务端通过21端口进行连接(控制连接),连接成功后,服务端使用20端口主动连接客户端的20端口,建立数据连接。服务端主动连接客户端时,很可能会被客户端的防火墙拦截,即会出现以上报错
ftp的被动模式:客户端和服务端通过21端口进行连接(控制连接),连接成功后,服务端会开启某个范围内的随机端口,用以监听客户端的数据连接请求。