[centos] 安装 FTP

1 安装 vsftpd

# 安装vsftpd
yum install -y vsftpd
# 设置开机启动
chkconfig vsftpd on
# 重启
service vsftpd restart
# 查看vsftpd服务的状态
service vsftpd status

2 配置 vsftpd.conf

# 备份配置文件
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
# 执行以下命令修改配置文件
sed -i "s/anonymous_enable=YES/anonymous_enable=YES/g" '/etc/vsftpd/vsftpd.conf'
sed -i "s/#anon_upload_enable=YES/anon_upload_enable=NO/g" '/etc/vsftpd/vsftpd.conf'
sed -i "s/#anon_mkdir_write_enable=YES/anon_mkdir_write_enable=NO/g" '/etc/vsftpd/vsftpd.conf'
sed -i "s/#chown_uploads=YES/chown_uploads=NO/g" '/etc/vsftpd/vsftpd.conf'
sed -i "s/#async_abor_enable=YES/async_abor_enable=YES/g" '/etc/vsftpd/vsftpd.conf'
sed -i "s/#ascii_upload_enable=YES/ascii_upload_enable=YES/g" '/etc/vsftpd/vsftpd.conf'
sed -i "s/#ascii_download_enable=YES/ascii_download_enable=YES/g" '/etc/vsftpd/vsftpd.conf'
sed -i "s/#ftpd_banner=Welcome to blah FTP service./ftpd_banner=Welcome to FTP service./g" '/etc/vsftpd/vsftpd.conf'

#添加下列内容到vsftpd.conf末尾
use_localtime=YES
listen_port=21
chroot_local_user=YES
idle_session_timeout=300
guest_enable=YES
guest_username=vsftpd
user_config_dir=/etc/vsftpd/configusers
data_connection_timeout=1
virtual_use_local_privs=YES
pasv_min_port=10060
pasv_max_port=10090
accept_timeout=5
connect_timeout=1

# 匿名用户相关设置
anon_root=/home/vsftpd/public
local_root=/home/vsftpd/public
chroot_local_user=YES
no_anon_password=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO

3 建立用户文件

# 第一行用户名,第二行密码,不能使用root为用户名
vi /etc/vsftpd/virtusers
admin
123456
userA
123456
userB
123456
userC
123456

4 生成用户数据文件

# 注意如果后面对 /etc/vsftpd/virtusers 用户文件的任意修改比如增加用户, 需要重新执行 db_load 的操作才会生效
db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db
# 设定PAM验证文件,并指定对虚拟用户数据库文件进行读取
chmod 600 /etc/vsftpd/virtusers.db 

5 修改/etc/pam.d/vsftpd文件

# 修改前先备份 
cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
# 将auth及account的所有配置行均注释掉
vi /etc/pam.d/vsftpd
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers
# 如果系统为32位,上面改为lib

6 新建系统用户vsftpd,用户目录为/home/vsftpd

#用户登录终端设为/bin/false(即:使之不能登录系统)
useradd vsftpd -d /home/vsftpd -s /bin/false
chown -R vsftpd:vsftpd /home/vsftpd

7 建立虚拟用户个人配置文件

mkdir /etc/vsftpd/configusers
cd /etc/vsftpd/configusers

#这里建立两个虚拟用户配合文件
touch admin

#建立用户根目录
mkdir -p /home/vsftpd/admin/

#编辑admin用户配置文件,内容如下,其他用户类似
vi admin

local_root=/home/vsftpd/admin/
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

8 防火墙设置

vi /etc/sysconfig/iptables-config
# 增加nf_conntrack_ftp, 也有文档ip_conntrack_ftp其实是它的别名
IPTABLES_MODULES="nf_conntrack_ftp"

# 保存上面的配置后在控制台执行下面的命令
iptables -A INPUT  -p tcp -m tcp --dport 21 -m conntrack --ctstate ESTABLISHED,NEW -j ACCEPT -m comment --comment "Allow ftp connections on port 21"
iptables -A OUTPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 21"
iptables -A INPUT  -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -m comment --comment "Allow ftp connections on port 20"
iptables -A OUTPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 20"
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 10060:10090 -j ACCEPT
iptables -A OUTPUT -m state --state NEW -p tcp --sport 10060:10090 -j ACCEPT
service iptables save
service iptables restart

# 如果以上设置不行则尝试进行下面的操作
# 如果以上设置不行则尝试进行下面的操作
# 如果以上设置不行则尝试进行下面的操作

# 这是替补方案
vi /etc/sysconfig/iptables
# 编辑iptables文件,添加如下内容,开启21端口

# Generated by iptables-save v1.4.7 on Wed Mar 21 13:50:00 2018
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -m comment --comment "Allow ftp connections on port 21" -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate RELATED,ESTABLISHED -m comment --comment "Allow ftp connections on port 20" -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 10060:10090 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -m comment --comment "Allow ftp connections on port 21" -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -m comment --comment "Allow ftp connections on port 20" -j ACCEPT
-A OUTPUT -p tcp -m state --state NEW -m tcp --sport 10060:10090 -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Wed Mar 21 13:50:00 2018

# 重启防火墙使配置生效
service iptables restart
# 或者
/etc/init.d/iptables restart

9 重启vsftpd服务器

service vsftpd restart

10 连接测试

  • 在部署 vsftpd 服务的同一台机器上进行内网测试
yum install ftp -y
ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 Welcome to FTP service.
Name (127.0.0.1:root): admin
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (127,0,0,1,39,88).
150 Here comes the directory listing.
226 Directory send OK.

# 至此说明内网可以访问
  • 在部署 vsftpd 服务的同一台机器上进行外网测试 (查看该服务器外网的ip为 10.10.10.10)
ftp -p 10.10.10.10
Connected to 10.10.10.10 (10.10.10.10).
220 Welcome to FTP service.
Name (10.10.10.10:root): admin
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (10,47,12,111,39,77).
150 Here comes the directory listing.
226 Directory send OK.

# 至此说明外网可以访问

11 Connection refused

# 查看 21 端口是否已开启
netstat -na --ip

# 在客户端测试
$ telnet ip.ip.ip.ip 21
Trying ip.ip.ip.ip...
telnet: connect to address ip.ip.ip.ip: Connection refused
telnet: Unable to connect to remote host

# 发现在客户端连接不上,尝试关闭 vsftpd 服务器的防火墙
service vsftpd stop

# 在客户端重新 telnet
telnet  ip.ip.ip.ip 21
Trying ip.ip.ip.ip...
Connected to v600000-97.dds.com.
Escape character is '^]'.
220 Welcome to FTP service.

# 发现连接成功,则问题出在防火墙的配置上
# 可以尝试把防火墙设置为 第8步的一模一样(注意备份)再试试

目录结构与成员权限配置

# 假设有以下目录结构
/home/vsftpd/
.
└── resources
    └── organization
        └── abc
            └── apps
                └── xyz
                    └── 4.5.1
                        ├── debug
                        │   ├── android
                        │   └── ios
                        └── release
                            ├── android
                            └── ios
vi /etc/vsftpd/vsftpd.conf
# 设置匿名用户只能访问 apps 目录
anon_root=/home/vsftpd/resources/organization/abc/apps
# 设置登录用户的默认访问目录 为abc, 权限比匿名用户高一级
local_root=/home/vsftpd/resources/organization/abc

#保存 重启 vsftpd
service vsftpd restart

遇到的问题

  • 发现有的用户可以登录, 但是有的用户报出 'Server response: '530 Login incorrect.' ' 错误
# 原因是由于在 /etc/vsftpd/virtusers 中增加/修改/删除了用户, 需要重新执行以下命令, 问题解决
db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db
service vsftpd restart

# 即对 /etc/vsftpd/virtusers 用户文件的任意修改, 需要重新执行 db_load 的操作才会生效

所以正确的新增/修改用户的步骤为

  1. 在 /etc/vsftpd/virtusers 文件中增加用户名密码
  2. 在 /etc/vsftpd/configusers 中新建该用户对应的配置文件
  3. 执行命令刷新数据库
db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db

上传文件失败 'Server response: '200 PORT command successful. Consider using PASV.''

# 将 /home/vsftpd 本身及其所有子目录子文件的权限和组都改为 vsftpd 用户, 普通用户才会有权限上传文件
chown -R vsftpd:vsftpd /home/vsftpd
ls -l
total 8
drwxr-xr-x. 2 vsftpd vsftpd 4096 Mar 21 19:19 android
drwxr-xr-x. 2 vsftpd vsftpd 4096 Mar 21 16:22 ios

参考链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 最近想自己造一个类似记事本的小轮子。因为感觉没必要用上复杂的后端(同时自己也懒),就打算把数据都交给前端来存储。说...
    吃土的小此方阅读 684评论 1 1
  • 本文为大家整理了 Google 开源的项目,看看有没有感兴趣的,排名顺序按照 Github ★Star 数排列。 ...
    haigle阅读 4,863评论 1 12
  • 《手》开拍前,我曾说,“慧心植木,百叶成林”,这段时间,谢谢我的慧心聚集的一百片叶子,感激不尽,高峰初出茅庐,能得...
    关馨仁阅读 269评论 0 1