SSH进阶(二):FTP转发

发表于:2007-06-22来源:作者:点击数: 标签:
简介 1.FTP协议简介 2.转发控制连接 3.FTP、防火墙和被动模式 4.FTP和 网络 地址转换(Network Address Translation) 4.1.客户端网络地址转换问题 4.2. 服务器 端网络地址转换问题 5.使用默认数据传输端口 6.转发数据连接 7.结论 简介 有关SSH,一个经常被问

   
  简介
  1.FTP协议简介
  2.转发控制连接
  3.FTP、防火墙和被动模式
  4.FTP和网络地址转换(Network Address Translation)
  
  4.1.客户端网络地址转换问题
  4.2.服务器端网络地址转换问题
  

  5.使用默认数据传输端口
  6.转发数据连接
  7.结论
  
  简介
  
  有关SSH,一个经常被问起的问题是“我怎样才能使用端口转发加强FTP安全?”。很不幸,你得到的回答一般非常简短,让你仍然无所适从。在标准FTP协议中,所有的数据都是明文传输的,因此网络上可能存在的嗅探器是一个极大的威胁。使用嗅探器,攻击者很容易获得你的帐户和密码。而在SSH的数据传输过程中,所有的数据以密文的形式传输的,所以SSH的端口转发功能能够很好地保护的帐户密码。
  
  本文详细地解释你能够使用SSH和FTP做什么,不能做什么,以及其原因。这里有FTP本身的复杂性造成的问题。除此之外,防火墙和网络地址转换(Network Address Translation)也给我们制造了不少困难。因为现在防火墙和网络地址转换(Network Address Translation)已经广泛存在了,因此我们将对这些情况进行详细的讨论。不过,由于网络环境千差万别,我们无法覆盖所有可能出现的问题,这就需要你自己举一反三了。
  
  1.FTP协议简介
  
  为了便于后面的讨论,我们首先简要地讨论一下FTP协议(如果对FTP协议已经有了比较深入的了解,你可以略过这一节)。大多数的TCP服务是使用单个的连接,一般是客户向服务器的一个周知端口发起连接,然后使用这个连接进行通讯。但是,FTP协议却有所不同,它使用双向的多个连接,而且使用的端口很难预计。一般,FTP连接包括:
  
  一个控制连接(control connection)
  
  这个连接用于传递客户端的命令和服务器端对命令的响应。它使用服务器的21端口,生存期是整个FTP会话时间。
  
  几个数据连接(data connection)
  
  这些连接用于传输文件和其它数据,例如:目录列表等。这种连接在需要数据传输时建立,而一旦数据传输完毕就关闭,每次使用的端口也不一定相同。而且,数据连接既可能是客户端发起的,也可能是服务器端发起的。
  
  下面,我们通过一个FTP客户程序看一下控制连接。这里,我们需要使用debug模式(ftp -d)才能显示客户发出的FTP协议命令。在客户程序的输出信息中,这些协议命令是以--->开头的,例如:
  
  ---> USER nixe0n
  
  在命令发出之后,服务器会发出响应,响应信息以数字开头,例如:
  
  530 Login incorrect.
  
  下面,我们和FTP服务器建立一个连接,使用用户名nixe0n登录,在会话过程中发出两次目录切换名,一次成功一次失败,其中黑体是我们的输入:
  
  ftp -d ftp.linuxaid.com.cn
  Connected to ftp.linuxaid.com.cn.
  220 ftp.linuxaid.com.cn FTP server ready.
  Name (ftp.linuxaid.com.cn:nixe0n): nixe0n
  ---> USER nixe0n
  331 Password required for nixe0n.
  Password:
  ---> PASS XXXX
  230 User nixe0n logged in.
  ---> SYST
  215 UNIX Type: L8
  Remote system type is UNIX.
  Using binary mode to transfer files.
  ftp> cd one
  ---> CWD one
  250 CWD command suclearcase/" target="_blank" >ccessful.
  ftp> cd tmp
  ---> CWD tmp
  550 tmp: No such file or directory.
  ftp> bye
  ---> QUIT
  221-You have transferred 0 bytes in 0 files.
  221-Total traffic for this session was 398 bytes in 0 transfers.
  221 Thank you for using the FTP service on ftp.linuxaid.com.cn.
  
  在FTP协议中,控制连接使用周知端口21,因此使用SSH的标准端口转发就可以这种连接进行很好的安全保护。相反,数据传输连接的目的端口通常实现无法知道,因此处理这样的端口转发非常困难。FTP协议使用一个标准的端口21作为ftp-data端口,但是这个端口只用于连接的源地址是服务器端的情况,在这个端口上根本就没有监听进程。FTP的数据连接和控制连接的方向一般是相反的,也就是说,是服务器向客户端发起一个用于数据传输的连接。连接的端口是由服务器端和客户端协商确定的。FTP协议的这个特征对SSH转发以及防火墙和NAT的配置增加了很多困难。
  
  除此之外,还有另外一种FTP模式,叫做被动模式(passive mod)。在这种模式下,数据连接是由客户程序发起的,和刚才讨论过的模式(我们可以叫做主动模式)相反。是否采取被动模式取决于客户程序,在ftp命令行中使用passive命令就可以关闭/打开被动模式。
  
  在了解了使用SSH转发FTP连接的一些难点之后,我们将开始讨论如何解决这些问题。
  
  2.转发控制连接
  
  FTP的控制连接的一端是一个周知端口21,因此很容易通过SSH实现端口的转发。通常,需要保护的FTP服务器上需要运行SSH服务,而且你需要在服务器上有一个合法帐户以便通过SSH访问FTP服务。
  
  假设你已经登录到一台主机名为client的客户主机,然后想通过安全的连接登录到FTP服务器ftp.linuxaid.com.cn。要转发FTP控制连接,首先要在client上运行一个SSH端口转发命令:
  
  [nixe0n@client nixe0n]ssh -L 2001:ftp.linuxaid.com.cn:21 ftp.linuxaid.com.cn
  nixe0n@ftp.linuxaid.com.cn's password:
  
  接着,就可以使用被转发的端口登录到ftp.linuxaid.com.cn:
  
  [nixe0n@cl.net nixe0n]ftp localhost 2001
  Connected to localhost
  220 ftp.linuxaid.com.cn FTP server ready.
  Name:foo
  Password:
  230 User foo logged in.
  ftp>
  
  这里,我们需要注意两个非常重要的问题:
  
  在本地进行转发,可能出现一些错误。
  
  在确定转发的目标时,建议不要使用localhost作为目标,因为有时使用这种地址可能出现一些莫名其妙的问题。假如在你的主机(client)上,有其它的网络接口(例如:eth0),其地址为192.168.0.1,如果你想在本机上进行SSH进行FTP端口转发:
  
  [nixe0n@localhost nixe0n]$ssh -L 2001:localhost:21 localhost
  nixe0n@localhost's password:
  
  然后,使用ftp命令登录到FTP服务器就可能出现一些错误:
  
  [nixe0n@localhost nixe0n]ftp localhost 2001
  Connected to localhost
  220 localhost FTP server ready.
  Name[localhost:nixe0n]:nixe0n
  331 Password required for nixe0n
  Password:
  230 User nixe0n logged in
  ftp>ls
  200 PORT command successful.
  425 Can't build data connection:Cannot assign requested address.
  ftp>
  
  出现这个问题是因为FTP服务器会试图通过回环地址(lo:127.0.0.1)向client(eth0:192.168.0.1)发起连接造成的。本机的回环接口只能和本机的其它回环接口进行通讯,如果和其它的网络接口(例如:eth0)通讯,就会返回"address not available"的错误。
  
  客户程序需要使用被动模式,被动模式对于解决NAT/防火墙造成的一些问题很有帮助。Linux系统的ftp命令在默认情况下使用这种模式。
  
  3.FTP、防火墙和被动模式
  
  前面我们讲过,FTP协议的数据传输存在两种模式:主动模式和被动模式。这两种模式发起连接的方向截然相反,主动模式是从服务器端向客户端发起;被动模式是客户端向服务器端发起连接。但是如果服务器和客户之间存在防火墙,主动模式经常会引起一些麻烦。设想,客户位于防火墙之后,防火墙允许所有内部向外部的连接通过,但是对于外部向内部发起的连接却存在很多限制。在这种情况下,客户可以正常地和服务器建立控制连接,而如果使用主动模式,ls、put和get等数据传输命令就很难成功运行,因为防火墙会阻塞从服务器向客户发起的数据传输连接。简单包过滤防火墙把控制连接和数据传输连接完全分离开了,因此很难通过配置防火墙允许主动模式的FTP数据传输连接通过。如果防火墙允许ICMP或者TCP RST报文通过,客户程序就会马上返回connection refused错误信息;而如果防火墙只是做简单的丢弃处理,会造成客户程序挂起一段时间。
  
  被动模式一般可以解决此类问题,因为在被动模式下,连接是由客户端发起的饿。不过,这要看FTP服务器和客户程序是否支持被动模式。命令行FTP客户程序一般使用passive命令关/开被动模式。例如:
  
  ftp>passive
  Passive mode off
  ftp>passive
  Passive mode on
  
  如果客户程序不支持被动模式,它就会返回?Invaild command;如果客户程序支持被动模式,而服务器不支持,就会返回"PASV:command not understood",PASV是一个FTP协议命令,使服务器进入到被动模式。
  
  4.FTP和网络地址转换(Network Address Translation)
  
  除了简单包过滤防火墙之外,被动模式也可以解决使用网络地址转换(NAT)给FTP造成的一些问题。在转发报文之前,进行网络地址转换的网关首先会改变报文的源地址和目的地址。网络地址转换能够提高网络的安全性,有助于解决IP地址资源不足问题。
  
  4.1.客户端网络地址转换问题
  
  假设你的FTP客户主机位于局域网内,通过一个网络地址转换(NAT)网关连入互联网。在这种情况下,客户程序可以毫无困难地和外部的FTP服务器建立控制连接,但是,如果

原文转自:http://www.ltesting.net