https://blog.csdn.net/zhangyuan12805/article/details/71425385/
https://www.cnblogs.com/ECNB/p/4630280.html
共同點:
客戶端先發起命令連接。
不同點:
主動模式:服務端發起數據連接。客戶端生成隨機數據端口
被動模式:客戶端發起數據連接。 客戶端和服務端都是隨機數據端口。
客戶端與服務器的命令連接
服務器返回命令"PORT 2024",告訴客戶端(服務器)用哪個端口偵聽數據連接
客戶端初始化一個從自己的數據端口到服務器端指定的數據端口的數據連接。最后服務器在第4 步中給客戶端的數據端口返回一個"ACK"響應。
1.ftp連接服務度
ftp> ls
500 Illegal PORT command.
ftp: bind: Address already in use
然后解決如下
ftp> quote pasv
227 Entering Passive Mode (192,168,0,112,164,248).
ftp> passive
Passive mode on.
ftp> ls
227 Entering Passive Mode (192,168,0,112,169,241).
425 Security: Bad IP connecting.
這個原因是因為服務器本身設置了兩個ip地址
解決辦法是
vim /etc/vsftpd/vsftpd.conf
添加:pasv_promiscuous=YES
ftp> quote pasv
227 Entering Passive Mode (192,168,0,112,143,83).
ftp> passive
Passive mode on.
ftp> ls
227 Entering Passive Mode (192,168,0,112,85,218).
150 Here comes the directory listing.
drwx------ 2 1001 1001 4096 Mar 06 01:46 test
######################################
什么叫做PASV mode(被動模式傳送)?他是如何工作的?
FTP的連接一般是有兩個連接的,一個是客戶程和服務器傳輸命令的,另一個是數據傳送的連接。
FTP服務程序一般會支持兩種不同的模式:
一種是Port模式
一種是Passive模式(Pasv Mode),
主動模式和被動模式的的區別:
先假設客戶端為C,服務端為S.
Port模式:
當客戶端C向服務端S連接后,使用的是Port模式,那么客戶端C會發送一條命令告訴服務端S(客戶端C在本地打開了一個端口N在等着你進行數據連接),當服務端S收到這個Port命令后 就會向客戶端打開的那個端口N進行連接,這種數據連接就生成了。
Pasv模式:
當客戶端C向服務端S連接后,服務端S會發信息給客戶端C,這個信息是(服務端S在本地打開了一個端口M,你現在去連接我吧),當客戶端C收到這個信息后,就可以向服務端S的M端口進行連接,連接成功后,數據連接也建立了。
總結
從上可知兩種模式主要的不同是數據連接建立的不同:
對於Port模式,是客戶端C在本地打開一個端口等服務端S去連接建立數據連接;
而Pasv模式就是服務端S打開一個端口等待客戶端C去建立一個數據連接。
我需要把傳送模式設置成PASV mode嗎?
如果您連接到INTERNET的方式如下圖,你需要設置成為PASV mode模式傳送
路由上有兩個ip一個是內網ip(也就是你的網關地址)另外一個是外網IP,你所有LAN中的計算機都是共享這個218.63.1.5訪問INTERNET的(中間通過了192.168.1.1這個網關),讓我們來看一個連接的詳細過程,以便您
更進一步了解為什么需要設置成為PASV mode 傳送:
當您通過下載工具或使用瀏覽器下載影片的時候就開始連接FTP服務器, 當FTP服務收到你的連接請求后發送應答信息給客戶並開始等待用戶的認證信息,–>認證通過后開始建立數據連接如果你不是設置成為pasv模式,那 么客戶段(下載工具)會在本地計算機開一個數據端口,然后發送一條“命令”給FTP服務段,(我已打開了n端口你現在可以連接我),那么FTP服務器段就 開始連接你ip地址的N端口,(但是連接是失敗的) 因為你是通過192.168.1.1 這個網關(你的路由設備)訪問internet的ftp服務段他實際上是同你的外網地址為218.63.1.5的路由設備連接,根本就連接不上你下載工具 中打開的端口,例如你使用的是 192.168.1.2 這個客戶機,FTP服務段此時無法同你計算機192.168.1.2)監聽端口N連接上,所以此時你會看到服務器反饋的錯誤信息,提示你 192.168.1.2打開的端口無法連接之類的, 信息此時你就需要把傳送模式設置成為PASV模式,而如果你使用的是PASV模式那么當你ftp通過認證后,客戶段首先向服務器發送一條PASV命令,服 務段接受到命令后打開一個端口並告訴客戶段“我已打開了一個端口,你此時可以來連接了” 客戶段(下載工具)接受到信息后,就去連接服務段已經打開了的端口,從而完成數據連接,所有ftp下載的數據流都將通過這個端口傳送
而且在用iptables做NAT時,應該裝載這兩個模塊(ip_nat_ftp、ip_conntrack_ftp),才能正常連到ftp服務器。否則pasv被動模式都無法連接到ftp服務器。
FTP模式與數據端口
FTP 分為兩類,PORT FTP和PASV FTP,PORT FTP是一般形式的FTP。這兩種FTP在建立控制連接時操作是一樣的,都是由客戶端首先和FTP服務器的控制端口(默認值為21)建立控制鏈接,並通過 此鏈接進行傳輸操作指令。它們的區別在於使用數據傳輸端口(ftp- data)的方式。PORT FTP由FTP服務器指定數據傳輸所使用的端口,默認值為20。PASV FTP由FTP客戶端決定數據傳輸的端口。 PASV FTP這種做法,主要是考慮到存在防火牆的環境下,由客戶端與服務器進行溝通(客戶端向服務器發出數據傳輸請求中包含了數據傳輸端口),決定兩者之間的數 據傳輸端口更為方便一些。
port_enable=YES|NO
如果你要在數據連接時取消PORT模式時,設此選項為NO。默認值為YES。
connetc_from_port_20=YES|NO
控制以PORT模式進行數據傳輸時是否使用20端口(ftp-data)。YES使用,NO不使用。默認值為NO,但RHL自帶的vsftpd.conf文件中此參數設為YES。
ftp_data_port=port number
設定ftp數據傳輸端口(ftp-data)值。默認值為20。此參數用於PORT FTP模式。
port_promiscuous=YES|NO
默認值為NO。為YES時,取消PORT安全檢查。該檢查確保外出的數據只能連接到客戶端上。小心打開此選項。
pasv_enable=YES|NO
YES,允許數據傳輸時使用PASV模式。NO,不允許使用PASV模式。默認值為YES。
pasv_min_port=port number
pasv_max_port=port number
設定在PASV模式下,建立數據傳輸所可以使用port范圍的下界和上界,0 表示任意。默認值為0。把端口范圍設在比較高的一段范圍內,比如50000-60000,將有助於安全性的提高。
pasv_promiscuous=YES|NO
此選項激活時,將關閉PASV模式的安全檢查。該檢查確保數據連接和控制連接是來自同一個IP地址。小心打開此選項。此選項唯一合理的用法是存在於由安全隧道方案構成的組織中。默認值為NO。
pasv_address=
此選項為一個數字IP地址,作為PASV命令的響應。默認值為none,即地址是從呼入的連接套接字(incoming connectd socket)中獲取。
所以如果linux打開了防火場,必須開通對應的端口 例如:
-A RH-Firewall-1-INPUT -m state –state NEW -p tcp -m tcp –dport 30000:31000 –syn -j ACCEPT
四、防火牆配置
#!/bin/bash
#ip.sh
echo “1″ >/proc/sys/net/ipv4/ip_forward
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
iptables -t filter -A FORWARD -p tcp -s 172.16.0.0/16 -d 192.168.0.10 –dport 21 -j ACCEPT
iptables -t filter -A FORWARD -p tcp -s 192.168.0.10 –sport 21 -j ACCEPT
iptables -t filter -A FORWARD -p tcp -s 172.16.0.0/16 -d 192.168.0.10 –dport 30000:310000 -j ACCEPT
iptables -t filter -A FORWARD -p tcp -s 192.168.0.10 –sport 3000:4000 -j ACCEPT
iptables -t filter -A FORWARD -p tcp -m state –state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A FORWARD -p icmp –icmp-type 8 -j ACCEPT
iptables -t filter -A FORWARD -p icmp –icmp-type 0 -j ACCEPT
五、驗證:
# 在xp下用ftp命令連接,都是采用主動模式連接,可以采用圖形界面的軟件,默認一般為被動模式。
# netstat -an|grep 172
Linux下VsFTP配置全方案
綱要:
一, VsFTPd的簡述
二, 企業Linux下vsFTPD方案
三, VsFTPD相關配置文件詳解
一,VsFTPd的簡述:
VSFTP(Very Secure FTP Daemon,非常安全的FTP服務器)。顧名思義,VSFTPD設計的出發點就是安全性。同時隨着版本的不斷升級,VSFTPD在性能和穩定性上也取得 了極大的進展。除了安全和性能方面很優秀的外,還有很好的易用性。Red Hat公司在自己的FTP服務器(ftp.redhat.com)上就使用了vsFTPd
二,企業Linux下vsFTPD實戰方案
要求:
1. 用戶:netseek_com;FTP:ftp.netseek.com(192.168.0.21,我已經配置好了相關的DNS)
2. 禁止匿名登陸,禁止用戶離開用戶目錄
3. 命令通道端口使用5021,數據通道端口使用5020(你可以改成你想設置的端口如1021,1020)
4. 允許使用被動模式使用端口范圍為10010~10020.
5. 用戶帶寬設置為200kps;用戶空間大小限制為300M,允許寬限期限內有10MB的緩沖
具體操作步驟如下:
為了更完全的描述安裝全過程,我在我的另一台主機(netseek)上進行配置,在台機IP:192.168.0.20上綁定了192.168.0.21,也配置好了相關的DNS解析,在這里我就不多說了請參照”Linux全能web服務器架設”。
1. 配置相關服務
啟動服務:
[root@netseek root]# #rpm –qa | grep vsftpd ;查看是否安裝vsftpd服務
#/etc/init.d/vsftpd start ;啟動服務
#chkconfig vsftpd on ;讓系統服務隨着系統啟動而啟動
配置相關文檔:
#vi /etc/vsftpd/vsftpd.conf
禁止匿名用戶訪問:
anonymous_enable=YES,將YES改為NO
在文件末尾加如下的設置:
# new added by netseek
listen_port=5021 ;命令通道端口,默認為21
listen_data_port=5020 ;數據通道端口,默認為20
pasv_enable=YES ;允許被動模式
pasv_min_port=10000 ;被動模式使用端口范圍
pasv_max_port=10010
local_max_rate=200000 ;用戶寬帶限制
chroot_local_user=YES ;禁用戶離開主目錄
listen_address=192.168.0.21 ;讓他監聽ip:192.168.0.21
注:在添加過程中請不要加上”;”和這些中文注釋,在這里我上為了方便大家了解才加上的。
2. 添加虛擬主機用戶
添加用戶netseek_com,用戶目錄指定為/var/www/netseek.com,且此用戶不能登陸系統.
#mkdir /var/www/netseek.com
#useradd –s /sbin/nologin –d /var/www/netseek.com netseek_com
注-s /sbin/nologin是讓其不能登陸系統,-d 是指定用戶目錄為/var/www/netseek.com
#passwd netseek_com (Do not Hack me 3ks) DnHm3ks 這是我設置的密碼
#chown –R netseek_com:netseek_com /var/www/netseek.com
注:將用戶目錄及其子目錄的所有和所屬的組設置為netseek_com
3. 配置磁盤配額
我在安裝過程中磁盤了多個區,分別/home,/var,/,/www,tmp,swap,/boot多個分區。建議你將磁盤分多個獨單的分區,這樣可以降低磁盤分區損壞造成的數據丟失風險.
#[root@netseek root]# rpm -qa | grep quota
quota-3.06-9 ; 我的系統已經安裝了磁盤配額工具
#vi /etc/fstab
找到類似
LABEL=/var /var ext3 defaults 1 2
在defaults后加入usrquota,改為如下:
LABEL=/var /var ext3 defaults,usrquota 1 2
重新加載/var這個分區:
#mount –o remount /var
#cd /var 進入這個目錄
#touch quota.user
#chmod 600 quota.user
#quotacheck –mf /var 對磁盤分區空間使用情況進行強制檢測
[root@localhost var]# quotacheck -mf /var
quotacheck: WARNING – Quotafile /var/quota.user was probably truncated. Can’t save quota settings…
重新啟動系統
第一次運行時都會出現這個警告,再次運行的時候就不會啦
為指定用戶定額:
#edquota netseek_com 為用戶netseek_com設置磁盤配額。
Disk quotas for user netseek_com (uid 501):
Filesystem blocks soft hard inodes soft hard
/dev/sda5 6616 307200 0 15 0 0
注:
ilesystem blocks soft hard inodes soft hard
filesystem-正在設置的文件系統,不要修改或刪除
bolock-當前使用的碰盤空間,單位為KB
soft(第一個)-軟磁盤空間限制,默認0,表示無限制,我在這里設為300M。
hard(第一個)-硬配額限制,0表示無限制。
inodes-當前文件數量
soft(第二個)-對文件數量的軟限制,0表示無限制
hard(第二個)-對文件數量的硬限制,0表示無限制
讓系統啟動是自動加載:
#vi /etc/rc.d/rc.local ,加入以下:
/etc/init.d/vsftpd start
/sbin/quotacheck
/sbin/quotaon –avu
現在查看netseek_com 用戶使用磁盤空間的情況
[root@localhost ~]# quota -u netseek_com
Disk quotas for user netseek_com (uid 501):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda5 6616 307200 0 15 0 0
注:關於更多的quota命令,請用man命令查看吧,烏哥(VBird)說,我們要學會找男人 !
4. 效果演示,登陸演示:
四, VsFTPd相關的配置詳解
1.匿名用戶相關設置
anonymous_enable=YES ,將YES改為NO, 禁止匿名用戶登陸
#non_mkdir_write_enable=YES ,將#注釋去掉,允許匿名用戶創建目錄
#non_upload_enalbe=YES ,將#去掉,允許匿名用戶上傳
anon_world_readable_only=YES ,允許匿名用戶下載,默認是禁止的,這個可以自行添加。
Anon_other_write_enable=YES ,將其設為YES的話,就除了上傳和創建目錄外,還可以重命名,刪除文件,默認是NO
no_anon_password=NO ,將其設為YES,匿名用戶不會查詢用戶密碼直接登陸。
ftp_username=ftp ,匿名用戶登陸系統的賬號默認為ftp,此項最好不要改,否則設置不當會給系統的安全帶來威脅。
2.FTP服務端口的指定
listen_port=8021 ,指定命令通道為8021,默認為21
listen_data_port=8020 ,指定數據通道為8020,默認為20
3.上傳模式的設置
pasv_enable=YES ,是否允使用被動模式,默認是允許的。
pasv_min_port=10000 ,指定使用被動模式時打開端口的最小值
pasv_max_port=10004 ,指定使用被動模式時打開端口的最大值。
4.Vsftp服務器指定IP地址
listen_address=192.168.0.21 ,指定FTP,IP地址
注:只有當vsftp運行於獨立模式時才允許使用指定IP,如果在/etc/xinetd.d目錄下已經建立了vsfpd文件,就要將該文件中的disable設置為yes,方可。
5. 鎖定用戶,禁止用戶離開用戶主目錄
chroot_local_user=YES ,將其設為YES,就鎖定在用戶主目錄,設為NO,可以切換
將指定用戶設置為鎖定用戶主目錄:
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd.chroot_list
將其改為如下:
chroot_list_enable=NO
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list
將上面保存,再做如下操作:
#touch /etc/vsftpd/vsftpd.chroot_list
#vi /etc/vsftpd/vsftpd.chroot_list ,在該文件中加入用戶名單,如:
netseek_com
6.FTP服務器的流量控制
max_clients=100 ;允許的最大連接數,定義為100,默認為0,表沒有限制
max_per_ip=5 ;每個IP允許的連接數,0表沒有限制,需要運行於獨立模式方可
anon_max_rate=50000 ;匿名用戶最大帶寬,單位為bps
local_max_rate=200000 ;系統用戶最大帶寬
如何對指定用戶進行流量限制呢?
#vi /etc/vsftpd/vsftpd.conf,添加一行:
user_config_dir=/etc/vsftpd/userconf
#touch /etc/vsftpd/userconf/netseek_com 為netseek_com這個用戶建立一個netseek_com文件
#vi /etc/vsftpd/userconf/netseek_com 添加以下內容
local_max_rate=100000
保存重啟服務即可.
7.定制歡迎信息
目錄說明設置
#vi /etc/vsftpd/vsftpd.conf
#dirmessage_enable=YES,前的#去掉。
然后我們定制一個.message,寫上你想寫的東西,然后把這個文件復制到各個用戶的家目錄中,就OK。
系統歡迎消息設置
ftpd_banner=Welcome to ftp.netseek.com , Yeah!!!
系統歡迎消息文件設置
banner_file=/etc/vsftpd/welcome 與ftpd_banner相類似,不同之處在於,banner_file指定歡迎文件.
報錯:
Could not retrieve directory listingPermission denied.

修改配置文件
報錯:
Connection failed.
OOPS: vsftpd: refusing to run with writable root inside chroot()
從2.3.5之后,vsftpd增強了安全檢查,如果用戶被限定在了其主目錄下,則該用戶的主目錄不能再具有寫權限了!如果檢查發現還有寫權限,就會報該錯誤。 要修復這個錯誤,可以用命令chmod a-w /var/ftp/去除用戶主目錄的寫權限
chmod a-w ftp家目錄