背景
网站从typecho转为wordpress后,为了实现wordprss版本和插件自动更新,需在服务器上部署ftp服务。
系统环境
系统:Ubuntu 18.04.1
服务商:腾讯云
实例配置:1核 2GB 1Mbps
安装步骤
-
安装vsftpd
sudo apt-get install vsftpd
检查版本
ubuntu@VM-0-4-ubuntu:~$ vsftpd -v vsftpd: version 3.0.3
启动vsftpd,这里先采用默认配置
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.
- 编写配置文件
在ubuntu系统中,vsftpd的配置文件在/etc/vsftpd.conf中,先备份原文件,然后进行配置ubuntu@VM-0-4-ubuntu:~$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
配置文件内容(我用到的配置)
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 # 这里写服务器的公网地址
- 创建登陆ftp所需要的用户
useradd -d /var/www/html -s /sbin/nologin xxx
/var/www/html为站点目录,设置/sbin/nologin是为了禁止xxx用户能登陆shell
更改/var/www/html站点目录的属主为xxxsudo chown -R xxx /var/www/html
在userlist_file文件中加入xxx用户
sudo vim /etc/vsftpd/allowed_users
-
编辑/etc/pam.d/vsftpd ,将auth required pam_shells.so注释掉
"/etc/pam.d/vsftpd" # 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
需要注释的原因:若不注释,则会要求登入的用户必须能登陆shell,而我们创建的用户是/sbin/nologin
- 接下来是开放端口,根据配置文件,开启TCP的21端口和6000-7000端口
sudo iptables -A INPUT -p tcp --doport 6000:7000 -j ACCEPT
再去腾讯云控制台,在安全组规则里添加tcp的6000-7000的端口
- 重启服务,测试
遇到的坑
- 没开启21端口,导致只能本地连接,无法通过ip访问
- 没有注释/etc/pam.d/vsftpd 里的auth required pam_shells.so字段,导致ftp用户无法登入
- 未开启被动模式pasv,导致服务器无法通过20端口与客户端进行数据传输,现象是用户能登入,但ls看不到任何目录
ftp> ls 200 PORT command successful. Consider using PASV. 425 Failed to establish connection.
ftp的主动模式:客户端和服务端通过21端口进行连接(控制连接),连接成功后,服务端使用20端口主动连接客户端的20端口,建立数据连接。服务端主动连接客户端时,很可能会被客户端的防火墙拦截,即会出现以上报错
ftp的被动模式:客户端和服务端通过21端口进行连接(控制连接),连接成功后,服务端会开启某个范围内的随机端口,用以监听客户端的数据连接请求。
1M 小水管速度实在感人,但是上传速度还不错。 FTP现在用的都比较少了,推荐你搭建一个可道云,直接在线编辑和上传都特别方便。
莫的money呀