1.ftp 协议的简单描述 与http等基于单个连接的协议不同,ftp使用两个tcp通道进行工作, 一个是client:any ->; server:21 的连接,称为控制通道,用于传输 相关的ftp工作指令资料;另外一个是数据通道,用于在list/get/put 等指令时传输数据内容,该通道的建立有不同的方式。 在数据通道的建立上,为了适应不同的情况,ftp server支持两种 模式:主动模式/被动模式(port/pasv),在port模式下,当需要在 server和client之间传输数据时(比如用户发送ls指令,服务器要把文 件列表传输回client),client会在控制通道发port指令类似 (PORT 192,168,0,170,4,58),client在本机开一个>;1024的监听端口, 等待server连接,server在控制通道接受该port指令后,使用其20端口 去连接client的监听端口,即server:20 ->; client:any,使用该数据通 道进行数据传输;对于PASV模式,client发pasv指令,server将会随机 开放一个>;1024的监听端口,随后 CLIENT连接到该高端口进行数据传送。 (还有fxp,是比较特别的,不作讨论) 2. 防火墙对ftp的影响以及解决方法; 从上述ftp工作的简单描述中我们看到防火墙会影响到client <->; server 的数据传输,有下列几种情况: 1).server <-wan->; client,没有防火墙,没有任何限制。 2).server <-wan->;fw -- client,client在防火墙后面,使用私网地址, 通过NAT访问公网: 在一般的情况下,port指令将被防火墙阻挡,表现为client发port 指令(通常ls就会需要进行一次data传输)时总是得不到server的响应,直到超时 错误,此时,是因为server无法连接到client所开的随机高端口(client在port指 令中会告知server自己所开的端口以及自己的地址);此时client可以使用pasv模 式进行工作;如果该client不能使用pasv指令(如一些简单的ftp client程序,我 遇到的有ca kill的病毒代码库自动升级程序,使用ftp从服务器下载升级文件), 就要求防火墙具有outing ftp proxy功能(iptables称ftp conntrack),或称ftp 映射内核代理,即防火墙监控在特定端口(一般是21)的ftp连接,在检测到client 向server发送的port指令时,把该指令中的client地址以及端口修改为防火墙地址以 及端口,再把修改后的数据发往server,同时在server返回数据时将该数据重定向到 client的监听端口,完成一次完整的port过程; 在Ipfilter下可以使用类似下面的nat规则实现,其他的防火墙产品请查阅其文档: map ed0 192.168.100.0/24 ->; 211.97.116.21x/32 proxy port ftp ftp/tcp 3).server --fw <-wan->; client,server在防火墙后面,使用私网地址,通过fw的 重定向接收外部访问: 此时,port指令没问题,但是pasv会被防火墙阻挡,出错的表现类似port指令, 此时,client可使用port指令工作;如果需要server支持pasv,需要在防火墙以及ftp server 上做相应的设置: 首先,设置pasv参数: Proftpd: #/usr/local/etc/proftpd.conf MasqueradeAddress 211.97.116.21x #该参数设置在client发pasv指令时,server返回给client的pasv地址串中应该包含的连接地址, #该地址通常是防火墙的外部地址(作rdr的地址) PassivePorts 30001 50000 # These ports should be safe... #该参数说明pasv指令使用的端口范围 对于pure-ftpd # Port range for passive connections replies. - for firewalling. PassivePortRange 30001 50000 #在防火墙上开放的passsive端口范围 # Force an IP address in PASV/EPSV/SPSV replies. - for NAT. ForcePassiveIP 211.97.116.21x #这里211.97.116.21x就是防火墙进行rdr的公网地址了。 对于windows里的serv-u在其高级设置里也有类似的设置(passive ports,passive address), 图形界面,很简单了; 如果是其他的ftpd,应该也有类似的设置,如wu-ftpd,不熟悉,不胡说。 然后设置防火墙: pass in on ed0 proto tcp from any to 192.168.100.10 port 30000 >;< 50001 flags S keep state #允许外部连接server的pasv端口范围 rdr ed0 211.97.116.21x/32 port 30001-50000 ->; 192.168.100.10 port 30001 tcp #将该范围的端口重定向到ftp server #注意:某些ftp server并没有proftpd这样的配置参数(比如ms iis里的ftp), #将不能通过此方法解决问题,具体请查阅其说明书。 如果是使用iptables,就简单些: #iptables modules #modprobe ip_tables #nat modprobe iptable_nat #connect_track modprobe ip_conntrack #ftp NAT,PASV,PORT command. modprobe ip_conntrack_ftp modprobe ip_nat_ftp 有ftp的DNAT支持模块,在规则里做21端口的DNAT重定向即可,conntrack会自动维护其中的PORT/PASSIVE关系。 4).server --fw<->;fw -- client server和client都在防火墙后面: 如果没有特别的方法,server和client之间将不能工作;解决的办法就是综合上述2).3)的方法, 在server的防火墙以及client的防火墙分别做相应的设置. BTW:不单是ftp server,其他的某些服务也有类似问题,比如netmeeting(h323),pptp server,解决的思路也相似。 |
|
来自: sven_ > 《NAT&&ACL》