您的位置:首页 > 编程语言 > PHP开发

[转载]NAT转换后FTP服务器不能访问解决方法一例

2009-01-22 00:54 561 查看
 

[转载]NAT转换后FTP服务器不能访问解决方法一例

文章作者:FreeFire

最近学习FreeBSD过程中安装了ProFTP作为FTP服务器,在使用过程中发现有很多用户从外面无法连接到FTP服务器,但我在内网访问无任何问题。

环境描述:

FreeBSD 4.10 安装ProFTP 地址 192.168.0.4/255.255.255.0 192.168.0.254

FTP服务使用非标准端口 2121,支持Port、PASV模式(指定端口50000-65534)

192.168.0.254为公司接入互联网的宽带路由器,PPPoE、动态地址.

在宽带路由器上,对外作2120、2121以及50000-65534(PASV模式)的端口转发。

网络拓扑:

FTP Server - FireWall(NAT) - Internet -[FireWall(NAT)]- FTP Client
注:[]内的FW不一定存在.

问题描述:

外网通过访问FTP服务器,登陆都正常但在LIST的时候就不能接受数据,然后连接超时。
在内网访问没有任何问题。

公司内部另有一台FTP服务器,使用标准端口,访问无任何问题.

故障分析:

通过观察FTP客户端的日志记录,在PASV模式下发现客户端与服务器的连接过程中在发送PASV指令以前一切正常,在发送PASV指令以后服务器发给客户端的回访地址是服务器的内部地

址(192.168.0.4)。外部网络访问这个地址肯定是不能访问的,所以通信失败。
Ftp使用两个tcp通道进行工作,有两种模式 PORT和PASV模式。

FTP通信过程

在Port模式下,FTP server 使用TCP 20和21号端口进行通信21号端口负责传送指令,20端口负责传输数据。当需要在服务器和客户端之间传输数据时,客户端会在控制通道发port指令类似

(PORT 192,168,0,100,6,216),客户端在本机开一个大于1024的监听端口,等待服务器连接,服务器在控制通道接受该port指令后,使用其20端口去连接client的监听端口,即server:20

-> client:any,使用该数据通道进行数据传输;

对于PASV模式,client发pasv指令,server将会随机开放一个>1024的监听端口,随后 CLIENT连接到该高端口进行数据传送。

在本例中假设服务器地址为A,防火墙为地址为B,客户端为C,那么通信过程如下:

C:ANY -> B:2121 -> A:2121 通讯正常 ,但当传输数据的时候

C:ANY(Port指令) -> B:2121 -> A:2121

A:2020 -> C:(Port指定的端口)

如果C不在防火墙(NAT)后面的话,通信是没有问题的,但如果C在防火墙(NAT)后面,并且防火墙没有相应的处理的话,这次通信将宣告失败.

PASV模式下

C:ANY -> B:2121 -> A:2121 通讯正常 ,但当传输数据的时候

C:ANY(PASV指令) -> B:2121 -> A:2121

C:ANY -> B:(PASV指定端口)-> A:(PASV指定端口)

由于服务器发送的是本地地址(私有地址),所以客户端连接也会失败。

通过对分析故障认为是宽带路由器在做NAT地址转换的时候没有对FTP协议进行处理,所以FTP Server把自身的IP地址发送给了FTP客户端。

解决办法:

在PORT模式下,加入FTP客户端也在防火墙后面的话,由于我不能去修改其设置,所以在这里不讨论这种情况下的解决办法.

在PASV模式下由于是客户端连接服务器,所以其解决方法可从两个方面考虑

1、修改防火墙(NAT)设置,使其对FTP协议进行相应的处理。
2、修改FTP服务器使其在接受到PASV指令的时候发送正确的FTP地址。

第一种方式由于我的防火墙使用的是简单的宽带路由器,不具备这样的选项,所以无法修改。通过和厂家的电话联系得知这款路由器只处理标准端口的FTP协议,这也是那台使用标准端口

的FTP服务器能工作的原因。

所以要解决这个问题必须采用第二种方法,通过查看ProFTP的文档发现ProFTP有相关的处理选项。
如下:

MasqueradeAddress=movie.vip.netbuddy.org

重新启动ProFTP,测试正常。

注:本文是事后凭记忆写的,可能会有些不准确的地方,请指正。
在查找问题的时候还使用tcpdump抓取TCP的数据包来分析,但通过包的分析和对FTP日志的分析得出的结果一致,自己把问题复杂化了。:(

测试过程中还碰到一个有趣的现象,使用FlashFXP在PASV模式下能正常访问服务器,虽然FlashFXP收到的是私有地址,但FlashFXP还能转换到正确的地址上去。虽然这样做有点不规矩,但看的出来FlashFXP的作者还是花了不少心思的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐