1. 安装ftp(如果没有安装)
sudo apt install vsftpd
  1. 创建访问用户
    以下命令创建一个guest用户并更改其主目录为要分享的文件夹的根目录,这样在下面设置ftp时限制登录用户在其主目录中可以让用户ftp登录时即进入到要共享的文件夹中,且不允许到这个文件夹外面去。
anonymous=NO                         #禁止匿名访问
sudo useradd guest
sudo passwd guest
sudo usermod -d 共享文件夹的根目录 guest
sudo usermod -s /sbin/nologin guest  #限制用户登录,guest用户只能作为ftp访问用户登录

注意:下面的设置要限制登录用户在自己的主目录下,这里需要将guest的主目录改成不可写模式,否则会访问失败=>sudo chmod -w guest主目录更正:以上sudo usermod -s /sbin/nologin guest不知道为什么会导致ftp无法登录,所以改回了/bin/bash,但是这样的话该用户也可以ssh远程登录,为了禁止其远程登录,参考这篇博客直接在ssh的配置文件中设置允许ssh登录的用户就可以了=>

vim /etc/ssh/sshd_config
#添加一行
AllowUsers root  #没有添加guest用户所以其无法远程ssh登录
#保存修改后重启下ssh服务
systemctl systemctl restart sshd.service
  1. 配置ftp
    编辑ftp配置文件/etc/vsftpd.conf(一般会自动生成);参考注释,把自己想要的选项去掉注释或者不想要的选项注释掉,我用的是默认,改了以下几个:
listen=YES               #让ftp自己监听网络端口(应该),根据man手册,这种方式使用更简单
local_umask=022          #设置本地用户权限为755(即777-022)
chroot_local_user=YES    #改变根目录至用户目录(禁止登录用户访问主目录以外的目录)
chroot_list_enable=YES   #限制哪些登录用户在其主目录中;下一选项的文件指定哪些用户受此限制
chroot_list_file=/etc/vsftpd.chroot_list

创建并编辑/etc/vsftpd.chroot_list文件,一行一个用户名,指定哪些用户需要限制在其主目录中。比如这里对外开了一个guest用户,则只要限制guest用户在其主目录中即可。
更正,虽然不太清楚为什么,但是将guest添加到vsftpd.chroot_list中好像是把guest拉进了黑名单,怎么也无法登录;相反,我使用其他本地用户时可以登录ftp且限制在主目录;当将guest移出vsftpd.chroot_list后发现可以登录=>说明确实是类似黑名单的作用。

  1. 重启ftp服务
/etc/init.d/vsftpd restart  #重启vsftpd服务器(ubuntu下)
service vsftpd start        #重启服务(ubuntu下)
#在centos下重启vsftpd服务
systemctl restart vsftpd.service
systemctl status vsftpd.service  #查看状态
  1. 登录ftp链接下载文件
    使用ifconfig查看本机ip地址,然后在网页或者ftp软件中输入网址ftp://192.xxx.xxx.xxx,然后输入用户名guest及其密码即可访问ftp服务器上文件。

注意:ftp分享文件夹需要有公网ip,否则只能在同一局域网下访问——可以在有公网ip的服务器上配置以上ftp服务;也可以采用内网穿透的方法,将内网ip映射到自定义域名上,然后借由一个有公网ip的服务器做一下端口映射,我使用的是nat123,让自己个人电脑上的ftp服务可以在非同一局域网下访问

  • 外网访问内网FTP-非网站应用映射方法,教程中是windows下的配置,linux下的配置可以直接在官网相应实现,登录后点击左侧栏映射列表,之后操作与windows下客户端差不多
  • vsftpd服务修改为被动模式及设置端口范围,nat123网站的内网穿透方法需要设置被动模式,如下设置:
vim /etc/vsftpd/vsftpd.conf
#修改以下配置
pasv_enable=YES         #开启被动模式
pasv_min_port=xxxx      #随机最小端口,按照nat123的配置,最小端口与最大端口设为同一个
pasv_max_port=xxxx      #随机最大端口