作者: 未知 3.2 VSFTP 安全与效能兼备的ftp 服务器 3.2.1 VSFTP 概述 FTP,file transfer
protocol,这是档案传输的通讯协议,也是*般*常用来传送档案的方式。读者在使用RedHat9 的时候,可能会感受到ftp server
有*些改变:第*,就是ftp server 只剩下vsftp,原有的wuftp 等都没放入 第二,就是vsftp 从XINETD
中独立出来,并将设定档从/etc/vsftpd.conf 之中移到/etc/vsftpd/vsftpd.conf。 为什么做这样的改变?可以想见的是vsftp
已有独立运作的能力,不需要XINETD 来做更进*步的管控,并且类似sendmail、httpd、ssh、samba 等,将设定文件的放入/etc
下独立的目录。 FTP 分为两类,*种为PORT FTP,也就是*般的FTP 另*类是PASVFTP,分述如下: PORT FTP
这是*般形式的FTP,**会建立控制频道,默认值是port 21,也就是跟port 21 建立联机,并透过此联机下达指令。第二,由FTP server
端会建立数据传输频道,默认值为20,也就是跟port 20 建立联机,并透过port 20 作数据的传输。 PASV FTP 跟PORT FTP
类似,**会建立控制频道,默认值是port 21,也就是跟port 21 建立联机,并透过此联机下达指令。第二,会由client
端做出数据传输的请求,包括数据传输port 的数字。 这两者的差异为何?PORT FTP 当中的数据传输port 是由FTP server 指定,而PASV
FTP 的数据传输port 是由FTP client 决定。通常我们使用PASV FTP,是在有防火墙的环境之下,透过client 与server
的沟通,决定数据传输的port。 3.2.2 范例 3.2.1. 直接启动VSFTP 服务 这个范例是套用RedHat 的预设范例,直接启动vsftp。
[root@relay vsftpd]# /sbin/service vsftpd start Starting vsftpd for vsftpd: OK ]
3.2.2. 更换port 提供服务:将预设的port 21 更换为2121 为了安全,或是以port 来区隔不同的ftp 服务,我们可能会将ftp port
改为21 之外的port,那么,可参考以下步骤。 Step1. 修改/etc/vsftpd/vsftpd.conf 新增底下*行
listen_port=2121 Step2. 重新启动vsftpd [root@home vsftpd]# /sbin/service vsftpd
restart Shutting down vsftpd: OK ] Starting vsftpd for vsftpd: OK ] 3.2.3.
特定使用者peter、john 不得变更目录 使用者的预设目录为/home/username,若是我们不希望使用者在ftp 时能够
切换到上*层目录/home,则可参考以下步骤。 Step1. 修改/etc/vsftpd/vsftpd.conf 将底下三行
#chroot_list_enable=YES # (default follows)
#chroot_list_file=/etc/vsftpd.chroot_list 改为 chroot_list_enable=YES # (default
follows) chroot_list_file=/etc/vsftpd/chroot_list Step2. 新增*个档案:
/etc/vsftpd/chroot_list 内容增加两行: peter john Step3. 重新启动vsftpd [root@home vsftpd]#
/sbin/service vsftpd restart Shutting down vsftpd: OK ] Starting vsftpd for
vsftpd: OK ] 若是peter 欲切换到根目录以外的目录,则会出现以下警告: ftp> cd /home 550 Failed to
change directory. 3.2.4. 取消anonymous 登入 若是读者的主机不希望使用者匿*登入,则可参考以下步骤。 Step1.
修改/etc/vsftpd/vsftpd.conf 将 anonymous_enable=YES 改为 anonymous_enable=NO Step2.
重新启动vsftpd [root@home vsftpd]# /sbin/service vsftpd restart Shutting down
vsftpd: OK ] Starting vsftpd for vsftpd: OK ] 3.2.5.
安排欢迎话语若是我们希望使用者在登入时,能够看到欢迎话语,可能包括对该主机的说明,或是目录的介绍,可参考以下步骤。**确定在/etc/vsftpd/vsftpd.conf
当中是否有底下这*行 dirmessage_enable=YES RedHat9 的默认值是有上面这行的。 接着,在各目录之中,新增*为.message
的档案,再这边假设有*个使用者test1,且此使用者的根目录下有个目录*为abc,那**我们在/home/test1 之下新增.message,内容如下:
Hello~ Welcome to the home directory This is for test only...
接着,在/home/test1/abc 的目录下新增.message,内容如下: Welcome to abc's directory This is
subdir... 那么,当使用者test1 登入时,会看到以下讯息: 230- Hello~ Welcome to the home directory
230- 230- This is for test only... 230- 若是切换到abc 的目录,则会出现以下讯息: 250- Welcome to
abc's directory 250- 250- This is subdir ... 3.2.6. 对于每*个联机,以独立的process
来运作*般启动vsftp 时,我们只会看到*个*为vsftpd 的process 在运作,但若是读者希望每*个联机,都能以独立的process
来呈现,则可执行以下步骤。 Step1. 修改/etc/vsftpd/vsftpd.conf 新增底下*行 setproctitle_enable=YES
Step2. 重新启动vsftpd [root@home vsftpd]# /sbin/service vsftpd restart Shutting down
vsftpd: OK ] Starting vsftpd for vsftpd: OK ] 使用ps -ef 的指令,可以看告不同使用者联机的情形,如下图所示:
[root@home vsftpd]# ps -ef|grep ftp root 2090 1 0 16:41 pts/0 00:00:00 vsftpd:
LISTENER nobody 2120 2090 0 17:18 ? 00:00:00 vsftpd: 192.168.10.244: connected
test1 2122 2120 0 17:18 ? 00:00:00 vsftpd: 192.168.10.244/test1: IDLE nobody
2124 2090 0 17:19 ? 00:00:00 vsftpd: 192.168.10.244: connected test2 2126 2124 0
17:19 ? 00:00:00 vsftpd: 192.168.10.244/test2: IDLE root 2129 1343 0 17:20 pts/0
00:00:00 grep ftp [root@home vsftpd]# 3.2.7.
限制传输档案的速度:本机的使用者*高速度为200KBytes/s,匿*登入者所能使用的*高速度为50KBytes/s Step1.
修改/etc/vsftpd/vsftpd.conf 新增底下两行 anon_max_rate=50000 local_max_rate=200000
Step2. 重新启动vsftpd [root@home vsftpd]# /sbin/service vsftpd restart Shutting down
vsftpd: OK ] Starting vsftpd for vsftpd: OK ] 在这边速度的单位为Bytes/s,其中anon_max_rate
所限制的是匿*登入的 使用者,而local_max_rate 所限制的是本机的使用者。VSFTPD 对于速度的限
制,范围大概在80%到120%之间,也就是我们限制*高速度为100KBytes/s, 但实际的速度可能在80KBytes/s 到120KBytes/s
之间,当然,若是频宽不足 时,数值会低于此限制。 3.2.8. 针对不同的使用者限制不同的速度:假设test1
所能使用的*高速度为250KBytes/s,test2 所能使用的*高速度为500KBytes/s。 Step1.
修改/etc/vsftpd/vsftpd.conf 新增底下*行 user_config_dir=/etc/vsftpd/userconf Step2.
新增*个目录:/etc/vsftpd/userconf mkdir /etc/vsftpd/userconf Step3.
在/etc/vsftpd/userconf 之下新增*个*为test1 的档案 内容增加*行: local_max_rate=250000 Step4.
在/etc/vsftpd/userconf 之下新增*个*为test2 的档案 内容增加*行: local_max_rate=500000 Step5.
重新启动vsftpd [root@home vsftpd]# /sbin/service vsftpd restart Shutting down
vsftpd: OK ] Starting vsftpd for vsftpd: OK ] 3.2.9-1. 建置*个防火墙下的ftp
server,使用PORT FTP mode:预设的ftp port:21 以及ftp data port:20 启动VSFTPD
之后执行以下两行指令,只允许port 21 以及port 20 开放,其它关闭。 iptables -A INPUT -p tcp -m multiport
--dport 21,20 -j ACCEPT iptables -A INPUT -p tcp -j REJECT --reject-with
tcp-reset 3.2.9-2. 建置*个防火墙下的ftp server,使用PORT FTP mode: ftp port:2121 以及ftp data
port:2020 Step1. 执行以下两行指令,只允许port 2121 以及port 2020 开放,其它关闭。 iptables -A INPUT -p
tcp -m multiport --dport 2121,2020 -j ACCEPT iptables -A INPUT -p tcp -j REJECT
--reject-with tcp-reset Step2. 修改/etc/vsftpd/vsftpd.conf 新增底下两行 listen_port=2121
ftp_data_port=2020 Step3. 重新启动vsftpd [root@home vsftpd]# /sbin/service vsftpd
restart Shutting down vsftpd: OK ] Starting vsftpd for vsftpd: OK ] 在这边要注意,8、9
两个例子中,ftp client(如cuteftp)的联机方式不能够选择passive mode,否则无法建立数据的联机。也就是读者可以连上ftp
server,但是执行ls、get 等等的指令时,便无法运作。 3.2.10. 建置*个防火墙下的ftp server,使用PASS FTP mode: ftp
port:2121 以及ftp data port 从9981 到9986。 Step1. 执行以下两行指令,只允许port 2121 以及port
9981-9990 开放,其它关闭。 iptables -A INPUT -p tcp -m multiport --dport
2121,9981,9982,9983,9984,9985,9986,9987,9988,9989,9990 -j ACCEPT iptables -A
INPUT -p tcp -j REJECT --reject-with tcp-reset Step2. 修改/etc/vsftpd/vsftpd.conf
新增底下四行 listen_port=2121 pasv_enable=YES pasv_min_port=9981 pasv_max_port=9986
Step3. 重新启动vsftpd [root@home vsftpd]# /sbin/service vsftpd restart Shutting down
vsftpd: OK ] Starting vsftpd for vsftpd: OK ] 在这边要注意,在10 这个例子中,ftp
client(如cuteftp)的联机方式必须选择passive mode,否则无法建立数据的联机。也就是读者可以连上ftp server,但是执行ls,get
等等的指令时,便无法运作。 3.2.11. 将vsftpd 与TCP_wrapper 结合若是读者希望直接在/etc/hosts.allow
之中定义允许或是拒绝的来源地址,可执行以下步骤。这是简易的防火墙设定。 Step1. 确定/etc/vsftpd/vsftpd.conf
之中tcp_wrappers 的设定为YES,如下图所 示: tcp_wrappers=YES 这是RedHat9 的默认值,基本上不需修改。 Step2.
重新启动vsftpd [root@home vsftpd]# /sbin/service vsftpd restart Shutting down
vsftpd: OK ] Starting vsftpd for vsftpd: OK ] Step3.
设定/etc/hosts.allow,譬如提供111.22.33.4 以及10.1.1.1 到10.1.1.254 连 线,则可做下图之设定: vsftpd :
111.22.33.4 10.1.1. : allow ALL : ALL : DENY 3.2.12. 将vsftpd 并入XINETD
若是读者希望将vsftpd 并入XINETD 之中,也就是7.x 版的预设设定,那 么读者可以执行以下步骤。 Step1.
修改/etc/vsftpd/vsftpd.conf 将 listen=YES 改为 listen=NO Step2. 新增*个档案:
/etc/xinetd.d/vsftpd 内容如下: service vsftpd { disable = no socket_type = stream
wait = no user = root server = /usr/sbin/vsftpd port = 21 log_on_success += PID
HOST DURATION log_on_failure += HOST } Step3. 重新启动xinetd [root@home vsftpd]#
/sbin/service xinetd restart Stopping xinetd: OK ] Starting xinetd: OK ] 3.2.3
设定档说明在范例中,有些省略的设定可以在这边找到,譬如联机的总数、同*个位址的联机数、显示档案拥有者的*称等等,希望读者细读后,可以做出*适合自己的设定。格式
vsftpd.conf 的内容非常单纯,每*行即为*项设定。若是空白行或是开头为#的*行,将会被忽略。内容的格式只有*种,如下所示 option=value
要注意的是,等号两边不能加空白,不然是不正确的设定。 ===ascii 设定=====================
ascii_download_enable 管控是否可用ASCII 模式下载。默认值为NO。 ascii_upload_enable 管控是否可用ASCII
模式上传。默认值为NO。 ===个别使用者设定=================== chroot_list_enable
如果启动这项功能,则所有的本机使用者登入均可进到根目录之外的数据夹,除了列 在/etc/vsftpd.chroot_list 之中的使用者之外。默认值为NO。
userlist_enable 用法:YES/NO 若是启动此功能,则会读取/etc/vsftpd.user_list
当中的使用者*称。此项功能可以在询问密码前就出现失败讯息,而不需要检验密码的程序。默认值为关闭。 userlist_deny 用法:YES/NO
这个选项只有在userlist_enable 启动时才会被检验。如果将这个选项设为YES,则在/etc/vsftpd.user_list 中的使用者将无法登入
若设为NO , 则只有在 /etc/vsftpd.user_list 中的使用者才能登入。而且此项功能可以在询问密码前就出现错误讯息,而不需要检验密码的程序。
user_config_dir
定义个别使用者设定文件所在的目录,例如定义user_config_dir=/etc/vsftpd/userconf,且主机上有使用者test1,test2,那我们可以在user_config_dir
的目录新增文件*为test1 以及test2。若是test1 登入,则会读取user_config_dir 下的test1 这个档案内的设定。默认值为无。
===欢迎语设定===================== dirmessage_enable
如果启动这个选项,使用者第*次进入*个目录时,会检查该目录下是否有.message这个档案,若是有,则会出现此档案的内容,通常这个档案会放置欢迎话语,或是对该目录的说明。默认值为开启。
banner_file 当使用者登入时,会显示此设定所在的档案内容,通常为欢迎话语或是说明。默认值为无。 ftpd_banner
这边可定义欢迎话语的字符串,相较于banner_file 是档案的形式,而ftpd_banner 是字串的格式。预设为无。
===特殊安全设定==================== chroot_local_user
如果设定为YES,那么所有的本机的使用者都可以切换到根目录以外的数据夹。预设值为NO。 hide_ids
如果启动这项功能,所有档案的拥有者与群组都为ftp,也就是使用者登入使用ls -al之类的指令,所看到的档案拥有者跟群组均为ftp。默认值为关闭。
ls_recurse_enable 若是启动此功能,则允许登入者使用ls -R 这个指令。默认值为NO。 write_enable 用法:YES/NO
这个选项可以控制FTP 的指令是否允许更改file system,譬如STOR、DELE、 RNFR、RNTO、MKD、RMD、APPE
以及SITE。预设是关闭。 setproctitle_enable 用法:YES/NO 启动这项功能,vsftpd 会将所有联机的状况已不同的process
呈现出来,换句话说,使用ps -ef 这类的指令就可以看到联机的状态。默认值为关闭。 tcp_wrappers 用法:YES/NO 如果启动,则会将vsftpd
与tcp wrapper 结合,也就是可以在/etc/hosts.allow 与/etc/hosts.deny 中定义可联机或是拒绝的来源地址。
pam_service_name 这边定义PAM 所使用的*称,预设为vsftpd。 secure_chroot_dir
这个选项必须指定*个空的数据夹且任何登入者都不能有写入的权限,当vsftpd 不需要file system
的权限时,就会将使用者限制在此数据夹中。默认值为/usr/share/empty ===纪录文件设定=====================
xferlog_enable 用法:YES/NO 如果启动,上传与下载的信息将被完整纪录在底下xferlog_file 所定义的档案中。预设为开启。
xferlog_file 这个选项可设定纪录文件所在的位置,默认值为/var/log/vsftpd.log。 xferlog_std_format
如果启动,则纪录文件将会写为xferlog 的标准格式,如同wu-ftpd *般。默认值为关闭。 ===逾时设定======================
accept_timeout 接受建立联机的逾时设定,单位为秒。默认值为60。 connect_timeout 响应PORT
方式的数据联机的逾时设定,单位为秒。默认值为60。 data_connection_timeout 建立数据联机的逾时设定。默认值为300 秒。
idle_session_timeout 发呆的逾时设定,若是超出这时间没有数据的传送或是指令的输入,则会强迫断线,单位为秒。默认值为300。
===速率限制====================== anon_max_rate 匿*登入所能使用的*大传输速度,单位为每秒多少bytes,0
表示不限速度。默认值为0。 local_max_rate 本机使用者所能使用的*大传输速度,单位为每秒多少bytes,0 表示不限速度。预设值为0。
===新增档案权限设定================== anon_umask 匿*登入者新增档案时的umask 数值。默认值为077。
file_open_mode 上传档案的权限,与chmod 所使用的数值相同。默认值为0666。 local_umask 本机登入者新增档案时的umask
数值。默认值为077。 ===port 设定====================== connect_from_port_20 用法:YES/NO
若设为YES,则强迫ftp-data 的数据传送使用port 20。默认值为YES。 ftp_data_port 设定ftp
数据联机所使用的port。默认值为20。 listen_port FTP server 所使用的port。默认值为21。 pasv_max_port
建立资料联机所可以使用port 范围的上界,0 表示任意。默认值为0。 pasv_min_port 建立资料联机所可以使用port 范围的下界,0
表示任意。默认值为0。 ===其它======================== anon_root 使用匿*登入时,所登入的目录。默认值为无。
local_enable 用法:YES/NO 启动此功能则允许本机使用者登入。默认值为YES。 local_root
本机使用者登入时,将被更换到定义的目录下。默认值为无。 text_userdb_names 用法:YES/NO 当使用者登入后使用ls -al
之类的指令查询该档案的管理权时,预设会出现拥有者的UID,而不是该档案拥有者的*称。若是希望出现拥有者的*称,则将此功能开启。默认值为NO。
pasv_enable 若是设为NO,则不允许使用PASV 的模式建立数据的联机。默认值为开启。 ===更换档案所有权===================
chown_uploads 用法:YES/NO 若是启动,所有匿*上传数据的拥有者将被更换为chown_username
当中所设定的使用者。这样的选项对于安全及管理,是很有用的。默认值为NO。 chown_username
这里可以定义当匿*登入者上传档案时,该档案的拥有者将被置换的使用者*称。预设值为root。 ===guest 设定=====================
guest_enable 用法:YES/NO 若是启动这项功能,所有的非匿*登入者都视为guest。默认值为关闭。 guest_username
这里将定义guest 的使用者*称。默认值为ftp。 ===anonymous 设定================== anonymous_enable
用法:YES/NO 管控使否允许匿*登入,YES 为允许匿*登入,NO 为不允许。默认值为YES。 no_anon_password
若是启动这项功能,则使用匿*登入时,不会询问密码。默认值为NO。 anon_mkdir_write_enable 用法:YES/NO
如果设为YES,匿*登入者会被允许新增目录,当然,匿*使用者必须要有对上层目录的写入权。默认值为NO。 anon_other_write_enable
用法:YES/NO 如果设为YES,匿*登入者会被允许更多于上传与建立目录之外的权限,譬如删除或是更*。默认值为NO。 anon_upload_enable
用法:YES/NO 如果设为YES,匿*登入者会被允许上传目录的权限,当然,匿*使用者必须要有对上层目录的写入权。默认值为NO。
anon_world_readable_only 用法:YES/NO 如果设为YES,匿*登入者会被允许下载可阅读的档案。默认值为YES。
ftp_username 定义匿*登入的使用者*称。默认值为ftp。 deny_email_enable
若是启动这项功能,则必须提供*个档案/etc/vsftpd.banner_emails,内容为email
address。若是使用匿*登入,则会要求输入email address,若输入的email address 在此档案内,则不允许联机。默认值为NO。
===Standalone 选项================== listen 用法:YES/NO 若是启动,则vsftpd
将会以独立运作的方式执行,若是vsftpd 独立执行,如RedHat9的默认值,则必须启动 若是vsftpd 包含在xinetd
之中,则必须关闭此功能,如RedHat8。在RedHat9 的默认值为YES。 listen_address 若是vsftpd 使用standalone
的模式,可使用这个参数定义使用哪个IP address 提供这项服务,若是主机上只有定义*个IP address,则此选项不需使用,若是有多个IP
address,可定义在哪个IP address 上提供ftp 服务。若是不设定,则所有的IP address均会提供此服务。默认值为无。
max_clients 若是vsftpd 使用standalone 的模式,可使用这个参数定义*大的总联机数。超过这个数目将会拒绝联机,0
表示不限。默认值为0。 max_per_ip 若是vsftpd 使用standalone 的模式,可使用这个参数定义每个ip address
所可以联机的数目。超过这个数目将会拒绝联机,0 表示不限。默认值为0。 ============================= 3.2.4 FTP
数字代码的意义 110 重新启动标记应答。 120 服务在多久时间内ready。 125 数据链路埠开启,准备传送。 150 文件状态正常,开启数据连接端口。
200 命令执行成功。 202 命令执行失败。 211 系统状态或是系统求助响应。 212 目录的状态。 213 文件的状态。 214 求助的讯息。 215
*称系统类型。 220 新的联机服务ready。 221 服务的控制连接埠关闭,可以注销。 225 数据连结开启,但无传输动作。 226
关闭数据连接端口,请求的文件操作成功。 227 进入passive mode。 230 使用者登入。 250 请求的文件操作完成。 257 显示目前的路径*称。
331 用户*称正确,需要密码。 332 登入时需要账号信息。 350 请求的操作需要进*部的命令。 421 无法提供服务,关闭控制连结。 425
无法开启数据链路。 426 关闭联机,终止传输。 450 请求的操作未执行。 451 命令终止:有本地的错误。 452 未执行命令:磁盘空间不足。 500
格式错误,无法识别命令。 501 参数语法错误。 502 命令执行失败。 503 命令顺序错误。 504 命令所接的参数不正确。 530 未登入。 532
储存文件需要账户登入。 550 未执行请求的操作。 551 请求的命令终止,类型未知。 552 请求的文件终止,储存位溢出。 553
未执行请求的的命令,*称不正确。