CentOS 配置 vsftpd 搭建 ftp 服務(wù)

需求:

要在公司內(nèi)網(wǎng)搭建一個(gè) ftp 服務(wù),基本滿足以下場(chǎng)景即可:

  • 研發(fā)同學(xué)可以使用自己的賬號(hào)上傳/下載文件到各自的 home 目錄
  • 大家都可以將某些文件放在某個(gè)公共目錄,所有人都可以免密碼通過(guò) ftp 協(xié)議在瀏覽器查看這些公共目錄及其中的文件.

第二個(gè)需求主要是為了方便美工妹妹: 美工可以登錄自己的ftp賬號(hào)上傳原型圖,切圖等文件,然后將 ftp 協(xié)議的 url 發(fā)給研發(fā)同學(xué)們. 研發(fā)同學(xué)可以在瀏覽器打開這個(gè) url,或者使用 ftp 軟件查看,但不能修改其中的內(nèi)容.

另1: 美工妹妹用了 Marketch 這個(gè)東西做原型,可以把原型做成網(wǎng)頁(yè),可以直接在原型圖上下載切圖,配合瀏覽器使用,還是很方便的.
另2: 公司內(nèi)網(wǎng)服務(wù)器安裝了 CentOs 6.5

搭建:

大家各自訪問(wèn)各自的 home 目錄容易實(shí)現(xiàn),網(wǎng)上很多配置vsftp的文章,這里不再贅述.

公共目錄的建立也容易,就是修改 /etc/vsftpd/vsftpd.conf 設(shè)置匿名用戶訪問(wèn)有只讀權(quán)限即可.

所有實(shí)名用戶都可以往公共目錄仍東西,是受網(wǎng)上某篇大牛的文章啟發(fā),在每個(gè)人的 home 目錄下,建立一個(gè) ftp_public 目錄,并用 mount --bind 命令將公共目錄綁定到大家的這個(gè)目錄下.

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

這樣就可以實(shí)現(xiàn)第二個(gè)需求了.再利用 linux 權(quán)限管理,就可以實(shí)現(xiàn)公共目錄中的各種文件權(quán)限設(shè)置了.

因?yàn)檫@個(gè)策略隨時(shí)會(huì)有調(diào)整,因此并沒(méi)有把掛載信息寫進(jìn) fstab 里面去.寫了個(gè)腳本,每次開機(jī)的時(shí)候執(zhí)行下就可以了:

#!/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
    # 這里執(zhí)行了一個(gè)外部腳本,將用戶賬號(hào)列表導(dǎo)入進(jìn)來(lái).
    # 這樣做是為了將腳本與人員配置分開.
    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
                # 因?yàn)槭怯?root 等賬戶運(yùn)行該腳本,因此需要把目錄權(quán)限改成各個(gè)賬號(hào)的
                # 開發(fā)賬號(hào)都在一個(gè)叫 techops 的組里,因此把屬主也改了,便于后續(xù)管理
                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

# 下面這兩句后面會(huì)有介紹的,都與 selinux 的權(quán)限有關(guān)
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\
)

當(dāng)然我可以這么做是因?yàn)橛脩舨欢?所以沒(méi)有開啟 vsftpd 虛擬用戶功能.
如果開啟的虛擬用戶,還要建立公共目錄,就沒(méi)再繼續(xù)研究了.

但是:

豈能盡如人意...似乎沒(méi)有啥東西能一帆風(fēng)順的搞下來(lái).(好吧,其實(shí)是好搞的大家記不住).
主要是各種權(quán)限問(wèn)題.一開始看 vsftpd 配置文件沒(méi)錯(cuò),沒(méi)有頭緒.后來(lái)查到,奇怪的權(quán)限問(wèn)題,多半是 SeLinux 的設(shè)置問(wèn)題導(dǎo)致的.
網(wǎng)上有說(shuō)直接關(guān)掉 SeLinux 的,一了百了.其實(shí)在我的使用場(chǎng)景上也是可以這么做的.因?yàn)楣拘?人少,又是內(nèi)網(wǎng),關(guān)了完全沒(méi)問(wèn)題.
但作為一個(gè)文(zhuang)藝(bi)程序員,怎么能干這么不優(yōu)雅的事情呢.還是要?jiǎng)邮纸鉀Q.

權(quán)限問(wèn)題:

遇到了很多權(quán)限問(wèn)題,當(dāng)時(shí)沒(méi)有記錄下來(lái),大體有

  • "550 Permission Deny" 問(wèn)題
  • 瀏覽器不能列出公共目錄問(wèn)題
  • 文件瀏覽器 (both windows and ubuntu) 不能瀏覽ftp目錄問(wèn)題

因?yàn)橛龅絾?wèn)題時(shí)沒(méi)有記錄,沒(méi)法分條寫下解決方案.但其實(shí)套路就是:

  1. 查看 /etc/vsftpd/vsftpd.conf 相關(guān)配置是否正確
  2. 打開默認(rèn)關(guān)閉的 SeLinux 相關(guān)選項(xiàng)
  3. 用戶登錄問(wèn)題可能需要修改 PAM: /etc/pam.d/vsftpd . 因?yàn)闆](méi)遇到類似問(wèn)題,因此沒(méi)深入了解.

vsftpd 的配置方法網(wǎng)上鋪天蓋地,不贅述.
ftp 與 SeLinux 相關(guān)的內(nèi)容,個(gè)人覺(jué)得網(wǎng)上各位的敘述太雜亂了.不過(guò)這也沒(méi)辦法,大家遇到的問(wèn)題各自不一樣,各自的環(huán)境也不一樣.
但其實(shí),沒(méi)必要那么麻煩遇到每個(gè) SeLinux 相關(guān)問(wèn)題都去網(wǎng)上找的.自己看看相關(guān)配置,很快就可以搞定的.

首先查看與 ftp 相關(guān)的選項(xiàng):

$ 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

然后... 自己挨個(gè)查查每個(gè)選項(xiàng)的意思吧,然后試試,看看把哪個(gè)選項(xiàng)打開能解決自己的問(wèn)題.
其實(shí)看著這些字段名,再稍微搜索下,各種權(quán)限問(wèn)題就都可以很快解決的.

$ setsebool ftpd_use_passive_mode on
$ setsebool allow_ftpd_full_access on

配置防火墻端口問(wèn)題:

主動(dòng)模式下配置 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>

被動(dòng)模式下需要開一個(gè)端口號(hào)段:

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

這段打算用到時(shí)再研究, 內(nèi)網(wǎng)安全不重要, 先保證能用就成.

公共目錄配置 SeLinux 權(quán)限問(wèn)題:

然后就是遇到了一個(gè)怎么搜索都沒(méi)搜到解決辦法的問(wèn)題:
某次服務(wù)器重啟后,無(wú)論實(shí)名還是匿名訪問(wèn)公共目錄,目錄下的目錄可以顯示,但目錄下的文件都顯示不出來(lái)了.訪問(wèn)其他目錄都正常.

各種地方都搜了,都沒(méi)有搜到有人碰到類似問(wèn)題. 后來(lái)自己嘗試調(diào)了下上文列出的 SeLinux 參數(shù),實(shí)名用戶倒是可以正常訪問(wèn)公共目錄了. 但匿名用戶依然有問(wèn)題.
再后來(lái),因?yàn)椴榱硪粋€(gè)問(wèn)題,去了 redhat 官網(wǎng),順便搜了下這個(gè)問(wèn)題. 這才解決掉.
其實(shí)就是執(zhí)行下面這句:

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

chcon 用于修改某對(duì)象的安全上下文. 上面那句就是說(shuō),設(shè)置要把某目錄對(duì)匿名用戶 (nobody) 開放. 這還是 SeLinux 的相關(guān)設(shè)置.
但為什么 ftp 公共目錄在重啟服務(wù)器前是可以正常訪問(wèn)的,我就不知道了. 有空還得詳細(xì)的研究下 SeLinux .

總結(jié):

上面遇到的全部問(wèn)題,在 redhat 官網(wǎng)的這份文檔中都已經(jīng)給予解答了,只是我們總是想找快餐式答案,忽略了這些根基性的優(yōu)質(zhì)文檔.
建議各位想要在 CentOS 上搭建 vsftp, 之前又沒(méi)有經(jīng)驗(yàn)的同學(xué),先把這篇文檔讀通,多數(shù)問(wèn)題就都知道怎么辦了. 文檔地址如下:
vsftpd deploy guide

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容