服务器 频道

在nat的网络环境中发布内网ftp的问题

  【IT168 服务器学院】在nat的网络环境中发布内网ftp的问题(使用vsftpd+pf)

  网络环境:网关外网地址
  external_addr=100.100.100.100
  内网地址范围
  internal_net=192.168.0.1/24
  要发布的服务器地址:
  web_server=192.168.0.2。

  nat规则首先要建好

  nat on $ext_if from $internal_net to any -> ($ext_if)

  发布ftp的前提是必须做好21端口转发,pf规则如下:
  rdr on $ext_if proto tcp from any to $external_addr/32 port 21 -> $web_server port 21

  问题出现:发布成功ftp是可以连接的,只是速度很慢,连接成功率不高,检查原因,是无法以pasv方式连接服务器,port方式是从服务器来连接客户的机器上的端口,如果客户也处于nat环境,或者有防火墙之类的东西,那连接成功率就很低了,要想办法让pasv方式可用。

  问题分析:从ftp连接日至可以看到,使用pasv方式是服务器随机开高端口,发布给客户让客户连接,这样就给防火墙规则造成很大不便。还好大多数ftp server都可以限制pasv端口范围,那我们就可以只处理这一范围的端口就可以了,如下:

  配置ftp服务器,修改vsftpd.conf,加入如下两句:
  pasv_max_port=61000
  pasv_min_port=60000
  这样服务器只从60000-61000选择端口。

  配置网关的pf规则,转发这些端口到内网ftp服务器:

  rdr on $ext_if proto tcp from any to $external_addr/32 port 60000:61000 -> $web_server

  至此已经可以使用pasv和port两种方式访问内网ftp服务器了。

  ps:研究这个问题时还碰到一个比较有趣的现象:
  检查pasv连接服务器日至有这样一段:

  [2]     PASV
  [2] 227 Entering Passive Mode (192,168,1,2,237,41)
  以为如果ftp服务器公布的地址为内网ip的端口,ftp客户端不会连接到正确ip,所以尝试找找看有没有办法让ftp server定制公布自己的pasv ip,没想到还真找到了,vsftpd有这样一个配置项:pasv_address=100.100.100.100,这样服务器返回的信息就变掉了:
  [2] 227 Entering Passive Mode (100,100,100,100,237,41)

  结果后来又发现完整的日志其实是这样的:
  [2]     PASV
  [2] 227 Entering Passive Mode (192,168,1,2,237,41)
  [2] 打开数据连接到主机: 100.100.100.100端口: 60713
  [2]     LIST
  也就是客户端ftp软件无视服务器发布的ip而使用连接ftp server的外部ip,只留有了port,也就是说上面的配置是画蛇添足了。

  不知道是不是所有ftp客户端都是如此,以后试试看。

  又ps:第二天到公司发现还是没办法使用pasv模式,日志出现:
   500 The server returned invalid response for PASV command.
   PORT 10,111,5,133,5,88
   200 PORT command successful. Consider using PASV.

  怀疑是公司的ISA nat环境中isa的过滤器检查pasv公布的pasv ip和实际连接ip,不符则认为ftp server返回信息有问题,看来昨天的成果不是画蛇添足,把vsftpd的配置项加上后,一切恢复正常,验证了我的推测是正确的。
  

0
相关文章