原贴:http://www.ititgo.cn/news_view.asp?newsid=575
vsftpd 配置(中)
录入员:admin 来源: 加入时间:2007-6-4 11:30:32 点击:274
<script type="text/javascript">
</script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>
<script type="text/javascript">
</script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>
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 端口。
大家来看这张图,局域网客户机使用私有 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 做在独立模式下,下面我们把它移到守护进程下。注意在工作在守护进程下时,有的参数并不起作用,详细请查阅 vsftp d 帮助信息 (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 服务,测试结果就不贴出来了。 未完持续 『文章来源:www.ititgo.cn 所属栏目:Linux技术文章 』