淺談FTP服務
FTP協議簡介
1️⃣特點
-
基於C/S架構
-
雙通道協議:數據和命令連接
-
數據傳輸格式:二進制(默認)和文本
- 注意:傳輸非文本時使用文本格式可能因操作系統不同導致文件內容變化,故應慎用
2️⃣兩種模式:從服務器角度
-
從建立數據連接時服務器的角色,分爲主動模式(PORT Style) 和被動模式(PASV Style)
-
無論主動模式還是被動模式,命令連接都是相同的,服務器端口爲21
-
被動(PASV style):客戶端主動連接
- 命令(控制):客戶端:隨機port —> 服務器:21/tcp
- 數據:客戶端:隨機port —> 服務器:隨機port /tcp
-
主動(PORT style):服務器主動連接
- 命令(控制):客戶端:隨機port —> 服務器:21/tcp
- 數據:客戶端:隨機port <—服務器:20/tcp
FTP軟件介紹
1️⃣FTP服務器端軟件
- Wu-ftpd,Proftpd,Pureftpd,Filezilla Server,Serv-U,Wing FTP Server,IIS
- vsftpd:Very Secure FTP Daemon,CentOS 默認FTP服務器
- 高速,穩定,下載速度是WU-FTP的兩倍
- ftp.redhat.com數據:單機最多可支持15000個併發
2️⃣客戶端軟件
-
命令行工具
ftp, lftp, lftpget, wget, curl
ftp -A ftpserver port -A主動模式 -p 被動模式
lftp -u username ftpserver
lftp username@ftpserver
lftpget ftp://ftpserver/pub/file -
圖形界面工具
filezilla, CuteFtp, FlashFXP, LeapFtp
瀏覽器 ftp://username:password@ftpserver
3️⃣FTP服務狀態碼:
1XX:信息 125:數據連接打開
2XX:成功類狀態 200:命令OK 230:登錄成功
3XX:補充類 331:用戶名OK
4XX:客戶端錯誤 425:不能打開數據連接
5XX:服務器錯誤 530:不能登錄
4️⃣用戶認證:三種方式
-
匿名用戶:ftp, anonymous, 對應Linux用戶ftp
-
系統用戶:Linux用戶, 用戶/etc/passwd, 密碼/etc/shadow
-
虛擬用戶:特定服務的專用用戶,獨立的用戶/密碼文件,需要配合的組件
- nsswitch: network service switch名稱解析框架
- pam: pluggable authentication module 用戶認證
- /lib64/security
- /etc/pam.d/
- /etc/pam.conf
vsftpd服務簡介
-
用戶認證配置文件:
/etc/pam.d/vsftpd
-
服務腳本:
CentOS 7:/usr/lib/systemd/system/vsftpd.service
CentOS 6:/etc/rc.d/init.d/vsftpd
-
配置文件:
/etc/vsftpd/vsftpd.conf
-
查詢幫助:
man 5 vsftpd.conf
- 格式:option=value
- 注意:= 前後不要有空格
-
共享文件位置:
- 匿名用戶(映射爲系統用戶ftp)共享文件位置:ftp用戶家目錄
/var/ftp
- 系統用戶共享文件位置:用戶家目錄
- 虛擬用戶共享文件位置:爲其映射的系統用戶的家目錄
- 匿名用戶(映射爲系統用戶ftp)共享文件位置:ftp用戶家目錄
vsftpd配置
端口設置
1️⃣命令端口
listen_port=21
2️⃣主動模式端口
- 配置文件
connect_from_port_20=YES // 主動模式端口爲20
// 注意即使指定其他端口此時值仍是YES,不可修改爲NO
ftp_data_port=20 // 指定主動模式的端口
- 示例:將主動模式的端口修改爲2020
// vsftp服務器配置文件
vim /etc/vsftpd/vsftpd.conf
connect_from_port_20=YES
ftp_data_port=2020
systemctl restart vsftpd
// 製作共享內容大文件
cd /var/ftp/pub
[root@Centos7 pub]# dd if=/dev/zero of=file1 bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 3.20398 s, 335 MB/s
// 客戶端匿名下載文件 用主動模式
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (172,20,54,1,140,170).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 1073741824 Dec 17 12:15 file1
-rw-r--r-- 1 0 0 0 Dec 17 11:54 text1.txtr
226 Directory send OK.
ftp> passive //關閉被動模式,開啓主動模式
Passive mode off.
ftp> get file1
local: file1 remote: file1
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for file1 (1073741824 bytes).
226 Transfer complete.
1073741824 bytes received in 61 secs (17591.85 Kbytes/sec)
// 在服務端查看端口情況
[root@Centos7 pub]# ss -ntp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 36 172.20.54.1:22 172.20.3.69:52665 users:(("sshd",pid=2095,fd=3))
ESTAB 0 6992 [::ffff:172.20.54.1]:2020 [::ffff:172.20.54.2]:33552 users:(("vsftpd",pid=3294,fd=7))
ESTAB 0 0 [::ffff:172.20.54.1]:21 [::ffff:172.20.54.2]:60504 users:(("vsftpd",pid=3294,fd=2),("vsftpd",pid=3294,fd=1),("vsftpd",pid=3294,fd=0),("vsftpd",pid=3292,fd=2),("vsftpd",pid=3292,fd=1),("vsftpd",pid=3292,fd=0))
3️⃣被動模式端口範圍
- 配置文件
linux 客戶端默認使用被動模式
windows 客戶端默認使用主動模式
pasv_min_port=6000 // 端口起始範圍,0爲隨機分配
pasv_max_port=6010 // 端口結束範圍
- 示例:設置被動模式的端口範圍爲6000-6010
/ 修改配置文件
vim /etc/vsftpd/vsftpd.conf
connect_from_port_20=YES
pasv_min_port=6000
pasv_max_port=6010
systemctl restart vsftpd
/ 製作共享文件
cd /var/ftp/pub
dd if=/dev/zero of=file1 bs=1M count=1024
dd if=/dev/zero of=file2 bs=1M count=1024
dd if=/dev/zero of=file3 bs=1M count=1024
/ 分別在三個服務端用匿名賬戶下載文件
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> get file1|file2|file3
/ 在服務器端查看端口,數據傳輸時打開了3個端口
[root@Centos7 pub]# ss -ntp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 36 172.20.54.1:22 172.20.3.69:52665 users:(("sshd",pid=2095,fd=3))
ESTAB 0 6992 [::ffff:172.20.54.1]:6006 [::ffff:172.20.54.2]:53726 users:(("vsftpd",pid=3339,fd=7))
ESTAB 0 0 [::ffff:172.20.54.1]:21 [::ffff:172.20.54.3]:45388 users:(("vsftpd",pid=3342,fd=2),("vsftpd",pid=3342,fd=1),("vsftpd",pid=3342,fd=0),("vsftpd",pid=3340,fd=2),("vsftpd",pid=3340,fd=1),("vsftpd",pid=3340,fd=0))
ESTAB 0 2648 [::ffff:172.20.54.1]:6000 [::ffff:172.20.54.4]:53298 users:(("vsftpd",pid=3345,fd=7))
ESTAB 0 7944 [::ffff:172.20.54.1]:6001 [::ffff:172.20.54.3]:59713 users:(("vsftpd",pid=3342,fd=7))
ESTAB 0 0 [::ffff:172.20.54.1]:21 [::ffff:172.20.54.2]:60506 users:(("vsftpd",pid=3339,fd=2),("vsftpd",pid=3339,fd=1),("vsftpd",pid=3339,fd=0),("vsftpd",pid=3337,fd=2),("vsftpd",pid=3337,fd=1),("vsftpd",pid=3337,fd=0))
ESTAB 0 0 [::ffff:172.20.54.1]:21 [::ffff:172.20.54.4]:36286 users:(("vsftpd",pid=3345,fd=2),("vsftpd",pid=3345,fd=1),("vsftpd",pid=3345,fd=0),("vsftpd",pid=3343,fd=2),("vsftpd",pid=3343,fd=1),("vsftpd",pid=3343,fd=0))
時間設置
use_localtime=YES
:使用當地時間(默認爲NO,使用GMT,但當前設置值NO爲正確時間)
匿名用戶登錄
1️⃣配置文件條目
anonymous_enable=YES // 支持匿名用戶
no_anon_password=YES // 匿名用戶略過口令檢查,默認NO
anon_world_readable_only=NO // 只能下載所有者、所屬組、其他人都有讀權限的文件,默認YES
anon_upload_enable=YES // 匿名上傳,注意文件系統權限
anon_mkdir_write_enable=YES // 匿名創建目錄
anon_other_write_enable=YES // 可刪除和修改上傳的文件
anon_umask=077 // 指定匿名上傳umask
// 指定上傳文件的默認所有者和權限
chown_uploads=YES //默認NO
chown_username=wang
chown_upload_mode=0644
2️⃣實驗:修改vsftpd服務匿名登錄配置
- 實驗2-1,輸入用戶名ftp後,自動登陸成功
/ 修改配置文件
vim /etc/vsftpd/vsftpd.conf
no_anon_password=YES
systemctl restart vsftpd
/ 客戶端登錄效果
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftp
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
- 實驗2-2,實現匿名上傳文件
/ 修改配置文件
vim /etc/vsftpd/vsftpd.conf
anon_upload_enable=YES
/ 匿名登錄的根目錄不能上傳文件,創建子目錄並賦予相應權限,實現文件上傳
/ 注意匿名登錄時根目錄不能擁有所屬組和其他人的寫權限,否則會報錯
mkdir -p /var/ftp/upload
setfacl -m u:ftp:rwx /var/ftp/upload
systemctl restart vsftpd
/ 客戶端測試效果
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftp
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> !ls
anaconda-ks.cfg file1 mysql-createDB.sql poweradmin-2.1.7.tgz text1.txtr
ftp> put anaconda-ks.cfg
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (172,20,54,1,23,116).
553 Could not create file. / 根目錄是不能上傳文件,不能有讀寫權限
ftp> cd upload
250 Directory successfully changed.
ftp> put anaconda-ks.cfg / put 上傳本地文件
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (172,20,54,1,23,116).
150 Ok to send data.
226 Transfer complete.
1615 bytes sent in 0.00112 secs (1439.39 Kbytes/sec)
ftp> ls / 上傳文件成功
227 Entering Passive Mode (172,20,54,1,23,119).
150 Here comes the directory listing.
-rw------- 1 14 50 1615 Dec 17 12:48 anaconda-ks.cfg
226 Directory send OK.
- 實驗2-3,實現匿名環境下:上傳、刪除、下載文件,建立目錄,上傳文件權限爲644
/ 修改配置文件,注意上面2-2實驗已經啓用upload權限,所以下面沒寫
vim /etc/vsftpd/vsftpd.conf
anon_world_readable_only=NO
anon_mkdir_write_enable=YES
anon_other_write_enbale=YES
anon_umask=022
/ 客戶端實現上傳文件權限爲644
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftp
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd upload
250 Directory successfully changed.
ftp> put anaconda-ks.cfg
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (172,20,54,1,23,112).
150 Ok to send data.
226 Transfer complete.
1615 bytes sent in 0.00035 secs (4614.29 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,118).
150 Here comes the directory listing.
-rw-r--r-- 1 14 50 1615 Dec 17 12:57 anaconda-ks.cfg
226 Directory send OK.
/ 客戶端實現匿名下載文件
ftp> get fstab
local: fstab remote: fstab
227 Entering Passive Mode (172,20,54,1,23,115).
150 Opening BINARY mode data connection for fstab (595 bytes).
226 Transfer complete.
595 bytes received in 5.4e-05 secs (11018.52 Kbytes/sec)
ftp> !ls
fstab
/ 客戶端實現匿名刪除文件
ftp> delete anaconda-ks.cfg
250 Delete operation successful.
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,120).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 595 Dec 17 12:59 fstab
226 Directory send OK.
/ 客戶端實現匿名創建目錄
ftp> mkdir dir1
257 "/upload/dir1" created
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,122).
150 Here comes the directory listing.
drwxr-xr-x 2 14 50 6 Dec 17 13:01 dir1
-rw-r--r-- 1 0 0 595 Dec 17 12:59 fstab
226 Directory send OK.
- 實驗2-4,實現確定匿名上傳文件的所有者和權限
/ 修改配置文件,上傳權限上面實驗配置文件已經開啓
vim /etc/vsftpd/vsftpd.conf
chown_uploads=YES
chown_username=yijie / 用戶必須是服務端有的賬戶
chown_upload_mode=0644
systemctl restart vsftpd
/ 客戶端測試效果
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftp
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd upload
250 Directory successfully changed.
ftp> put anaconda-ks.cfg
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (172,20,54,1,23,120).
150 Ok to send data.
226 Transfer complete.
1615 bytes sent in 0.000242 secs (6673.55 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,121).
150 Here comes the directory listing.
/ 在客戶端查看只顯示ID
-rw-r--r-- 1 1000 50 1615 Dec 17 13:08 anaconda-ks.cfg
drwxr-xr-x 2 14 50 6 Dec 17 13:01 dir1
-rw-r--r-- 1 0 0 595 Dec 17 12:59 fstab
226 Directory send OK.
/ 服務器器端查看文件
[root@Centos7 upload]# ll
total 8
-rw-r--r-- 1 yijie ftp 1615 Dec 17 21:09 anaconda-ks.cfg
[root@Centos7 upload]# id yijie
uid=1000(yijie) gid=1000(yijie) groups=1000(yijie)
linux系統用戶
- 配置文件條目
guest_enable=YES // 所有系統用戶都映射成guest用戶
guest_username=ftp // 配合上面選項才生效,指定guest用戶
local_enable=YES // 是否允許linux用戶登錄
write_enable=YES // 允許linux用戶上傳文件
local_umask=022 // 指定系統用戶上傳文件的默認權限
local_root=/ftproot // 非匿名用戶登錄所在目錄
// 禁錮所有系統用戶在家目錄中
chroot_local_user=YES // 禁錮系統用戶,默認NO,即不禁錮
// 禁錮或不禁錮特定的系統用戶在家目錄中,與上面設置功能相反
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
// 當chroot_local_user=YES時,則chroot_list中用戶不禁錮,白名單
// 當chroot_local_user=NO時,則chroot_list中用戶禁錮,黑名單
- 實驗1:將用戶test禁錮在家目錄
/ 修改配置文件
vim /etc/vsftpd/vsftpd.conf
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
echo "test" >> /etc/vsftpd/chroot_list
systemctl restart vsftpd
/ 客戶端測試
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): test
331 Please specify the password.
Password:
/ 這裏報錯是因爲根目錄不能有寫權限,所以報錯
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection
/ 在客戶端修改test家目錄權限
[root@Centos7 ~]# chmod 544 /home/test
[root@Centos7 ~]# ll ~test -d
dr-xr--r-- 2 test test 62 Dec 17 21:15 /home/test
/ 繼續客戶端測試
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): test
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/" / 已經禁錮在test自己的家目錄中
ftp> quit
221 Goodbye.
/ 用test2賬戶登錄,沒有禁錮這個用戶,可以隨意切換目錄
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): test2
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/test2"
ftp> cd /etc/
250 Directory successfully changed.
日誌
- wu-ftp日誌:默認啓用
xferlog_enable=YES 啓用記錄上傳下載日誌,此爲默認值
xferlog_std_format=YES 使用wu-ftp日誌格式,此爲默認值
xferlog_file=/var/log/xferlog 可自動生成, 此爲默認值
- vsftpd日誌:默認不啓用
dual_log_enable=YES 使用vsftpd日誌格式,默認不啓用
vsftpd_log_file=/var/log/vsftpd.log 可自動生成, 此爲默認值
- 示例:開啓vsftpd.log日誌文件
vim /etc/vsftpd/vsftpd.conf
systemctl restart vsftpd
/ 開啓日誌文件追蹤,記錄登錄信息
[root@Centos7 upload]# tail -F /var/log/vsftpd.log
Tue Dec 17 21:46:43 2019 [pid 3844] CONNECT: Client "::ffff:172.20.54.2"
Tue Dec 17 21:47:06 2019 [pid 3843] [test2] FAIL LOGIN: Client "::ffff:172.20.54.2"
Tue Dec 17 21:47:12 2019 [pid 3850] CONNECT: Client "::ffff:172.20.54.2"
Tue Dec 17 21:47:15 2019 [pid 3849] [ftp] OK LOGIN: Client "::ffff:172.20.54.2", anon password "<no_password>"
Tue Dec 17 21:47:36 2019 [pid 3854] CONNECT: Client "::ffff:172.20.54.3"
Tue Dec 17 21:47:42 2019 [pid 3853] [test2] OK LOGIN: Client "::ffff:172.20.54.3"
/ 記錄刪除 上傳 下載
Tue Dec 17 21:51:10 2019 [pid 3861] [ftp] OK DELETE: Client "::ffff:172.20.54.2", "/upload/anaconda-ks.cfg"
Tue Dec 17 21:51:16 2019 [pid 3861] [ftp] OK UPLOAD: Client "::ffff:172.20.54.2", "/upload/anaconda-ks.cfg", 1615 bytes, 772.73Kbyte/sec
Tue Dec 17 21:51:45 2019 [pid 3861] [ftp] OK DOWNLOAD: Client "::ffff:172.20.54.2", "/upload/fstab", 595 bytes, 318.04Kbyte/sec
提示信息
- 登錄提示信息
ftpd_banner=“welcometo test ftp server"
banner_file=/etc/vsftpd/ftpbanner.txt //本條記錄優先生效
- 目錄訪問提示信息
dirmessage_enable=YES // (默認)
message_file=.message // (默認)信息存放在指定目錄下.message
- 示例:設置歡迎信息,登錄時顯示:“this is test ftp service”, 進入pub子目錄時顯示"public directory",進入upload子目錄時顯示"upload directory"
vim /etc/vsftpd/vsftpd.conf
banner_file=/etc/vsftpd/ftpbanner.txt
/ 生成歡迎信息
[root@Centos7 upload]# echo "this is test ftp service" > /etc/vsftpd/ftpbanner.txt
[root@Centos7 upload]# echo "pubilc directory"> /var/ftp/pub/.message
[root@Centos7 upload]# echo "upload directory"> /var/ftp/upload/.message
systemctl restart vsftpd
/ 客戶端測試
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220-this is test ftp service / 歡迎信息
220
Name (172.20.54.1:root): ftp
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250-pubilc directory / 目錄提示信息
250 Directory successfully changed.
ftp> cd ../upload
250-upload directory / 目錄說明信息
250 Directory successfully changed.
登錄控制
-
使用pam完成用戶認證
- 在/etc/vsfptd/vsftpd.conf配置文件中:
pam_service_name=vsftpd
:指明引用的pam配置文件路徑- pam配置文件路徑:/etc/pam.d/vsftpd,格式如下
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed / 當sense=deny時,拒絕/etc/vsftpd/ftpusers文件中用戶登錄 / 當sense=allow時,允許/etc/vsftpd/ftpusers文件中用戶登錄
-
啓用控制用戶登錄的列表文件
userlist_enable=YES / 默認有此設置
userlist_deny=YES / 黑名單,默認值,不提供輸入口令的機會,NO爲白名單
userlist_file=/etc/vsftpd/users_list / 用戶列表文件,此爲默認值
- 連接限制
max_clients=0 / 最大併發連接數,0爲無限制
max_per_ip=0 / 每個IP同時發起的最大連接數,0爲無限制
- vsftpd服務指定用戶身份運行:
nopriv_user=nobody
此爲默認值 - 實驗:實現用戶登錄控制
- 實驗1-1:使用pam禁止用戶test2登錄ftp服務
vim /etc/pam.d/vsftpd / 保證sense=deny
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
echo "test2">> /etc/vsftpd/ftpusers
/ 客戶端測試效果
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): test2
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
ftp>
- 實驗1-2:使用用戶列表禁止用戶test登錄ftp服務
/ 因爲userlist_deny=YES (default),所以userlist 是禁止登錄用戶列表
echo "test" >> /etc/vsftpd/user_list
/ 客戶端測試
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): test
530 Permission denied. / 直接拒絕 不會讓你輸入密碼
Login failed.
- 實驗1-3:限制最大併發連接數爲2,相同IP同時連接數爲2
vim /etc/vsftpd/vsftpd.conf
max_clients=5
max_per_ip=2
systemctl restart vsftpd
/ 客戶端測試效果,用同一個IP去連接ftp
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
421 There are too many connections from your internet address.
ftp>
傳輸控制
- 傳輸速率:字節/秒
anon_max_rate=0 / 匿名用戶的最大傳輸速率
local_max_rate=0 / 本地用戶的最大傳輸速率
- 連接時間:秒爲單位
connect_timeout=60 / 主動模式數據連接超時時長
accept_timeout=60 / 被動模式數據連接超時時長
data_connection_timeout=300 / 數據連接無數據傳輸超時時長
idle_session_timeout=60 / 無命令操作超時時長
- 優先以文本方式傳輸
ascii_upload_enable=YES
ascii_download_enable=YES
- 實驗1-1:限制匿名登錄用戶傳輸速度爲1M/s,限制系統登錄用戶傳輸速度爲2M/s
vim /etc/vsftpd/vsftpd.conf
anno_max_rate=1024000
local_max_rate=2048000
systemctl restart vsftpd
/ 準備test家目錄權限以及文件
mkdir /home/test/pub
setfacl -m u:test:rwx /home/test/pub
cp /var/ftp/file1 /home/test/pub/ / file1文件是前面實驗留下的大文件
- 客戶端測試效果
實現基於SSL的ftps
- 查看是否支持SSL,確實存在
ldd `which vsftpd`
[root@Centos7 pub]# ldd `which vsftpd` |grep libssl
libssl.so.10 => /lib64/libssl.so.10 (0x00007f2401ed8000)
- 創建自簽名證書
[root@Centos7 certs]# make vsftpd.pem / 生成自簽名證書
umask 77 ; \
PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
/usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2 ; \
cat $PEM1 > vsftpd.pem ; \
echo "" >> vsftpd.pem ; \
cat $PEM2 >> vsftpd.pem ; \
rm -f $PEM1 $PEM2
Generating a 2048 bit RSA private key
...........................+++
...........+++
writing new private key to '/tmp/openssl.igixLB'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:CN
Locality Name (eg, city) [Default City]:beijing
Organization Name (eg, company) [Default Company Ltd]:test.com
Organizational Unit Name (eg, section) []:opt
Common Name (eg, your name or your server's hostname) []:ftp.test.com
Email Address []:
/ 查看證書內容
[root@Centos7 certs]# openssl x509 -in vsftpd.pem -noout -text
[root@Centos7 certs]# cp vsftpd.pem /etc/vsftpd/
/ 配置vsftpd服務支持SSL:
[root@centos7 ~]#vim /etc/vsftpd/vsftpd.conf
ssl_enable=YES #啓用SSL
allow_anon_ssl=NO #匿名不支持SSL
force_local_logins_ssl=YES #本地用戶登錄加密
force_local_data_ssl=YES #本地用戶數據傳輸加密
rsa_cert_file=/etc/vsftpd/vsftpd.pem
#rsa_private_key_file /path/file #此項如果沒有指定,私鑰也在證書文件中
systemctl restart vsftpd
- 使用FileZilla建立ftp連接
- 登錄ftp,確認證書
- 連接成功
vsftpd虛擬用戶
vsftpd虛擬用戶介紹
1️⃣定義
-
所有虛擬用戶會統一映射爲一個指定的系統帳號
-
訪問共享位置:此係統帳號的家目錄
-
各虛擬用戶可被賦予不同的訪問權限,通過匿名用戶的權限控制參數進行指定
2️⃣虛擬用戶賬號的存儲方式
-
文件:編輯文本文件,此文件需要被編碼爲hash格式
-
奇數行:用戶名,偶數行:密碼
-
將文本轉換爲berkerly db數據庫格式:
db_load -T -t hash -f vusers.txt vusers.db
-
關係型數據庫中的表中:
實時查詢數據庫完成用戶認證
vsftpd 支持mysql庫:pam要依賴於pam-mysql
/lib64/security/pam_mysql.so
/usr/share/doc/pam_mysql-0.7/README
實現基於DB的FTP虛擬用戶
- 創建DB數據庫文件,存放虛擬用戶和密碼
vim /etc/vsftpb/ftpvusers
ftpuser1
centos
ftpuser2
centos
/ 製作DB數據庫文件
[root@Centos7 ~]# cd /etc/vsftpd/
[root@Centos7 vsftpd]# db_load -T -t hash -f ftpvusers ftpvusers.db
[root@Centos7 vsftpd]# file ftpvusers.db
ftpvusers.db: Berkeley DB (Hash, version 9, native byte-order)
- 創建系統用戶和訪問FTP目錄
useradd -d /var/ftproot -s /sbin/nologin -r vuser
mddir -p /var/ftproot/upload
setfacl -m u:vuser:rwx /var/ftproot/uplpad/
#chmod a=rx /data/ftproot/ 如果自動創建家目錄,需修改權限.跟目錄不能有寫權限
- 創建pam配置文件
vim /etc/pam.d/vsftpd.db
auth required pam_userdb.so db=/etc/vsftpd/ftpvusers
account required pam_userdb.so db=/etc/vsftpd/ftpvusers
- 創建pam配置文件
vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.db // 指定pam配置文件路徑
guest_enable=YES
gurst_username=vuser // 將虛擬用戶映射爲系統用戶vuser
user_config_dir=/etc/vsftpd/vusers.d/ //指定每個虛擬用戶獨立配置文件路徑
- 建立每個虛擬用戶的獨立配置文件
mkdir /etc/vsftpd/vusers.conf.d
cd /etc/vsftpd/vusers.conf.d/
vim ftpuser1 // 配置文件名稱必須與虛擬賬戶名稱完全相同
anon_upload_enable=YES
anon_mkdir_write_enable=YES
vim ftpuser2 // 配置文件名稱必須與虛擬賬戶名稱完全相同
local_root=/data/ftproot2 // 指定共享根目錄爲/data/ftproot2
anon_upload_enable=YES
anon_mkdir_write_enable=YES
- 配置共享根目錄,重啓vsftpd服務
touch /var/ftproot/ftp1file / 用於測試登錄驗證時是否登入了相對應的目錄
mkdir -p /data/ftproot2/upload
chmod 555 /data/ftproot2 / 根目錄不能有寫權限
setfacl -m u:vuser:rwx /data/ftproot2/upload/
touch /data/ftproot2/file2file / 測試登錄驗證時是否登入了相對應的目錄
systemctl restart vsftpd
- 客戶端測試
- 從根目錄下文件ftp1file證明ftpuser1登錄到了相應的目錄
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftpuser1 / 用戶ftpuser1
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 (172,20,54,1,23,113).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Dec 18 03:18 ftp1file
drwxrwxr-x 2 0 0 6 Dec 18 02:58 upload
226 Directory send OK.
- ftpuser1登錄ftp服務可以在/upload子目錄下建立目錄,上傳文件
ftp> cd upload
250 Directory successfully changed.
ftp> mkdir test1 / 創建目錄
257 "/upload/test1" created
ftp> pwd
257 "/upload"
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,120).
150 Here comes the directory listing.
drwxr-xr-x 2 998 996 6 Dec 18 03:31 test1
226 Directory send OK.
ftp> put anaconda-ks.cfg / 上傳文件
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (172,20,54,1,23,113).
150 Ok to send data.
226 Transfer complete.
1615 bytes sent in 0.000245 secs (6591.84 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,117).
150 Here comes the directory listing.
-rw-r--r-- 1 1000 996 1615 Dec 18 03:31 anaconda-ks.cfg
drwxr-xr-x 2 998 996 6 Dec 18 03:31 test1
226 Directory send OK.
- 從根目錄下文件ftp2file證明ftpuser2登錄到了相應的目錄
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftpuser2 / 用戶ftpuser2
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 (172,20,54,1,23,114).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Dec 18 03:20 ftp2file
drwxrwxr-x 2 0 0 6 Dec 18 03:19 upload
226 Directory send OK.
- ftpuser2登錄ftp服務可以在/upload子目錄下建立目錄,上傳文件
ftp> cd upload
250 Directory successfully changed.
ftp> mkdir test2
257 "/upload/test2" created
ftp> put anaconda-ks.cfg
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (172,20,54,1,23,118).
150 Ok to send data.
226 Transfer complete.
1615 bytes sent in 0.000272 secs (5937.50 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,114).
150 Here comes the directory listing.
-rw-r--r-- 1 998 996 1615 Dec 18 03:36 anaconda-ks.cfg
drwxr-xr-x 2 998 996 6 Dec 18 03:36 test2
226 Directory send OK.
,54,1,23,114).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Dec 18 03:20 ftp2file
drwxrwxr-x 2 0 0 6 Dec 18 03:19 upload
226 Directory send OK.
- ftpuser2登錄ftp服務可以在/upload子目錄下建立目錄,上傳文件
ftp> cd upload
250 Directory successfully changed.
ftp> mkdir test2
257 "/upload/test2" created
ftp> put anaconda-ks.cfg
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (172,20,54,1,23,118).
150 Ok to send data.
226 Transfer complete.
1615 bytes sent in 0.000272 secs (5937.50 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,114).
150 Here comes the directory listing.
-rw-r--r-- 1 998 996 1615 Dec 18 03:36 anaconda-ks.cfg
drwxr-xr-x 2 998 996 6 Dec 18 03:36 test2
226 Directory send OK.