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