CentOS 配置 vsftpd 搭建 ftp 服务

需求:

要在公司内网搭建一个 ftp 服务,基本满足以下场景即可:

  • 研发同学可以使用自己的账号上传/下载文件到各自的 home 目录
  • 大家都可以将某些文件放在某个公共目录,所有人都可以免密码通过 ftp 协议在浏览器查看这些公共目录及其中的文件.

第二个需求主要是为了方便美工妹妹: 美工可以登录自己的ftp账号上传原型图,切图等文件,然后将 ftp 协议的 url 发给研发同学们. 研发同学可以在浏览器打开这个 url,或者使用 ftp 软件查看,但不能修改其中的内容.

另1: 美工妹妹用了 Marketch 这个东西做原型,可以把原型做成网页,可以直接在原型图上下载切图,配合浏览器使用,还是很方便的.
另2: 公司内网服务器安装了 CentOs 6.5

搭建:

大家各自访问各自的 home 目录容易实现,网上很多配置vsftp的文章,这里不再赘述.

公共目录的建立也容易,就是修改 /etc/vsftpd/vsftpd.conf 设置匿名用户访问有只读权限即可.

所有实名用户都可以往公共目录仍东西,是受网上某篇大牛的文章启发,在每个人的 home 目录下,建立一个 ftp_public 目录,并用 mount --bind 命令将公共目录绑定到大家的这个目录下.

mount --bind /ftp_public /home/user/ftp_public

这样就可以实现第二个需求了.再利用 linux 权限管理,就可以实现公共目录中的各种文件权限设置了.

因为这个策略随时会有调整,因此并没有把挂载信息写进 fstab 里面去.写了个脚本,每次开机的时候执行下就可以了:

#!/bin/bash

#       AUTHOR : liuxu
#       DATE   : 2016-11-23
#       mount public ftp directory for each developer

FTP_DIR=/ftp_public
FTP_DIR_NAME=ftp_public

if [ $UID -ne 0 ]; then
    echo "only root can run this script"
else
    # 这里执行了一个外部脚本,将用户账号列表导入进来.
    # 这样做是为了将脚本与人员配置分开.
    source developer_list
    for u in ${DEVELOPERS[@]}; do
        if [ -d /home/$u ]; then
            echo "setup public ftp dir for $u"
            d=/home/$u/$FTP_DIR_NAME;
            if [ ! -d $d ]; then
                mkdir $d
                # 因为是用 root 等账户运行该脚本,因此需要把目录权限改成各个账号的
                # 开发账号都在一个叫 techops 的组里,因此把属主也改了,便于后续管理
                chown "$u:techops" $d
            fi  
            mount --bind $FTP_DIR $d
        else
            echo "setup public ftp dir for $u, home dir not found"
        fi  
    done
fi

# 下面这两句后面会有介绍的,都与 selinux 的权限有关
setsebool allow_ftpd_full_access on
chcon -R -t public_content_t /ftp_public

人员配置信息被放在了另外的文件,目的是将配置和罗辑分开. 配置文件如下:

#!/bin/bash
#       AUTHOR : liuxu
#       DATE   : 2016-11-23

DEVELOPERS=(\
    JonSnow\
    RobStark\
    SansaStark\
    AryaStark\
    BrandonStark\
    RickonStark\
    JaimeLannister\
    TyrionLannister\
    CeiseLannister\
)

当然我可以这么做是因为用户不多,所以没有开启 vsftpd 虚拟用户功能.
如果开启的虚拟用户,还要建立公共目录,就没再继续研究了.

但是:

岂能尽如人意...似乎没有啥东西能一帆风顺的搞下来.(好吧,其实是好搞的大家记不住).
主要是各种权限问题.一开始看 vsftpd 配置文件没错,没有头绪.后来查到,奇怪的权限问题,多半是 SeLinux 的设置问题导致的.
网上有说直接关掉 SeLinux 的,一了百了.其实在我的使用场景上也是可以这么做的.因为公司小,人少,又是内网,关了完全没问题.
但作为一个文(zhuang)艺(bi)程序员,怎么能干这么不优雅的事情呢.还是要动手解决.

权限问题:

遇到了很多权限问题,当时没有记录下来,大体有

  • "550 Permission Deny" 问题
  • 浏览器不能列出公共目录问题
  • 文件浏览器 (both windows and ubuntu) 不能浏览ftp目录问题

因为遇到问题时没有记录,没法分条写下解决方案.但其实套路就是:

  1. 查看 /etc/vsftpd/vsftpd.conf 相关配置是否正确
  2. 打开默认关闭的 SeLinux 相关选项
  3. 用户登录问题可能需要修改 PAM: /etc/pam.d/vsftpd . 因为没遇到类似问题,因此没深入了解.

vsftpd 的配置方法网上铺天盖地,不赘述.
ftp 与 SeLinux 相关的内容,个人觉得网上各位的叙述太杂乱了.不过这也没办法,大家遇到的问题各自不一样,各自的环境也不一样.
但其实,没必要那么麻烦遇到每个 SeLinux 相关问题都去网上找的.自己看看相关配置,很快就可以搞定的.

首先查看与 ftp 相关的选项:

$ getsebool -a | grep ftp
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> on
ftpd_connect_db --> off
ftpd_use_fusefs --> off
ftpd_use_passive_mode --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_use_cifs --> off
tftp_use_nfs --> off

然后... 自己挨个查查每个选项的意思吧,然后试试,看看把哪个选项打开能解决自己的问题.
其实看着这些字段名,再稍微搜索下,各种权限问题就都可以很快解决的.

$ setsebool ftpd_use_passive_mode on
$ setsebool allow_ftpd_full_access on

配置防火墙端口问题:

主动模式下配置 iptables 开启 20 及 21 端口即可:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT</pre>

被动模式下需要开一个端口号段:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 7500:7600 -j ACCEPT</pre>

这段打算用到时再研究, 内网安全不重要, 先保证能用就成.

公共目录配置 SeLinux 权限问题:

然后就是遇到了一个怎么搜索都没搜到解决办法的问题:
某次服务器重启后,无论实名还是匿名访问公共目录,目录下的目录可以显示,但目录下的文件都显示不出来了.访问其他目录都正常.

各种地方都搜了,都没有搜到有人碰到类似问题. 后来自己尝试调了下上文列出的 SeLinux 参数,实名用户倒是可以正常访问公共目录了. 但匿名用户依然有问题.
再后来,因为查另一个问题,去了 redhat 官网,顺便搜了下这个问题. 这才解决掉.
其实就是执行下面这句:

chcon -R -t public_content_t /ftp_public</pre>

chcon 用于修改某对象的安全上下文. 上面那句就是说,设置要把某目录对匿名用户 (nobody) 开放. 这还是 SeLinux 的相关设置.
但为什么 ftp 公共目录在重启服务器前是可以正常访问的,我就不知道了. 有空还得详细的研究下 SeLinux .

总结:

上面遇到的全部问题,在 redhat 官网的这份文档中都已经给予解答了,只是我们总是想找快餐式答案,忽略了这些根基性的优质文档.
建议各位想要在 CentOS 上搭建 vsftp, 之前又没有经验的同学,先把这篇文档读通,多数问题就都知道怎么办了. 文档地址如下:
vsftpd deploy guide

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

推荐阅读更多精彩内容