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