vsftpd 配置(中)
脚本之家
我们将下面两行加入配置文件中:
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动态端口过滤。