网络通信 频道

SSH进阶:FTP转发


  简介
  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 successful.
  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@clinet 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服务器建立控制连接,但是,如果
0
相关文章