FTP
(File Transfer Protocol) 文件傳輸協議,在互聯網上進行文件傳輸的協議,用於在Internet上控制文件的雙向傳輸,FTP服務端通常部署在企業內網,具有容易搭建,方便管理,安全穩定的特性。
TCP20端口 | FTP數據連接 | 用於數據傳輸:上傳、下載數據 |
---|---|---|
TCP21端口 | FTP控制連接 | 用於接受客戶端發出的相關FTP命令與參數 |
'網絡文件共享服務主流:ftp、nfs、samba'
FTP登錄用戶
匿名用戶--->系統用戶
系統用戶--->一般關閉
虛擬用戶--->系統用戶
FTP傳輸模式
'主動模式:服務端通過20端口主動向客戶端連接,傳輸數據。主動模式防火牆需要打開21和20端口
被動模式:服務端啓動隨機端口,等待客戶端發起連接,進行數據傳輸 防火牆只打開21和20端口,被動模式FTP不能下載數據'
總結:
FTP服務端啓用防火牆,開啓21/20端口,這時FTP只能工作在主動模式
FTP客戶端開啓防火牆,這時FTP只能選擇工作在被動模式
FTP客戶端和FTP服務端都有防火牆,那麼將無法使用FTP主動和被動模式
FTP服務安裝配置
'基礎環境準備'
[root@yaoxiaorong ~]# uname -r
3.10.0-693.el7.x86_64
[root@yaoxiaorong ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
'關閉防火牆以及selinux'
[root@yaoxiaorong ~]# systemctl stop firewalld
[root@yaoxiaorong ~]# systemctl disable firewalld
[root@yaoxiaorong ~]# setenforce 0
'安裝vsftpd服務並啓動服務'
[root@yaoxiaorong ~]# yum install vsftpd db4-utils -y
[root@yaoxiaorong ~]# systemctl start vsftpd
[root@yaoxiaorong ~]# systemctl enable vsftpd
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
'注意:默認使用匿名用戶訪問共享目錄站點爲/var/ftp僅擁有下載權限'
/etc/vsftpd/vsftpd.conf配置文件註釋
[root@yaoxiaorong ~]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=YES '是否啓用匿名用戶'
local_enable=YES '是否啓動本地用戶'
write_enable=YES '開啓全局上傳文件'
local_umask=022 '控制本地用戶上傳文件默認權限,通過ftp上傳文件的默認遮罩碼'
anon_umask=022 '控制匿名用戶上傳文件的默認權限'
anon_upload_enable=YES '允許匿名用戶上傳'
anon_mkdir_write_enable=YES '允許創建目錄'
dirmessage_enable=YES '配置用戶目錄顯示信息'
xferlog_enable=YES '啓動日誌'
xferlog_file=/var/log/vsftpd.log '指定日誌位置,配置xferlog_enable使用'
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES '是否作爲一個獨立守護進程運行'
chroot_local_user=YES '禁錮所有用戶在用戶目錄下'
chroot_lost_enable=YES '配合chroot_list_file使用'
chroot_list_file=/etc/vsftpd/chroot_list '禁錮用戶列表'
pam_service_name=vsftpd 'PAM認證文件'
userlist_enable=YES 'ftpusers文件下的用戶都被拒絕登陸訪問'
tcp_wrappers=YES
guest_enable=YES '開啓虛擬用戶'
guest_username=www 'FTP虛擬用戶對應的系統用戶'
user_config_dir=/etc/vsftpd/ftplogin '授權FTP虛擬用戶所在目錄'
權限控制
local_root=/data/ftp 指定本地用戶訪問目錄站點
anon_root=/data/ftp 指定匿名用戶訪問目錄站點
資源控制
anon_max_rate=500000 匿名用戶限速
local_max_rate=800000 本地用戶限速
max_clients=100 同時能接收多少請求
max_per_ip=2 一個IP同時能有多少連接
vsftpd虛擬用戶配置
準備環境,關閉防火牆和selinux
[root@yaoxiaorong ~]# setenforce 0
[root@yaoxiaorong ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@yaoxiaorong ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
[root@yaoxiaorong ~]# systemctl stop firewalld
[root@yaoxiaorong ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
vsftpd虛擬用戶的配置步驟如下:
'安裝依賴的程序'
[root@yaoxiaorong ~]# cd /etc/yum.repos.d/
[root@yaoxiaorong ~]# yum -y install wget
[root@yaoxiaorong ~]# wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
[root@yaoxiaorong yum.repos.d]# sed -i 's/\$releasever/7/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[root@yaoxiaorong yum.repos.d]# sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[root@yaoxiaorong ~]# yum -y install epel-release
[root@yaoxiaorong ~]# yum -y install vsftpd
[root@yaoxiaorong ~]# yum -y install db4* '安裝db4工具'
創建文本格式的用戶名、密碼列表,例如添加兩個用戶tom,yao,密碼分別爲123、456
[root@yaoxiaorong ~]# echo "tom" >> /etc/vsftpd/vu.list
[root@yaoxiaorong ~]# echo "123" >> /etc/vsftpd/vu.list
[root@yaoxiaorong ~]# echo "yao" >> /etc/vsftpd/vu.list
[root@yaoxiaorong ~]# echo "456" >> /etc/vsftpd/vu.list
[root@yaoxiaorong ~]# cat /etc/vsftpd/vu.list
456
tom
123
yao
456 '用戶名和密碼都是對應的,前面輸入的是賬戶,後面是密碼'
'將剛創建的文本格式用戶名、密碼文件使用db4工具轉換成數據庫文件'
-T表示轉換,-t表示加密方式使用hash算法加密
[root@yaoxiaorong ~]# db_load -T -t hash -f /etc/vsftpd/vu.list /etc/vsftpd/vu.db
'將文件權限設置爲600,提高虛擬用戶賬戶文件的安全性,避免數據外泄'
[root@yaoxiaorong ~]# chmod 600 /etc/vsftpd/vu.*
[root@yaoxiaorong ~]# ll /etc/vsftpd/vu.*
-rw-------. 1 root root 12288 Aug 8 17:26 /etc/vsftpd/vu.db
-rw-------. 1 root root 20 Aug 8 17:18 /etc/vsftpd/vu.list
添加虛擬用戶的映射賬戶、創建ftp根目錄。例如將使用的ftp根目錄設置爲/var/ftproot 映射賬號的名稱爲vftp
[root@yaoxiaorong ~]# useradd -d /var/ftproot -s /sbin/nologin vftp
[root@yaoxiaorong ~]# chmod 755 /var/ftproot
[root@yaoxiaorong ~]# ll -d /var/ftproot
drwxr-xr-x. 3 vftp vftp 78 Aug 8 17:50 /var/ftproot
'爲虛擬用戶建立PAM認證'
[root@yaoxiaorong ~]# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
[root@yaoxiaorong ~]# vim /etc/pam.d/vsftpd
#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/vu
account required pam_userdb.so db=/etc/vsftpd/vu
添加虛擬用戶支持,修改配置文件
[root@yaoxiaorong ~]# echo 'guest_enable=YES' >> /etc/vsftpd/vsftpd.conf '允許其他人可以登陸'
[root@yaoxiaorong ~]# echo 'guest_username=vftp' >> /etc/vsftpd/vsftpd.conf '添加其他用戶名字爲vftp'
[root@yaoxiaorong ~]# echo 'user_config_dir=/etc/vsftpd/vusers_dir' >> /etc/vsftpd/vsftpd.conf
[root@yaoxiaorong ~]# echo 'allow_writeable_chroot=YES' >>/etc/vsftpd/vsftpd.conf
'創建/etc/vsftpd/vusers_dir目錄,使tom可以上傳文件和創建目錄,而yao只能默認的下載權限'
[root@yaoxiaorong ~]# mkdir /etc/vsftpd/vusers_dir
[root@yaoxiaorong ~]# ll /etc/vsftpd
total 36
-rw-------. 1 root root 125 Aug 3 2017 ftpusers
-rw-------. 1 root root 361 Aug 3 2017 user_list
-rw-------. 1 root root 5116 Aug 8 18:08 vsftpd.conf
-rwxr--r--. 1 root root 338 Aug 3 2017 vsftpd_conf_migrate.sh
-rw-------. 1 root root 12288 Aug 8 17:26 vu.db
-rw-------. 1 root root 20 Aug 8 17:18 vu.list
drwxr-xr-x. 2 root root 6 Aug 8 18:21 vusers_dir
'使tom用戶可以上傳文件,創建目錄'
[root@yaoxiaorong ~]# echo 'anon_upload_enable=YES' >> /etc/vsftpd/vusers_dir/tom 允許匿名用戶上傳
[root@yaoxiaorong ~]# echo 'anon_mkdir_write_enable=YES' >>/etc/vsftpd/vusers_dir/tom 允許匿名用戶創建目錄,但是不能刪除
[root@yaoxiaorong ~]# echo 'anon_umask=022' >> /etc/vsftpd/vusers_dir/tom 控制匿名用戶上傳文件文件的默認權限
[root@yaoxiaorong ~]# echo 'anon_other_write_enable=YES' >> /etc/vsftpd/vusers_dir/tom 允許匿名用戶創建和刪除目錄
'使yao用戶有默認的下載權限,創建一個名叫yao的空文件'
[root@yaoxiaorong ~]# touch /etc/vsftpd/vusers_dir/yao
'啓動服務'
[root@yaoxiaorong ~]# systemctl start vsftpd
[root@yaoxiaorong ~]# systemctl enable vsftpd
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
root@yaoxiaorong ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 32 :::21 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
使用腳本創建vsftpd虛擬用戶配置
[root@yaoxiaorong ~]# vim ftp.sh
#!/bin/bash
yonghu=tom
yonghu2=jerry
STOREAGE=/etc/vsftpd/vusers_dir
setenforce 0
sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
systemctl stop firewalld
systemctl disable firewalld
cd /etc/yum.repos.d/
mv * /tmp/
curl -o 163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
sed -i 's/\$releasever/7/g' /etc/yum.repos.d/163.repo
sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/163.repo
yum -y install epel-release &>/dev/null
yum -y install vsftpd &>/dev/null
yum -y install db4* &>/dev/null
echo "$yonghu" > /etc/vsftpd/vu.list
echo '123' >> /etc/vsftpd/vu.list
echo "$yonghu2" >> /etc/vsftpd/vu.list
echo '456' >> /etc/vsftpd/vu.list
db_load -T -t hash -f /etc/vsftpd/vu.list /etc/vsftpd/vu.db
chmod 600 /etc/vsftpd/vu.*
useradd -d /var/ftproot -s /sbin/nologin vftp
chmod 755 /var/ftproot/
mv /etc/pam.d/vsftpd{,.bak}
cat > /etc/pam.d/vsftpd <<EOF
#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/vu
account required pam_userdb.so db=/etc/vsftpd/vu
EOF
echo 'guest_enable=YES' >> /etc/vsftpd/vsftpd.conf
echo 'guest_username=vftp' >> /etc/vsftpd/vsftpd.conf
echo 'user_config_dir=/etc/vsftpd/vusers_dir' >> /etc/vsftpd/vsftpd.conf
echo 'allow_writeable_chroot=YES' >>/etc/vsftpd/vsftpd.conf
if [ ! -d $STOREAGE ];then
mkdir -p $STOREAGE
fi
echo 'anon_upload_enable=YES' >> /etc/vsftpd/vusers_dir/$yonghu
echo 'anon_mkdir_write_enable=YES' >> /etc/vsftpd/vusers_dir/$yonghu
echo 'anon_umask=022' >> /etc/vsftpd/vusers_dir/$yonghu
echo 'anon_other_write_enable=YES' >> /etc/vsftpd/vusers_dir/$yonghu
touch /etc/vsftpd/vusers_dir/$yonghu1
systemctl start vsftpd
systemctl enable vsftpd