1.ftp簡介
網絡檔案共享服務主流的主要有三種,分别是ftp、nfs、samba。
FTP是File Transfer Protocol(檔案傳輸協定)的簡稱,用于internet上的控制檔案的雙向傳輸。
FTP也是一個應用程式,基于不同的作業系統有不同的FTP應用程式,而所有這些應用程式都遵守同一種協定以傳輸檔案。
在FTP的使用當中,使用者經常遇到兩種概念:下載下傳和上傳
下載下傳(Download) | 上傳(Upload) |
---|---|
從遠端主機拷貝檔案至自己的計算機上 | 将檔案從自己的計算機上拷貝至遠端主機上 |
2.ftp架構
FTP工作于應用層,監聽于tcp的21号端口,是一種C/S架構的應用程式。其有多種用戶端和服務端的應用程式,下面來簡單介紹一下
用戶端工具 | 服務端軟體 |
---|---|
ftp lftp,lftpget wget,curl filezillagftp(Linux GUI) 商業軟體(flashfxp,cuteftp) | wu-ftpd proftpd(提供web接口的一種ftp服務端程式) pureftp vsftpd(Very Secure) ServU(windows平台的一種強大ftp服務端程式) |
3.ftp資料連接配接模式
ftp有2種資料連接配接模式:指令連接配接和資料連接配接
指令連接配接:是指檔案管理類指令,始終線上的持久性連接配接,直到使用者登出為止
資料連接配接:是指資料傳輸,按需建立及關閉的連接配接
其中資料連接配接需要關注的有2點,一是資料傳輸格式,二是資料傳輸模式
資料傳輸格式有以下兩種:
- 檔案傳輸
- 二進制傳輸
資料傳輸模式也有2種:
主動模式:由伺服器端建立資料連接配接
被動模式:由用戶端建立資料連接配接
兩種資料傳輸模式的建立過程:
傳輸模式 | 建立過程 |
---|---|
主動模式 | 指令連接配接: Client(1025)–> Server(21) 用戶端以一個随機端口(大于1023)來連伺服器端的21号端口 資料連接配接: Server(20/tcp) --> Client(1025+1) 伺服器端以自己的20号端口去連用戶端建立指令連接配接時使用的随機端口+1的端口号 |
被動模式 | 指令連接配接: Client(1110) --> Server(21) 用戶端以一個随機端口來連成伺服器端的21号端口 資料連接配接: Client(1110+1) --> Server(随機端口) 用戶端以建立指令連接配接的端口+1的端口号去連伺服器端通過指令連接配接告知自己的一個随機端口号來建立資料連接配接 |
弊端,因為用戶端的端口是随機的,用戶端如果開了防火牆,
則伺服器端去連用戶端建立資料連接配接時可能會被拒絕
4.使用者認證
ftp的使用者主要有三種:
- 虛拟使用者:僅用于通路某特定服務中的資源
- 系統使用者:可以登入系統的真實使用者
- 匿名使用者
5.1vsftpd安裝
[[email protected] ~]# yum -y install vsftpd
...
...
正在安裝 : vsftpd-3.0.2-25.el7.x86_64 1/1
驗證中 : vsftpd-3.0.2-25.el7.x86_64 1/1
已安裝:
vsftpd.x86_64 0:3.0.2-25.el7
完畢!
5.2vsftpd配置
/etc/pam.d/vsftpd //vsftpd使用者認證配置檔案
/etc/vsftpd/ //配置檔案目錄
/etc/vsftpd/vsftpd.conf //主配置檔案
匿名使用者(映射為ftp使用者)的共享資源位置是/var/ftp
系統使用者通過ftp通路的資源位置為使用者的家目錄
虛拟使用者通過ftp通路的資源位置為給虛拟使用者指定的映射成為的系統使用者的家目錄
vsftpd常見的配置參數:
參數 | 作用 |
---|---|
anonymous_enable=YES | 啟用匿名使用者登入 |
anon_upload_enable=YES | 允許匿名使用者上傳 |
anon_mkdir_write_enable=YES | 允許匿名使用者建立目錄,但是不能删除 |
anon_other_write_enable=YES | 允許匿名使用者建立和删除目錄 |
local_enable=YES | 啟用本地使用者登入 |
write_enable=YES | 允許本地使用者有寫權限 |
local_umask=022 | 通過ftp上傳檔案的預設遮罩碼 |
chroot_local_user=YES | 禁锢所有的ftp本地使用者于其家目錄中 |
chroot_list_enable=YES | 開啟禁锢檔案清單 需要與chroot_list_file參數一起使用 |
chroot_list_file=/etc/vsftpd/chroot_list | 指定禁锢清單檔案路徑 在此檔案裡面的使用者将被禁锢在其家目錄中 |
allow_writeable_chroot=YES | 允許被禁锢的使用者家目錄有寫權限 |
xferlog_enable=YES | 是否啟用傳輸日志,記錄ftp傳輸過程 |
xferlog_std_format=YES | 傳輸日志是否使用标準格式 |
xferlog_file=/var/log/xferlog | 指定傳輸日志存儲的位置 |
chown_uploads=YES | 是否啟用改變上傳檔案屬主的功能 |
chown_username=whoever | 指定要将上傳的檔案的屬主改為哪個使用者 此使用者必須在系統中存在 |
pam_service_name=vsftpd | 指定vsftpd使用/etc/pam.d下的 哪個pam配置檔案進行使用者認證 |
userlist_enable=YES | 是否啟用控制使用者登入的清單檔案: 預設為/etc/vsftpd/user_list檔案 |
userlist_deny=YES | 是否拒絕userlist指定的清單檔案中存在的使用者登入ftp |
max_clients=# | 最大并發連接配接數 |
max_per_ip=# | 每個IP可同時發起的并發請求數 |
anon_max_rate | 匿名使用者的最大傳輸速率,機關是“位元組/秒” |
local_max_rate | 本地使用者的最大傳輸速率,機關是“位元組/秒” |
dirmessage_enable=YES | 啟用某目錄下的.message描述資訊 假定有一個目錄為/upload,在其下建立一個檔案名為.message在檔案内寫入一些描述資訊, 則當使用者切換至/upload目錄下時會自動顯示.message檔案中的内容 |
message_file | 設定通路一個目錄時獲得的目錄資訊檔案的檔案名,預設是.message |
idle_session_timeout=600 | 設定預設的斷開不活躍session的時間 |
data_connection_timeout=120 | 設定資料傳輸逾時時間 |
ftpd_banner=“Welcome to chenlf FTP service.” | 定制歡迎資訊,登入ftp時自動顯示 |
虛拟使用者的配置:
所有的虛拟使用者會被統一映射為一個指定的系統帳号,通路的共享位置即為此系統帳号的家目錄
各虛拟使用者可被賦予不同的通路權限,通過匿名使用者的權限控制參數進行指定
虛拟使用者帳号的存儲方式:
1.檔案:編輯檔案,此檔案需要被編碼為hash格式。
奇數行為使用者名
偶數行為密碼
2.關系型資料庫的表中:
通過即時查詢資料庫完成使用者認證
mysql庫:pam要依賴于pam_mysql軟體,可以通過epel源yum安裝
6.1虛拟使用者配置
服務端IP 192.168.67.128
用戶端IP 192.168.67.130
//關閉selinux
[[email protected] ~]# vim /etc/selinux/config
SELINUX=disabled
然後reboot重新開機
[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# systemctl start vsftpd
[[email protected] ~]# cd /etc/yum.repos.d/
[[email protected] ~]# wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
[[email protected] ~]# sed -i 's/\$releasever/7/g' /etc/yum.repos.d/CentOS7-Base-163.repo
//上面7是centos7版本如果不是就改成對應版本
[[email protected] ~]# sed -i 's/^enabled=.*/enabled=1/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[[email protected] ~]# yum clean all
[[email protected] ~]# yum -y install epel-release
[[email protected] ~]# yum -y install vsftpd
//建立文本格式的使用者名、密碼清單,例如若要添加兩個使用者tom、ki,密碼分别為123、456
[[email protected] ~]# useradd tom
[[email protected] ~]# useradd ki
[[email protected] ~]# cat >/etc/vsftpd/vu.list <<EOF
> tom
> 123
> ki
> 456
> EOF
[[email protected] ~]# cat /etc/vsftpd/vu.list
tom
123
ki
456
//這裡的使用者名和密碼是一一對應的,前面輸的是帳号,後面跟的是密碼
//安裝db4工具
[[email protected] ~]# yum -y install db4*
//将剛建立的文本格式使用者名、密碼檔案使用db4工具轉換成資料庫檔案
[[email protected] ~]# db_load -T -t hash -f /etc/vsftpd/vu.list /etc/vsftpd/vu.db
//上面的-T表示轉換,-t表示加密方式使用hash算法加密
//為提高虛拟使用者帳号檔案的安全性,應将檔案權限設定為600,以避免資料外洩
[[email protected] ~]# chmod 600 /etc/vsftpd/vu.*
[[email protected] ~]# ll /etc/vsftpd/vu.*
-rw------- 1 root root 12288 7月 30 11:39 /etc/vsftpd/vu.db
-rw------- 1 root root 15 7月 30 11:30 /etc/vsftpd/vu.list
//添加虛拟使用者的映射帳号、建立ftp根目錄。例如要将使用的ftp根目錄設定為/var/ftproot, \
//映射帳号的名稱為vftp,可以執行以下操作
[[email protected] ~]# useradd -d /var/ftproot -s /sbin/nologin vftp
[[email protected] ~]# chmod 755 /var/ftproot/
[[email protected] ~]# ll -d /var/ftproot/
drwxr-xr-x 2 vftp vftp 62 7月 30 11:41 /var/ftproot/
//備份需要修改的配置檔案
[[email protected] ~]# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
[[email protected] ~]# 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
//修改vsftpd配置檔案,添加虛拟使用者支援
[[email protected] ~]# echo 'guest_enable=YES' >> /etc/vsftpd/vsftpd.conf
[[email protected] ~]# echo 'guest_username=vftp' >> /etc/vsftpd/vsftpd.conf
//為不同的虛拟使用者建立獨立的配置檔案
[[email protected] ~]# echo 'user_config_dir=/etc/vsftpd/vusers_dir' >> /etc/vsftpd/vsftpd.conf
[[email protected] ~]# echo 'allow_writeable_chroot=YES' >> /etc/vsftpd/vsftpd.conf
//有了上述配置後,就可以在/etc/vsftpd/vusers_dir目錄中為每個虛拟使用者分别建立配置檔案了。
//例如,若要使用虛拟使用者tom能夠上傳檔案、建立目錄,而jerry隻有預設的下載下傳權限,
//可以執行以下操作
[[email protected] ~]# mkdir /etc/vsftpd/vusers_dir //此目錄和上面配置檔案裡面對應
[[email protected] ~]# ll /etc/vsftpd/
總用量 36
-rw-------. 1 root root 125 10月 31 2018 ftpusers
-rw-------. 1 root root 361 10月 31 2018 user_list
-rw-------. 1 root root 5219 7月 30 11:44 vsftpd.conf
-rwxr--r--. 1 root root 338 10月 31 2018 vsftpd_conf_migrate.sh
-rw------- 1 root root 12288 7月 30 11:39 vu.db
-rw------- 1 root root 15 7月 30 11:30 vu.list
drwxr-xr-x 2 root root 6 7月 30 11:44 vusers_dir
//設定tom使用者可上傳檔案、建立目錄
[[email protected] ~]# echo 'anon_upload_enable=YES' >> /etc/vsftpd/vusers_dir/tom
[[email protected] ~]# echo 'anon_mkdir_write_enable=YES' >> /etc/vsftpd/vusers_dir/tom
[[email protected] ~]# echo 'anon_umask=022' >> /etc/vsftpd/vusers_dir/tom
[[email protected] ~]# echo 'anon_other_write_enable=YES' >> /etc/vsftpd/vusers_dir/tom
[[email protected] ~]# cat /etc/vsftpd/vusers_dir/tom
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_umask=022
anon_other_write_enable=YES
//設定jerry使用者隻有預設的下載下傳權限,隻需要建立一個名為ki的空檔案即可
touch /etc/vsftpd/vusers_dir/ki
//重新開機服務
[[email protected] ~]# systemctl restart vsftpd
[[email protected] ~]# 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 :::*
用戶端驗證
[[email protected] ~]# yum -y install lftp
[[email protected] ~]# lftp -u tom,123 192.168.76.128
lftp [email protected]:~> ls
lftp [email protected]:/> ls
//建立目錄
lftp [email protected]:/> mkdir qqq
mkdir 成功, 建立 `qqq'
lftp [email protected]:/> ls
drwxr-xr-x 2 1002 1002 6 Jul 30 04:27 qqq
//上傳檔案本地檔案
lftp [email protected]:~> put anaconda-ks.cfg
1451 bytes transferred
lftp [email protected]:/> ls
-rw-r--r-- 1 1002 1002 1451 Jul 30 04:46 anaconda-ks.cfg
drwxr-xr-x 2 1002 1002 6 Jul 30 04:27 qqq
//下載下傳檔案到本地/opt下面
lftp [email protected]:/> lcd /opt
lcd 成功, 本地目錄=/opt
lftp [email protected]:/> get anaconda-ks.cfg
1451 bytes transferred
[[email protected] ~]# ls /opt
anaconda-ks.cfg
//目錄隻能用mirror下載下傳,上傳
lftp [email protected]:/> mkdir www
mkdir 成功, 建立 `www'
lftp [email protected]:/> mirror www
Total: 1 directory, 0 files, 0 symlinks
//上傳目錄必須加-R
[[email protected] ~]# mkdir xx
[[email protected] ~]# lftp -u tom,123 192.168.76.128
lftp [email protected]:~> mirror -R xx
Total: 1 directory, 0 files, 0 symlinks
//切換到kiyonghu
[[email protected] ~]# lftp -u ki,456 192.168.76.128
lftp [email protected]:~> ls
-rw-r--r-- 1 1002 1002 1451 Jul 30 04:46 anaconda-ks.cfg
drwxr-xr-x 2 1002 1002 6 Jul 30 04:27 qqq
lftp [email protected]:/> mkdir www
mkdir: Access failed: 550 Permission denied. (www)
lftp [email protected]:/> put anaconda-ks.cfg
put: Access failed: 550 Permission denied. (anaconda-ks.cfg)
lftp [email protected]:/> lcd /var
lcd 成功, 本地目錄=/var
lftp [email protected]:/> get anaconda-ks.cfg
1451 bytes transferred
隻能下載下傳 不能建立目錄不能上傳
6.2匿名使用者
[[email protected] ~]# yum -y install vsftpd
[[email protected] ~]# systemctl start vsftpd
[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# setenforce 0
[[email protected] yum.repos.d]# wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
[[email protected] yum.repos.d]# ls
CentOS7-Base-163.repo redhat.repo xx.repo
[[email protected] yum.repos.d]# rm -rf xx.repo
[[email protected] yum.repos.d]# sed -i 's/\$releasever/7/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[[email protected] yum.repos.d]# sed -i 's/^enabled=.*/enabled=1/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[[email protected] yum.repos.d]# yum clean all
[[email protected] yum.repos.d]# yum -y install epel-release
驗證
[[email protected] ~]# chmod 777 /var/ftp/pub
[[email protected] ~]# ll /var/ftp/
總用量 0
drwxrwxrwx. 2 root root 6 10月 31 2018 pub
[[email protected] ftp]# cd pub/
[[email protected] pub]# touch abc
[[email protected] ~]# lftp 192.168.76.128
lftp 192.168.76.128:/> ls
drwxr-xr-x 2 0 0 6 Oct 30 2018 pub
lftp 192.168.76.128:/> cd pub/
lftp 192.168.76.128:/pub> ls
-rw-r--r-- 1 0 0 0 Jul 30 05:54 abc
//可以下載下傳
lftp 192.168.76.128:/pub> get abc
lftp 192.168.76.128:/pub> exit
[[email protected] ~]# ls
abc anaconda-ks.cfg
//不能上傳不能建立
[[email protected] ~]# touch wo
[[email protected] ~]# lftp 192.168.76.128
lftp 192.168.76.128:~> put wo
put: Access failed: 550 Permission denied. (wo)
lftp 192.168.76.128:/> mkdir ta
mkdir: Access failed: 550 Permission denied. (ta)
6.3系統使用者登入
服務端前面操作和匿名使用者一樣
[[email protected] ~]# useradd aaa
[[email protected] ~]# passwd aaa
更改使用者 aaa 的密碼 。
新的 密碼:
重新輸入新的 密碼:
passwd:所有的身份驗證令牌已經成功更新。
//這裡必須設定密碼
[[email protected] aaa]# touch 1 //在aaa使用者的家目錄裡面建立一個檔案
[[email protected] ~]# systemctl restart vsftpd
驗證
[[email protected] ~]# lftp -u aaa,1 192.168.76.128
lftp [email protected]:~> ls
-rw-r--r-- 1 0 0 0 Jul 31 08:38 1
lftp [email protected]:~> mkdir www
mkdir 成功, 建立 `www'
lftp [email protected]:~> put wo
lftp [email protected]:~> ls
-rw-r--r-- 1 0 0 0 Jul 31 08:38 1
-rw-r--r-- 1 1000 1000 0 Jul 31 08:58 wo
drwxr-xr-x 2 1000 1000 6 Jul 31 08:39 www
lftp [email protected]:~> get 1
lftp [email protected]:~> exit
[[email protected] ~]# ls
1 abc anaconda-ks.cfg wo
//系統使用者有所有權限