powered by Technology
RSS icon Email icon Bullet (black)
  • NAT/PAT中对于FTP的处理,以及PAT后的非标准21 FTP端口设置

    ========phanx.com=========
    Author:  phanx
    Updated: 2009-1-24
    =========================
     
    这里先要对FTP的两种模式说一下:
    引用一张Cisco上面的图:
    pix-asa-enable-ftp-2.gif
    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)


    这是为什么呢?
     
    答案就是在被动模式下,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
     
    而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!


    因为是主动模式,是服务器主动送数据给客户机。那客户机通过控制信息就需要告诉服务器往哪里送,
    但是FTP客户端并不知道自己的公网地址和端口,并且客户机也没有能力去自己的NAT/PAT网关上去开放一个端口让服务器来送数据。
    所以它是以自己的实际地址去告诉服务器的。对于服务器而言,这个地址是无法被访问到的,所以这个办法也有行不通的地方。
    当然,如果FTP客户端支持uPNP能识别到翻译后的公网地址,NAT/PAT网关也有uPNP的能力的话,主动模式的这个问题应该就能解决。
     
    BTW:主动模式的FTP又被称为 "firewall UNfriendly",什么原因? 好好理解哦~
     
     
    PIX/ASA上面的配置方法见: