stand alone 和 super daemonstand alone 指的是一直執行 vsftpd,佔用資源,提供 ftp 服務。 super daemon 指的是有需要時由 xinetd 啟動 vsftpd 服務。如果站群伺服器不是那種長期開 ftp,提供大量的上傳下載服務的話,會選擇後者。
 
安裝
$ sudo apt-get install vsftpd
檢視是否開啟 21 埠
$ sudo netstat -npltu | grep 21
tcp        0      0 0.0.0.0:21      0.0.0.0:*  LISTEN      15601/vsftpd
 
登入
ftp localhost
輸入 Ubuntu 的使用者名稱、密碼登入
ls
會顯示 home 目錄的檔案
 
檔案結構
匿名使用者根路徑
/srv/ftp
 
配置檔案
/etc/vsftpd.conf
查閱配置檔案詳細資訊
man 5 vsftpd.conf
設定 log 儲存位置,預設如下
xferlog_file=/var/log/vsftpd.log
執行
standalone
最普遍的方式
sudo service vsftpd start
super daemon
需要修改 vsftpd.conf
listen=NO
這裡若不改成 NO,會出現下列錯誤
500 OOPS: could not bind listening IPv4 socket
 
安裝 xinetd
sudo apt-get install xinetd
sudo vi /etc/xinetd.conf
service ftp
{
socket_type             = stream
wait                    = no
user                    = root
server                  = /usr/sbin/vsftpd
log_on_success          += DURATION USERID
log_on_failure          += USERID
nice                    = 10
disable                 = no
}
 
停止 vsftpd,啟動 xinetd
sudo service vsftpd stop
sudo service xinetd start
 
檢視埠
$ sudo netstat -npltu | grep 21
tcp        0     0 0.0.0.0:21    0.0.0.0:*  LISTEN      16787/xinetd
 
/etc/vsftpd.conf
listen= : 設定為 YES 時 vsftpd 以獨立執行方式啟動,設定為 NO 時以 xinetd 方式啟動(xinetd 是管理守護程式的,將服務集中管理,可以減少大量服務的資源消耗)
listen_port= : 設定控制連線的監聽埠號,預設為 21
listen_address= : 將在繫結到指定 IP 地址執行,適合多網路卡
connect_from_port_20= : 若為 YES,則強迫 FTP-DATA 的資料傳送使用 port 20,預設 YES
pasv_enable= : 是否使用被動模式的資料連線,如果客戶機在防火牆後,請開啟為 YES
pasv_min_port=
pasv_max_port= : 設定被動模式後的資料連線埠範圍在 n 和 m 之間, 建議為 50000-60000 埠
message_file= : 設定使用者進入某個目錄時顯示的檔案內容,預設為 .message
dirmessage_enable= : 設定使用者進入某個目錄時是否顯示由 message_file 指定的檔案內容
ftpd_banner= : 設定使用者連線站群伺服器後的顯示資訊,就是歡迎資訊
banner_file= : 設定使用者連線站群伺服器後的顯示資訊存放在指定的 filename 檔案中
connect_timeout= : 如果客戶機連線站群伺服器超過 N 秒,則強制斷線,預設 60
accept_timeout= : 當使用者以被動模式進行資料傳輸時,站群伺服器發出 passive port 指令等待客戶機超過 N 秒,則強制斷線,預設 60
accept_connection_timeout= : 設定空閒的資料連線在 N 秒後中斷,預設 120
data_connection_timeout= : 設定空閒的使用者會話在 N 秒後中斷,預設 300
max_clients= : 在獨立啟動時限制站群伺服器的連線數,0 表示無限制
max_per_ip= : 在獨立啟動時限制客戶機每 IP 的連線數,0 表示無限制(不知道是否跟多執行緒下載有沒幹系)
local_enable= : 設定是否支援本地使用者帳號訪問
guest_enable= : 設定是否支援虛擬使用者帳號訪問
write_enable= : 是否開放本地使用者的寫許可權
local_umask= : 設定本地使用者上傳的檔案的生成掩碼,預設為 077
local_max_rate : 設定本地使用者最大的傳輸速率,單位為 bytes/sec,值為 0 表示不限制
local_root= : 設定本地使用者登陸後的目錄,預設為本地使用者的主目錄
chroot_local_user= : 當為 YES 時,所有本地使用者可以執行 chroot
chroot_list_enable=
chroot_list_file= : 當 chroot_local_user=NO 且 chroot_list_enable=YES 時,只有 filename 檔案指定的使用者可以執行 chroot
anonymous_enable= : 設定是否支援匿名使用者訪問
anon_max_rate= : 設定匿名使用者的最大傳輸速率,單位為 B/s,值為 0 表示不限制
anon_world_readable_only= 是否開放匿名使用者的瀏覽許可權
anon_upload_enable= 設定是否允許匿名使用者上傳
anon_mkdir_write_enable= : 設定是否允許匿名使用者建立目錄
anon_other_write_enable= : 設定是否允許匿名使用者其他的寫許可權(注意,這個在安全上比較重要,一般不建議開,不過關閉會不支援續傳)
anon_umask= : 設定匿名使用者上傳的檔案的生成掩碼,預設為 077
 
==匿名使用者==
先備份

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.old
开启
sudo vi /etc/vsftpd.conf
 
允许匿名访问
# Allow anonymous FTP? (Disabled by default)
anonymous_enable=YES
上传档案
允许匿名上传
write_enable=YES
anon_mkdir_write_enable=YES
anon_upload_enable=YES
注意 2 点:
1. 匿名使用者就是 ftp,想要匿名使用者写入,必须资料夹的许可权为 ftp 可写。
2. 匿名使用者的根目录不允许写,所以根目录的许可权绝对不能是 ftp 可写和其他使用者可写,如果根目录所有者为 ftp 的话,所有者的许可权也不能写。
所以解决方法是建个单独的 public 资料夹用于上传档案,设定其为 ftp 可写或” 其他使用者可写 “
还可建个 download 资料夹只用于下载,设定其他使用者没有写许可权便可。
重新命名、删除档案
开放重新命名,删除档案等许可权,不开的话没法续传。
anon_other_write_enable=YES
仅能上传,无法下载
write_enable=YES
anon_mkdir_write_enable=YES
anon_upload_enable=YES
chown_uploads=YES
chown_username=root
上传的档案所有者被改为 root,匿名使用者的 ftp 使用者就无法读取,下载了。
认证 FTP 配置
设定 vsftp 认证系统使用者,并允许他们上传档案,编辑 /etc/vsftpd.conf:
local_enable=YES
write_enable=YES
重启 vsftp
sudo service vsftpd restart
系统使用者登入 ftp 便进入他们的 home 目录
Chroot
限制所有
限制登入使用者访问其他目录,改之前登入显示的路径比如是 ~ ,改之后则是 /。
效果是像这样的。
注:我的本地使用者 (local user 为 yeshuai,home directory 为/home/yeshuai)
 
 
root@ubuntu:~# ftp localhost
Connected to localhost.
220 (vsFTPd 2.3.2)
Name (localhost:yeshuai): yeshuai
 
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
ftp> pwd
”’257 “/””’
 
看上边,正常情况下,输入 pwd 时,应该是显示/home/yeshuai.
由于我做了 chroot. 所以,/home/yeshuai 变成 /
 
chroot_local_user=YES
开放所有,限制特定
可指定一组使用者限制
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
随后建立列表
sudo vi  /etc/vsftpd.chroot_list
一行一个使用者名称 重启 vsftp
sudo service vsftpd restart
限制所有,开放特定
上面的规则是限制 /etc/vsftpd.chroot_list 中的使用者,反过来限制一切,只解禁 /etc/vsftpd.chroot_list 的使用者。这样:
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
账号登入
/etc/ftpusers 档案
该档案内的使用者一律禁止 ftp 连线,预设列表包括了 root, daemon, nobody 等。需要禁止某个使用者,新增进来便是。
这个档案是由 PAM 模组的 /etc/pam.d/vsftpd 指定的
qii@ubuntu:~$ sudo cat /etc/pam.d/vsftpd
# Standard behaviour for ftpd(8).
auth    required        pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
 
# Note: vsftpd handles anonymous logins on its own. Do not enable pam_ftp.so.
 
# Standard pam includes
@include common-account
@include common-session
@include common-auth
auth    required        pam_shells.so
userlist_file 档案
vsftpd 自订的列表,跟/etc/ftpusers 类似,具体档名和路径是由使用者自己指定的。这边设成 /etc/vsftpd.user_list
新增配置档案栏位:
userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd.user_list
限制一切,开放特定
上述 2 个方法都是限制列表档案中的使用者,如果要反过来,限制一切使用者登入,只允许列表档案中的使用者,用 userlist_file,这样:
userlist_enable=YES
userlist_deny=NO
root 登入
之所以限制 root 这类账号登入就是托上面几个档案,要是你非要用系统账号登入,如上所述,将列表档案中的特定使用者名称删除便是。
WordPress 主机访问
tcp_wrappers 配置
stand alone 模式下提供基于 WordPress 主机的访问控制的配置
tcp_wrappers 使用/etc/hosts.allow 和/etc/hosts.deny 两个配置档案实现访问控制,hosts.allow 是一个许可表,hosts.deny 是一个拒绝表 在 hosts.allow 中也可以使用 DENY, 所以通常可以只使用 hosts.allow 来实现访问控制。 对 vsftpd 而言,书写 hosts.allow 有三种语法形式
1: vsftpd:WordPress 主机表(设定允许访问的 WordPress 主机表)
2: vsftpd:WordPress 主机表:DENY(设定拒绝访问的 WordPress 主机表)
3: vsftpd:WordPress 主机表:setenv VSFTPD_LOAD_CONF 配置档名(对指定的 WordPress 主机使用另外的配置)
setenv VSFTPD_LOAD_CONF 的值为指定的配置档名,意图是让 vsftpd 守护程序读取新的配置项来覆盖主配置档案中的项,实现特定待遇 这有一个小例子来说明 tcp_wrappers
功能:
》1. 拒绝 192.168.2.0/24 访问
》2. 对 192.168.1.0/24 内的所有 WordPress 主机不作连线限制和最大传输速率限制
》3. 对其他 WordPress 主机的访问限制为:每 ip 连线数为 1,最大传输速率为 10kb/s (在主配置档案中设定就好了)
首先保证设定
tcp_wrappers=YES
然后编辑
sudo vi /etc/hosts.allow
vsftpd:192.168.2.0/24: DENY(阻止 192.168.2.0 子网的访问)
vsftpd:192.168.1.0/24(允许 192.168.1.0 子网的访问)
vsftpd:192.168.1.0/24: setenv VSFTPD_LOAD_CONF /etc/xxx.conf (对 192.168.1.0/24 指定专有配置档案 xxx.conf,xxx 可以自己指定档名,需要建立)
然后建立 xxx.conf 档案,并编辑(建立档案可以用 sudo touch /etc/xxx.conf 建立)
super daemon 限制 WordPress 主机访问
只允许指定 WordPress 主机访问
在配置档案/etc/xinetd.d/vsftpd 的 {} 中新增如下的配置语句:
only_from
如 only_from 192.168.1.0 表示只允许 192.168.1.0 网段内的 WordPress 主机访问。
指定不能访问的 WordPress 主机
no_access
如:no_access 192.168.1.0 表示只有 192.168.1.0 网段内的 WordPress 主机不能访问。
WordPress 主机表
关于 WordPress 主机表的书写形式,见下表:
访问控制表时 WordPress 主机表的书写语法
选项值 含义
Hostname 可解析的 WordPress 主机名
IP Address 十进位制表示的 IP 地址
Net_name 在/etc/networks 中定义的互联网名
x.x.x.0 x.x.0.0 x.0.0.0 0.0.0.0 0 作为万用字元看待。如:191.72.61.0 匹配从 191.72.61.0 到 191.72.61.255 的所有 IP 地址。 0.0.0.0 表示匹配所有的 IP 地址
x.x.x.{a,b,.} x.x.{a,b,.} x.{a,b,.} 指定 WordPress 主机表。如:191.72.61.{1,3,123} 表示包含地址 191.72.61.1 、 191.72.61.2 和 191.72.61.123
IPAddress/netmask 定义要匹配的互联网或子网。如:172.19.16/20 匹配从 172.19.16.0 到 172.19.31.255
限制
限制连线数
前者为站群服务器最大支援连线数,后者为每个 ip 允许最多连线数。
max_clients=数字
max_per_ip=数字
错误提示分别是
qii@ubuntu:~$ ftp localhost
Connected to localhost.
421 There are too many connected users, please try later.
qii@ubuntu:~$ ftp localhost
Connected to localhost.
421 There are too many connections from your internet address.
限制下载速度
单位是位元组,所以需要换算。比如我想让匿名使用者和 vsFTP 上的使用者都以 80KB 下载,所以这个数字应该是 1024×80=81920
anon_max_rate=数字 #匿名使用者下载速度
local_max_rate=数字 #普通使用者下载速度
super daemon 限制连线数
instances 是站群服务器最多的连线数,per_source 是单个 IP 地址最多的连线数。
service ftp
{
socket_type             = stream
wait                    = no
user                    = root
server                  = /usr/sbin/vsftpd
server_args             = /etc/vsftpd.conf
log_on_success          += DURATION USERID
log_on_failure          += USERID
nice                    = 10
disable                 = no
per_source              = 10
instances               = 10
}
错误提示都是
qii@ubuntu:~$ ftp localhost
Connected to localhost.
421 Service not available, remote server has closed connection
定制错误提示,新增
banner_fail       = /etc/vsftpd.busy_banner
编辑提示内容
sudo vi /etc/vsftpd.busy_banner
比如
qii@ubuntu:~$ ftp localhost
Connected to localhost.
站群服务器大姨妈中
欢迎资讯
dirmessage_enable=YES
然后编辑各使用者 home 目录下的.message
vi .message
qii@ubuntu:~$ cat .message
欢迎来到 vsftpd
qii@ubuntu:~$ ftp localhost
Connected to localhost.
220 (vsFTPd 2.2.2)
Name (localhost:qii): qii
331 Please specify the password.
Password:
230-欢迎来到 vsftpd
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
若是匿名使用者,就放到
/var/ftp
虚拟路径
比如我的 ftp 的预设目录是/srv/ftp,我想把/mnt/LinG/WinSoft 资料夹,对映到/srv/ftp 目录中,我就如下操作 命令:
#mount –bind [原有的目录] [新目录]
先建立资料夹
sudo mkdir /srv/ftp/WinSoft
执行 mount 命令
sudo mount –bind /mnt/LinG/WinSoft /srv/ftp/WinSoft