当前位置: 首页 > 图文教程 > 操作系统 > Unix/Linux > vsftpd 配置(中)

Unix/Linux
linux查看内存的大小
在linux下写的代码,用的是utf-8,结果拿到XP下运行的时候,所有的中文都成乱码
linux su和sudo命令的区别
linux cron 下的定时执行工具使用技巧
linux 查找进程及终止进程操作的相关命令
redhat linux 安装 gcc编译器
Linux Mplayer播放各种格式的电影
一起回顾一下linux常用命令
Linux 网站项目发布要做哪些配置
linux SSH配合SecureCRT的密匙完美使用方法
GD 编译出错解决方法
Facebook Open Platform编译FAQ
Linux 系统硬盘 优化
linux 挂载详解
linux crontab定时命令
Linux 系统中确保访问三级域名畅通的方法
Linux 特权帐号VS普通帐号
确保Linux系统安全的前提条件 漏洞防护
Linux 监视系统资源使用率
Red Hat Linux上使用BIND建立DNS服务器

Unix/Linux 中的 vsftpd 配置(中)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-16   浏览: 688 ::
收藏到网摘: n/a

4. IP监听与连接控制
     vsftpd工作在独立模式(standalone)下的启动参数有两项:
     listen=yes/no
     listen_ipv6=yes/no
     其中第一条已经前面已经提过了,第二条应用在ipv6网络环境中,这两相参数只能有一条值为yes。
     在实际的网络环境中,服务器通常都有多个IP地址,而每个IP地址连接不同的网段,我们可能并不希望在所有网段的上的计算机都能访问服务器。而默认情况下,vsftpd将在所有的IP地址上监听,因此,我们需要下面两行:
     listen_address=监听 ip
     listen_address6=监听 ip
     这两行分别是针对IPv4和IPv6环境的。
     下面的两项是vsftpd并发连接控制:
     max_clients=数字
     max_per_ip=数字
     参数max_clients设置了服务器可以接受的最大并发连接数量,max_per_ip设置了每个客户端IP可以发起的最大连接数。针对服务器性能适当设置这两个参数,可以在服务器可接受的连接数量和连接速度之间找到平衡点。这两项默认值均为0,表示无限制。
     accept_timeout=数字
     connect_timeout=数字
     data_connection_timeout=数字
     idle_session_timeout=数字
     上面的数字都是以秒为单位的。其中 access_timeout 代表以 pasv数据连接模式的时候,数据连接的超时;connect_timeout 表示以 port模式连接数据连接时的超时时间;关于ftp服务连接模式下面会有详细介绍。data_connection_timeout 表示数据连接后数据连接等待的空闲时间超时,超过时间后,数据连接将断开连接;idle_session_timeout 设置发呆时间,也就是客户端隔多长时间不与服务器有交互 ftp 命令,将自动断开 ftp 服务连接。
5. 关于连接端口设置
     我们知道 ftp 服务有一点是不同于其他的服务的是,ftp 服务使用的是 tcp 双连接通道,也就是ftp-server 和 ftp-data 连接。我们可以这么理解:ftp-server 连接接受客户端连接请求、并发控制、身份和权限认证以及传输客户端下达的命令。ftp-data连接负责传输数据,也就是说当有数据传输的时候才会有这条连接。我们先来看一下 ftp-server 的设置:
     listen_port=端口号
     那么这条设置可以设置 ftp-server 端口号,默认为21,如果我们指定了其它端口号,那么客户端连接服务器上时就得使用指定端口号了。我们将这一行加入主配置文件中:
     listen_port=2121
     # ftp 127.0.0.1
     ftp: connect: Connection refused
     ftp> open 127.0.0.1 2121
     Connected to 127.0.0.1.
     220 (vsFTPd 2.0.5)
     530 Please login with USER and PASS.
     ……
     已经看到效果了,接下来我们讨论ftp-data连接的问题。
     FTP数据传输有两种模式:FTP Port模式和FTP Passive模式,两种工作方式截然不同。
     FTP Port模式
     在FTP Port模式下,客户端与服务器建立ftp-server连接之后,如果某条指令涉及到数据传送,就需要建立ftp-data连接。其实连接步骤如下:
     (1) 客户端启用另一个高于1024的空闲端口xx做连接准备,并且使用port命令利用ftp-server信道向服务器发送一个数据包,数据包里包含客户端的IP地址和xx端口,告诉服务器客户端xx端口已做好连接准备。Port命令还支持第三方(third-party)模式,第三方模式是客户端告诉服务器端打开与另台主机的连接。
     (2) 服务器以ftp-data端口(默认为20)主动向客户端xx端口进行连接。
     (3) 客户端响应服务器连接,并继续完成三次握手后,ftp-data连接建立,开始传送数据。当数据传输完毕后,服务器ftp-data端口就处于等待关闭状态。
     我们看到,Port模式下ftp-data连接请求是由服务器发起的。现在来看一下vsftpd中关于Port模式的语句设置:
     port_enable=yes/no                               //是否启用 port 模式
     connect_from_port_20=yes/no                    //port 模式下是否默认使用固定的 20 端口
     ftp_data_port=port_number                        //指定 port 模式的端口号
     port_promiscuous=yes/no                 //是否使用安全的 port 模式
     将port_enable 设置为 yes,就采用 port 模式。在 port 模式下端口如果采用固定的20 端口,就把connect_from_port_20选项就设为yes,这是很多服务器默认的设置规则。我们也可以指定其他的端口,那么这也就由ftp_data_port 来指定固定端口。port_promiscuous 默认值为no,表示ftp-data连接之前检验一下数据连接的目标ip 的是否是真正客户端的IP,反之则不检查。除非你确保服务器是与真正的客户端进行连接,否则不要将此参数值改为yes。

     我们将下面两行加入配置文件中:
     port_enable=yes
     connect_from_port_20=no
     登录服务器运行3次ls(显示文件列表)命令,再在服务器端运行netstat命令查看效果:
     # ftp 127.0.0.1
     Connected to 127.0.0.1.
     ……
     230 Login successful.
     Remote system type is UNIX.
     Using binary mode to transfer files.
     ftp> passive
     Passive mode off.
     ftp> ls
     ……
     226 Directory send OK.
     ftp> ls
     ……
     ftp> ls
     ……
     ftp> bye
     # netstat -an|more
     ……
     tcp 0 0 127.0.0.1:1069 127.0.0.1:1068 TIME_WAIT
     tcp 0 0 127.0.0.1:21   127.0.0.1:1065 TIME_WAIT
     tcp 0 0 127.0.0.1:1071 127.0.0.1:1070 TIME_WAIT
     tcp 0 0 127.0.0.1:1067 127.0.0.1:1066 TIME_WAIT
     ……
     我们看到服务器开了3个大于1024的端口去连接客户端,这3个连接就是3次ls命令产生的。如果我们把connect_from_port_20参数的值改为yes,再做上述实验,就会发现服务器3次连接都固定打开20端口。如果我们再加上ftp_data_port=2020语句,再做上述实验,服务器就会固定开启2020端口。
  net.JPG (39.08 KB)
2007-5-15 15:06
    大家来看这张图,局域网客户机使用私有IP地址,并采用出口路由器做的 NAT(网络地址转换)连到 internet。ftp 服务器采用的是port模式。当客户端使用port命令向服务器发出包含自身IP地址和端口的包,此包通过路由器时路由器必须检查其内容,把包中的IP地址和端口翻译成分配给客户的地址和端口,而这个操作要求路由器必须工作在应用层!我们不可能要求每个客户的路由器都有此功能,但如果路由器没有正常完成这步工作,ftp数据传输就失败了。
     另外,由于第三方third-party模式的支持,黑客还可能在PORT命令中设置IP地址和端口号参数来指定一台其它主机的地址和端口号来发动攻击(称为FTP反弹攻击)。虽然有的防火墙设备已经修正了该问题,但对于大多数防火墙和路由器来说这个问题还是一个非常严重的。
     FTP Passive模式
     下面描述了Passive模式的ftp-data连接建立的步骤:
     (1) 当用户请求数据传输的时候,客户端软件发送PASV命令给服务器端表明客户端希望进入Passive模式;
     (2) 服务器端进行应答,应答数据包内有服务器的IP地址和一个临时端口,这个临时的端口是客户端在打开数据传输连接时应该使用的端口;
     (3) 客户端服务器发出连接请求,源端口为客户端自己选择的一个临时端口,目的端口为服务器在PASV应答命令中指定的临时端口号;
     (4) 服务器响应客户端请求,并继续完成TCP三次握手之后,ftp-data连接建立,开始传送数据。
     接下来我们来看看vsftpd中关于Passive模式中设置语句:
     pasv_enable=yes/no
     pasv_min_port=yes/no
     pasv_max_port=yes/no
     pasv_promiscuous=yes/no
     pasv_address=ip_address
     第一行设置是否启用 pasv 模式。pasv_min_port 和pasv_max_port 是设置在 pasv 模式下开启的端口范围。一般情况下,如果设置成 pasv 模式,我们最好指定端口范围,便于防火墙设置开启这个范围的端口以接受客户端的连接请求。pasv_promiscuous与port_promiscuous参数一样是设置在pasv下是否设置安全的传输,我们也要将其值设为no(默认值即为no)。pasv_address 后接一个有效的ip地址,来指定pasv打开端口的ip地址。但是默认情况下这行是取消的,因为服务会在 tcp 连接的套接字中知道连接的ip地址。我们把主配置文件改成这样然后看一下设置效果:
     listen=yes
     anonymous_enable=yes
     pasv_enable=yes
     pasv_min_port=3000
     pasv_max_port=3003
     登录服务器运行3次ls命令,再在服务器端运行netstat命令查看效果:
     # netstat -an
     ……
     tcp 0 0 192.168.0.105:3000 192.168.0.122:11066 TIME_WAIT
     tcp 0 0 192.168.0.105:3002 192.168.0.122:11065 TIME_WAIT
     tcp 0 0 192.168.0.105:3001 192.168.0.122:11063 TIME_WAIT
     我们看到,每次ls命令产生了一个连接,服务器开的端口是3000和3003之间。在 vsftpd2.0.3 以后的版本中, pasv 端口允许我们重复开启,在之前的版本里是不允许的,也就是说同一个端口可以同时与客户端建立多条连接,大家可以自己试验一下。
     大多数人认为在防火墙网络环境中Passive模式比Port模式的问题少,但我们注意到在Passive模式下,客户端向服务器端一个临时的目的端口发起连接,一些防火墙或者设备的访问控制列表(ACL)可能会阻止这种连接;同样服务器的回应也是从一个临时的端口到另一个临时的端口,防火墙或者访问列表也会阻止这种连接。在许多路由器和防火墙上(包括iptables)允许你使用访问列表关键字"established"来避免第二个问题,"established"关键字告诉路由器允许带ACK标志的包通过。而对于第一个问题,我们虽然使用pasv_min_port和pasv_max_port语句来限制服务器开设临时端口的范围,从而在防火墙上打开这些端口,但这样做还是存在一定的安全漏洞。好在多数状态检测防火墙例如Linux netfileters支持ftp协议的深层状态检测,进行准确的PASV动态端口过滤。

     五、vsftpd高级操作
     这一节我们介绍一下vsftpd的其它一些知识,其中包括:双模式切换、基于ip的虚拟ftp 站点、基于数据库虚拟用户建立及管理、基于 <, FONT face="Arial, sans-serif">OpenSSL 的加密数据传输。
    1. vsftpd双模式切换
     前面我们提过,vsftpd 服务是支持在linux下的两种服务模式:独立(standalone)模式和守护进程(xinetd)模式。在standalone模式下,vsftpd进程启动后会一直占用系统资源,当有连接请求时,它会迅速反应;在xinetd模式下,ftp服务是由守护进程统一管理,当出现ftp连接请求时,守护进程才将ftp服务启动,这种方式最大的优点是没有连接的时候ftp服务不会占用系统资源,处于睡眠状态,但因为要花费时间去唤醒该服务,所以响应时间较长。
    之前做的试验一直是把vsftpd 做在独立模式下,下面我们把它移到守护进程下。注意在工作在守护进程下时,有的参数并不起作用,详细请查阅vsftpd帮助信息(man vsftpd.conf)。
     我们需要在守护进程配置目录/etc/xinetd.d/里建立vsftpd 的守护进程文件。我们在安装时已经将该文件考到/etc/xinetd.d/目录下了。我们稍稍修改其内容:
     #vi /etc/xinetd.d/vsftpd
     service ftp
     {
         disable             = no
         socket_type                = stream
         wait                        = no
         user                        = root
         server                = /usr/local/sbin/vsftpd
         server_args                = /etc/vsftpd/vsftpd.conf
         nice                        = 10
     }
     接下来把配置文件中的listen=yes或listen_ipv6=yes去掉,停掉vsftpd服务,重启xinetd服务:
     # sesrvice vsftpd stop
     # service xinetd restart
     重新启动守护进程后,vsftpd 服务就会让守护进程来管理了。在守护进程管理过程中,我们再修改主配置文件的话,就不需要重新启动服务了。
2. 基于IP的虚拟ftp站点
     这一小节我们来讨论在同一服务器上建立多个ftp站点,每个站点相互独立,拥有独立的配置文件。当然服务器必须有两个以上的IP地址。在standalone模式下,我们可以考虑启动多个ftp服务进程;在xinetd模式下,可以让守护进程来管理。下面我们分别讨论这两种情况。为简单起见,我们在服务器上建立两个匿名虚拟站点。下面是这两个站点的信息:
                站点1                              站点2                
     ip地址                         192.168.0.105
       192.168.0.106 
    主配置文件                    /etc/vsftpd/vsftpd.conf 
    /etc/vsftpd/vsftpd2.conf 
    匿名用户映射的本地用户名 
          默认为ftp           新建立ftp2
    匿名用户主目录                          /var/ftp/  
           /var/ftp2/                
standalone模式下虚拟站点的建立
     首先我们修改站点1的配置文件/etc/vsftpd/vsftpd.conf为下面所示:
     listen=yes
     listen_address=192.168.0.105
     anonymous_enable=yes
     local_enable=yes
     pam_service_name=vsftpd

     write_enable=yes
     ftpd_banner=This is ftp1 site
     站点1就这样配置完毕了。接下来为站点2建立ftp2的用户:
     # mkdir /var/ftp2/
     # useradd -d /var/ftp2/ ftp2
     为了让站点2知道匿名用户的主目录为/var/ftp2,我们需要在配置文件中手动指定站点2使用ftp2用户登录,于是我们要用到下面这条语句:
     ftp_username=local_username
     建立站点2的配置文件/etc/vsftpd/vsftpd2.conf,内容如下:
     listen=yes
     listen_address=192.168.0.106
     anonymous_enable=yes
     local_enable=yes
     pam_service_name=vsftpd
     write_enable=yes
     ftp_username=ftp2
     ftpd_banner=This is ftp2 site
     接下来我们启动vsftpd服务,就可以看到效果了。需要注意的是这里就不能用service vsftpd start命令来启动服务了,必须用第三节前面介绍的方式启动。
     # /usr/local/sbin/vsftpd /etc/vsftpd/vsftpd.conf &
     [1] 2287
     # /usr/local/sbin/vsftpd /etc/vsftpd/vsftpd2.conf &
     [1] 2288
     # ftp 192.168.0.105
     Connected to 192.168.0.105.
     220 This is ftp1 site
     530 Please login with USER and PASS.
     ……
     # ftp 192.168.0.106
     Connected to 192.168.0.106.
     220 This is ftp2 site
     ……
     我们在各自的配置文件设置了不同的banner,上面已经看到效果了。
     守护进程模式下虚拟站点的建立
     在standalone模式下,IP的绑定在配置文件里配置了,配置文件名及其位置在启动服务的命令参数里指定;在xinetd模式下,这两步需要在守护进程配置文件里配置。这样在守护进程里面我们就得用到这两个设置:
     bind=绑定的ip
     server_args=每个站点的配置文件
     那么我们来做守护进程文件,首先来写站点1的守护进程文件:
     # vi /etc/xinetd.d/vsftpd
     service ftp
     {
         disable             = no
         socket_type       = stream
         wait              = no
         user              = root
         server            = /usr/local/sbin/vsftpd
         server_args       = /etc/vsftpd/vsftpd.conf
         nice              = 10
         bind              = 192.168.0.105
     }
     再建立站点2的守护进程文件,并输入下面的内容
     # vi /etc/xinetd.d/vsftpd2
     service ftp
     {
         disable             = no
         socket_type            = stream
         wait                   = no
         user                   = root
         server                 = /usr/local/sbin/vsftpd
         server_args           = /etc/vsftpd/vsftpd2.conf
         nice                   = 10
         bind                   = 192.168.0.106

     }
     这样两个守护进程文件就写完了,用户也在上个试验已经建立完了。接下来继续修改两个站点的配置文件,均是把listen、listen_address两行删去即可。现在我们可以重新启动xinetd服务,测试结果就不贴出来了。