[CentOS] 在 CentOS 7 系統中安裝 VSFTP 及配置FTP虛擬用戶


安装 vsFTP

[root@~]# yum -y install vsftpd

創建vsftp 使用的本地帳號

創建一個無法登錄shell的用戶
[root@~]# useradd -s /sbin/nologin vsftp
 
#將用戶添加到 webroot 組
[root@~]# usermod -G vsftp,webroot vsftp
[root@~]# groups vsftp
 
#此處將 /usr/share/nginx 做為 ftp 根目錄
#nginx 的默認屬主為 root, 此處不改動
#將 nginx 目錄下所有文件和文件夾屬主改為 vsftp, 組改為 webroot
[root@~]# chown -R vsftp:webroot /usr/share/nginx/*
#更改所有文件和文件夾權限為 664
[root@~]# chmod -R 664 /usr/share/nginx/*
#為所有文件夾增加x權限
[root@~]# find /usr/share/nginx/ -type d -exec chmod 774 {} \;
#html 目錄改回原來的屬性
[root@~]# chown -R nginx:nginx /usr/share/nginx/html
 

編輯配置文件

[root@~]# vi /etc/vsftpd/vsftpd.conf


 

配置 vsFTP 設定檔

完成安裝後,可以開啟 /etc/vsftpd/vsftpd.conf 檔案設置 VSFTP 的相關細節。
vi /etc/vsftpd/vsftpd.conf

注意 local_enable 要設為 YES,
因為雖然是虛擬帳號,但還是需要一個系統帳號,來當虛擬帳號登入時的身分。
anonymous_enable=NO #禁用匿名ftp
local_enable=YES   #使用虛擬用戶必須開啟
write_enable=YES  #允許任何ftp寫入
local_umask=022   #上傳的文件的權限
dirmessage_enable=YES #啟用目錄信息
xferlog_enable=YES    #啟用日誌
connect_from_port_20=YES     #使用20端口發起連接
ftpd_banner=Welcome to My FTP Server       #ftp連接歡迎語
chroot_local_user=YES    #禁止用戶瀏覽自己目錄以外的目錄
ls_recurse_enable=YES      #啟用循環目錄結構, 系統性能夠強才啟用.
listen=NO        #64位系統中禁用僅ipv4監聽
listen_ipv6=YES  #啟用ipv6監聽, 將同時監聽ipv4和ipv6
 
pam_service_name=vsftpd    #驗證模塊
userlist_enable=YES     #禁止 user_list 文件中列出的用戶登錄
tcp_wrappers=YES     #使用 tcp 防火墻
 
guest_enable=YES #啟用虛擬用戶
guest_username=vsftp #虛擬用戶綁定的本地用戶,虛擬帳號登入時,是化身為系統什麼帳號(e.g. nginx
virtual_use_local_privs=YES #虛擬用戶和本地用戶有相同權限
allow_writeable_chroot=YES #允許ftp根目錄可寫
user_config_dir=/etc/vsftpd/user_conf #虛擬用戶配置目錄

#以下是手動添加的(可增加在最末行)
allow_writeable_chroot=YES
pasv_enable=YES
pasv_min_port=30000 #被動模式中使用的最小端口
pasv_max_port=35000 #被動模式中使用的最大端口
 
 

建立虛擬用戶名單文件

生成vsftpd虛擬用戶數據庫文件
[root@~]# vi /etc/vsftpd/ftpuser

輸入以下內容(格式:“一行用戶名,一行密碼!”)
ftp1
pass1
ftp2
pass2

生成虛擬用戶數據文件

再來將帳密文件轉成資料庫檔案,這樣 vsftpd 才可以在認證時使用
[root@~]# db_load -T -t hash -f /etc/vsftpd/ftpuser /etc/vsftpd/users.db
[root@~]# chmod 600 /etc/vsftpd/users.db

若系統沒 db_load 指令,可安裝 libdb-utils 
[root@~]# yum install libdb-utils
 

配置PAM驗證文件

[root@~]# vi /etc/pam.d/vsftpd
將原有內容註釋或刪除, 將以下內容加入到文件中.
修改完如下 
#%PAM-1.0
#session    optional     pam_keyinit.so    force revoke
#auth       required    pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
#auth       required    pam_shells.so
#auth       include     password-auth
#account    include     password-auth
#session    required     pam_loginuid.so
#session    include     password-auth

### 註解原本所有設定,加上以下兩行 
auth required pam_userdb.so db=/etc/vsftpd/users
account required pam_userdb.so db=/etc/vsftpd/users
 

創建虛擬用戶獨立配置文件

每個虛擬用戶必需有一個同用戶名相同的配置文件, 這個文件裡保存著對這個用戶的個性化配置, 裡面的屬性可以是vsftpd.conf 中的任何屬性.
創建虛擬用戶配置文件目錄, 這個目錄是在vsftpd.conf 中user_config_dir= 配置的.
[root@~]# mkdir /etc/vsftpd/user_conf

創建用戶配置文件,以用戶名命名.
[root@~]# vi /etc/vsftpd/user_conf/ftp1
寫入以下內容
local_root=/usr/share/nginx/html #當前用戶的ftp根目錄
idle_session_timeout=600
data_connection_timeout=120
max_clients=10 #最大連接數
max_per_ip=5 #最大線程數
local_max_rate=50000 #最大頻寬 此處限制為50K

啟動服務

systemctl enable vsftpd
systemctl start vsftpd
 

iptables 防火牆配置 #1

#如使用 firewalld 则可忽略本段設定。見:firewalld 防火牆配置

禁用firewalld 、啟用iptables.

yum install iptables-services
systemctl stop firewalld
systemctl disable firewalld
systemctl enable iptables
systemctl start iptables
systemctl enable ip6tables
systemctl start ip6tables
 

iptables 配置方法

剛安裝完iptables, 執行iptables -L 命令
[root@~]# iptables -L

列出以下配置
Chain INPUT (policy ACCEPT) #輸入
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED  #放行所有進入的正在建立連接或已建立連接的封包
ACCEPT     icmp --  anywhere             anywhere    #放行連入的icmp封包
ACCEPT     all  --  anywhere             anywhere    #放行所有進入封包
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh  #放行 ssh 封包
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited  
#拒絕所有進入封包
 
Chain FORWARD (policy ACCEPT) #轉發
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited  
#拒絕所有轉發封包
 
Chain OUTPUT (policy ACCEPT)  #輸出
target     prot opt source               destination

iptables 的匹配規則是按從上至下的順序判斷的, 遇到REJECT 如果匹配則停止查找規則. 所以要注意REJECT 項在規則中的順序, 避免影響其他規則.

把規則清除重新配置.
[root@~]# iptables -F  #清除所有表的规则
 
#設置 INPUT、FORWARD、及 OUTPUT 表
iptables -P INPUT DROP       #默認丟棄封包
iptables -P FORWARD DROP     #默認丟棄封包
iptables -P OUTPUT ACCEPT    #默認放行封包
 
iptables -A INPUT -i lo -j ACCEPT #允許本地網路訪問
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  #放行所有正在建立連接或已建立連接的封包

開放ssh 服務

[root@~]# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT #放行 ssh 端口

開放http 服務

iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
 

開放ftp 服務

iptables -A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 30000:35000 -j ACCEPT #被動模式中使用的端口範圍

開放mysql

iptables -A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
 

保存配置

service iptables save #保存
systemctl restart iptables #重啟服务


如果覺得以上太麻煩,熟悉 iptables 命令後可以直接編輯 iptables 配置。
[root@~]# vi /etc/sysconfig/iptables

用以下內容覆蓋原有內容, 注意規則順序.
*filter
:INPUT DROP [0:0]
:FORWARD DROP [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 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 30000:35000 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

保存退出, 重啟服務.
[root@~]# systemctl restart iptables


 

firewalld 防火牆配置 #2

#如使用 iptables 则可忽略本段設定。見:iptables 防火牆配置


檢查 firewalld 中是否已經啟用 vsftpd 服務。
#列出永久選項所支持的服務
[root@~]# firewall-cmd --permanent --get-services


沒有找到vsftpd 服務, 則需手動新增 vsftpd 服務

所有的系統預定義服務都在/usr/lib/firewalld/services 中, 自定義服務則在/etc/firewalld/services/
先從預定義服務中copy 一個到 /etc/firewalld/services/ 底下,命名為vsftp.xml
[root@~]# cp /usr/lib/firewalld/services/tftp.xml /etc/firewalld/services/vsftp.xml

編輯文件
[root@~]# vi /etc/firewalld/services/vsftp.xml


接著進行修改名稱、描述、協議和POST的定義,並刪除不必要的內容。
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>vsFtp</short>
  <description>vsftpd</description>
  <port protocol="tcp" port="20"/>
  <port protocol="tcp" port="21"/>
</service>
保存退出。
 

firewalld 啟用 vsftp 服務

開放 vsftp
[root@~]# firewall-cmd --permanent --add-service=vsftp
 
開放此端口範圍
[root@~]# firewall-cmd --permanent --add-port=30000-50000/tcp
 
重新加載配置設定
[root@~]# firewall-cmd --reload
 
設置 SEinux 允許使用者存取 home 目錄
[root@~]# setsebool -P ftp_home_dir on


列出目前開放的服務
[root@~]# firewall-cmd --list-all
 

啟用系統 vsftp 服務

[root@~]# systemctl restart vsftpd.service
[root@~]# systemctl enable vsftpd.service
 

建立使用者

[root@krizna ~]# useradd -m test -s /sbin/nologin
[root@krizna ~]# passwd 111111

這樣將可以使用 test 透過post 21 登入FTP。
可以使用 filezilla / winscp等FTP軟體進行測試。


以上 ftp 服務配置已大致完成。
 

常見問題

如果登錄時出現
500 OOPS: priv_sock_get_result. Connection closed by remote host.
這樣的錯誤,需要升級pam
yum update pam


 

回上一頁

相關文章:

喜歡這篇文章嗎?立即分享

Posted : / Views: 361
Last updated :2017-11-01