这里先要对FTP的两种模式说一下:
引用一张Cisco上面的图:
FTP分为两种模式: 主动Active 被动 Passive
主动模式下是使用21作为控制, 20作为数据口。
首先是客户端通过大于1023的端口发起到服务器21端口的控制连接,信息交换完成后。服务器从20端口发起连接到客户端提供的接收端口。
这是传统意义上的FTP行为。
被动模式是使用21作为控制,然后服务器自动选择一个大于1023的端口作为数据。
首先是客户端通过大于1023的端口发起到服务器21端口的控制连接,信息交换完成后。服务器告诉客户端一个大于1023的端口作为数据口,
然后客户端再以另外一个大于1023的端口发起连接到服务器提供的数据端口进行数据传输。
目前大多数服务器都支持这种模式,而且大部分客户端都默认采用被动模式和服务器进行传输。
好了,当我们在内网有两台服务器FTP SEVER1和FTP SERVER2都需要被外网访问的时侯,我们会分别为这两个服务器做映射出去。
假定FTP SERVE1(10.0.0.100)占用公网IP(x.x.x.x)的21端口,FTP SERVER2(10.0.0.200)占用公网IP(x.x.x.x)的2211端口。那么我们就会这么写:
ip nat inside source static tcp 10.0.0.100 21 x.x.x.x 21 extendable
ip nat inside source static tcp 10.0.0.200 21 x.x.x.x 2211 extendable
这样做了以后,我们会发现FTP SERVER1是正常的,而FTP SERVER2却不正常,表现为登录以后无法列出目录:
以下为FTP 客户端的LOG:
[xx:xx:03] PASV
[xx:xx:03] 227 Entering Passive Mode (10,0,0,200,6,32)
[xx:xx:24] Data Socket Error: Connection timed out
[xx:xx:24] List Complete: 0 bytes in 21.44 (1.00 KBps)
[xx:xx:03] 227 Entering Passive Mode (10,0,0,200,6,32)
[xx:xx:24] Data Socket Error: Connection timed out
[xx:xx:24] List Complete: 0 bytes in 21.44 (1.00 KBps)
这是为什么呢?
答案就是在被动模式下,FTP SEVER告诉客户端的数据端口,无法被访问。为什么 FTP SERVER1又可以呢?
因为FTP SERVER1在对外映射的时侯采用了21端口,IOS会自动识别这个端口是FTP控制口,
从而去检查里面FTP数据控制数据发现服务器告诉客户端的这个用于传送数据的端口,然后自动的添加一条映射。
phanx# sh ip nat tr | in 10.0.0.100:
tcp x.x.x.x:21 10.0.0.100:21 y.y.y.y:1585 y.y.y.y:1585
tcp x.x.x.x:21 10.0.0.100:21 – -
tcp x.x.x.x:1812 10.0.0.20:1812 y.y.y.y:1594 y.y.y.y:1594
tcp x.x.x.x:21 10.0.0.100:21 y.y.y.y:1585 y.y.y.y:1585
tcp x.x.x.x:21 10.0.0.100:21 – -
tcp x.x.x.x:1812 10.0.0.20:1812 y.y.y.y:1594 y.y.y.y:1594
而FTP SERVER2映射的端口2211无法自动被识别成FTP端口,所以IOS不会自动的为它建立数据端口的映射。
解决的办法就是用 ip nat service 来指定这个端口。
access-list 10 permit 10.0.0.200
ip nat service 10 ftp tcp port 21
注意,这里的tcp port 21是指的 10.0.0.200的FTP端口21而不是 x.x.x.x的2211。如果FTP SERVER2用的FTP端口是其他的,那么就写对应的端口号。
这样做了以后,我们的FTP SERVER2就可以以 x.x.x.x:2211 的方式被公网访问了。
说道这里,问题已经解决了。但是,有人可能会提出来,既然FTP SERVER1用被动很正常,x.x.x.x:20端口并没有使用,
那为什么不用把FTP SERVER2主动模式来映射呢?比如这样做:
ip nat inside source static tcp 10.0.0.200 20 x.x.x.x 20 extendable
ip nat inside source static tcp 10.0.0.200 21 x.x.x.x 2211 extendable
OK. 这样做其实对于一部分情况是没有问题的。例如客户机的地址是公网地址,或者说能被FTP SERVER2所访问的地址。
但是如果客户机也是通过NAT/PAT上网的呢?假设客户端地址是192.168.1.111我们将看到这样的情况:
[00:14:10] PORT 192,168,1,111 ,6,179
[00:14:10] 200 PORT Command successful.
[00:14:10] REST 2028256
[00:14:10] 350 Restarting at 2028256. Send STORE or RETRIEVE.
[00:14:10] RETR fool.exe
[00:14:10] 150 Opening BINARY mode data connection for fool.exe (924668 Bytes).
[00:14:11] 425 Cannot open data connection.
[00:14:11] Transfer Failed!
[00:14:10] 200 PORT Command successful.
[00:14:10] REST 2028256
[00:14:10] 350 Restarting at 2028256. Send STORE or RETRIEVE.
[00:14:10] RETR fool.exe
[00:14:10] 150 Opening BINARY mode data connection for fool.exe (924668 Bytes).
[00:14:11] 425 Cannot open data connection.
[00:14:11] Transfer Failed!
因为是主动模式,是服务器主动送数据给客户机。那客户机通过控制信息就需要告诉服务器往哪里送,
但是FTP客户端并不知道自己的公网地址和端口,并且客户机也没有能力去自己的NAT/PAT网关上去开放一个端口让服务器来送数据。
所以它是以自己的实际地址去告诉服务器的。对于服务器而言,这个地址是无法被访问到的,所以这个办法也有行不通的地方。
当然,如果FTP客户端支持uPNP能识别到翻译后的公网地址,NAT/PAT网关也有uPNP的能力的话,主动模式的这个问题应该就能解决。
BTW:主动模式的FTP又被称为 “firewall UNfriendly”,什么原因? 好好理解哦~
PIX/ASA上面的配置方法见:
PIX/ASA 7.x: Enable FTP/TFTP Services Configuration Example
http://www.cisco.com/en/US/products/ps6120/products_configuration_example09186a00807ee585.shtml



Recent Comments
@又秀逗了
@Waiting U Here
@贴一个自己用的log4j配置的模板
@评论开启
@今天过生日