如果对于被动模式还有不同的意见,我们可以再看下这篇文章:
 
 
 
如果Ftp服务器和Ftp客户端都有公网ip,中间没有防火墙,没有Nat,或者两边都仅仅是1:1的NAT,则基本上没有什么问题。
 
Ftp服务比其他internet服务www,pop3,smtp,telnet复杂的地方在于它需要至少两个连接,一个控制命令连接,一个数据传输连接。控制命令连接一定是客户端发起的,目的指向服务器的21端口,这个没有什么问题。复杂在于数据传输连接,端口号事先不确定,是通过客户发起的21端口连接临时协商的,Tcp连接的发起者不确定,同样是临时协商的。麻烦在于正常情况下,虽然这个“协商”内容全部是通过两边路由器的,但是路由器不懂他们在说什么,当然也不会主动给与配合。
 
依据数据传输连接的发起方,Ftp传输模式分为两种,主动和被动模式,模式的划分是以服务器的角度来看的。如果是客户端发起的,称为被动模式,反之,服务器端发起的,称为主动模式。
 
只要路由器做了Nat,实际上就部分充当了防火墙的角色。如果使用主动模式,而客户机位于Nat后面,服务器发起数据连接,则客户端路由器会丢掉此连接请求。鉴于国内客户机在Nat后面的普遍性,研究被动模式更具有实际价值。如果使用被动模式,则客户端路由器一般不用设什么,因为内部网向外的连接请求通常默认是允许的(当然你也可以不允许某某上网,内容不在本文之列)
 
现在进入本文核心部分,如何设置路由器和客户端软件,以便位于Nat后面的Ftp Server能够接受被动模式的数据传输。重复一下,Ftp的被动模式连接过程,首先客户端发起一个指向服务器的端口为21的连接,然后客户机和Ftp服务器协商,大家一致同意接下来的数据传输由仍然由客户端发起,服务器的ip为111.111.111.111端口号为9999(111和999只是个例子,不是真实的),到这个时候双方都还没有问题,或者有问题还没有发现
 
我们来分析一下,如果服务器的网卡用的ip为172.18.1.1,假如服务器很笨,它不知道自己的公网ip,也不去查一下,直接告诉客户机自己的ip为172.18.1.1.碰巧这个客户端同样笨,并不认为172.18.1.1的地址有什么不妥,于是很高兴地发起另外一个端口为9999的连接,指向了172.18.1.1,客户端忘了自己先前发起21连接时根本就不是用的这个172.18.1.1.这个客户端怎么这么笨啊,告诉你吧,像这样笨的客户端多着呢.filezilla,leaftp,internet explorer莫不是这样笨。Ftp服务器软件怎么这么笨啊?同样笨的服务器端软件多着呢。
 
好了,先不管笨到什么程度,继续往下看。当客户机发起数据连接后,目标地址为172.18.1.1的TCP包进入到ISP的路由器,假如叫Router1,Router1一看目的地址是172.18.1.1,马上骂了,混账,172.18开头的地址我这里没有记录,对不起,扔掉。于是服务器最终得不到客户端发起的数据连接,苦苦守望了N久,终于放弃了此次连接,传输失败。
 
假如,假如服务器端ftp软件足够聪明,向客户报告自己的真实的公网ip 123.123.123.123,而不是私有ip 172.18.1.1,又或者,虽然服务器端软件很笨,但是客户端软件聪明,它发现了172.18.1.1,认识到服务器工作有疏忽,想起了自己先前的初始连接对方ip是123.123.123,于是主动用发起的对123.123.123.123而不是172.18.1.1的数据连接。现在假如新的目标端口为9999的连接已经到了服务器端的路由器Router2外网接口。
 
 
如果Router2里存在一个端口映射,将9999的端口映射到Ftp服务器,则连接最后成功。如果数据连接的请求到了Router2,Router2认为是个非法的连接请求,客户端的连接仍到不了则Ftp服务器。有一种方案是在Ftp服务器端设置限定一端连续的端口供被动模式时客户来连接,IIS,Serv-U等软件好像都可以设,然后在路由器上把这一段端口都映射到Ftp服务器。另一种思路是路由器使用支持动态端口打开的技术,使它能读懂21端口的客户端和服务器端的谈话内容,得知他们的行动后,主动打开他们要的数据连接端口并做好映射,数据传输完毕后再关掉。某些linux路由器支持这个功能,不过好像要重新编译内核。
 
附录
 
1 不那么"笨"的Ftp客户端
 
 flashfxp,firefox ftp等能智能使用改用21端口的ip地址连接数据通道软件
 firefox不用特别设置,在url中打入ftp://xxx.xxx.xxx.xxx就可以了
 flashfxp要在 快速连接-常规-对于被动模式使用连接站点ip
 
2 不那么“笨”的Ftp 服务器软件
用serv-U,filezilla server等支持内网发布的服务器端软件(能给客户回应外部ip而不是本机私有ip)
Serv-U好像可以设置查询自身的动态域名,filezilla server可以设一个固定外网ip.
 
 
 
3 "真理"
双方都在防火墙或者NAT后面,都不想开了端口等着对方来连接,都想主动连出去,这样防火墙才不会拦截.但是只要是TCP连接,就必须至少有一方是主动连接的,主动被动是看相对哪一方而言.

NAT后面的FTP SERVER终极篇的更多相关文章

  1. NAT后的FTP服务器部署笔记

    (2019年2月19日注:这篇文章原先发在自己github那边的博客,时间是2017年2月5日) 寒假开始以后,过年之前有一个任务,为实验室的人搭建一个FTP,用之前部署好的物理服务器.这本就是网管干 ...

  2. FTP Server完整篇 ubuntu 10.04

    1. sudo apt-get install vsftpd   #安裝FTP Server(vsftp:very secure FTP) 安装后,会自动生成ftp用户,和ftp的文件夹,如果没有自动 ...

  3. 公网用户接入NAT后面的freeswitch配置

    大致网络示意和终端号码: 客户端侧: 终端号码(1019)终端IP(192.168.1.15)+ 网关(192.168.1.1) + 路由器公网IP(动态地址) 服务器侧: 防火墙(181.92.2. ...

  4. Ubuntu16.04 FTP Server 完整篇

      sudo apt-get update #更新系统 sudo apt-get install vsftpd #安装vsftpd sudo systemctl status vsftpd #判断vs ...

  5. ftp server来源分析20140602

    ftp  server学习位和源代码分析片 记录自己的第一个开源的分析过程: 从源代码:野狐灯(我接下来的几篇文章是从源头:野狐灯,每个以下哪项不是他们设置.) 20140602 Ftp的源码目录例如 ...

  6. apache ftp server的简单入门(java应用内嵌ftp server)

    Apache Ftp Server:(强调) Apache Ftp Server 是100%纯Java的FTP服务器软件,它采用MINA网络框架开发具有非常好的性能.Apache FtpServer ...

  7. 【目录】sql server 架构篇系列

    随笔分类 - sql server 架构篇系列 sql server 高可用镜像 摘要: 一.什么是数据库镜像 基本软件的高可用性解决方案 快速的故障转移恢复(3秒转移),低硬件成本 基于数据库级别的 ...

  8. How to set up an FTP server on Ubuntu 14.04

    How to set up an FTP server on Ubuntu 14.04 Setting up a fully-functional and highly secure FTP serv ...

  9. Allegro转换PADS终极篇(转载)

    Allegro转换PADS终极篇.....http://www.eda365.com/forum.php?mod=viewthread&tid=86947&fromuid=190625 ...

随机推荐

  1. Mysql数据库优化总结2

    说明:本文的环境为CENTOS 5.5 64 Bit /Mysql 5.1.50 简介:使用Mysql有一段时间了,期间做了不少关于Mysql优化.设计.维护的工作,这两天有时间做一下简单的总结,方便 ...

  2. [Everyday Mathematics]20150226

    设 $z\in\bbC$ 适合 $|z+1|>2$. 试证: $$\bex |z^3+1|>1. \eex$$

  3. Yii连接多个数据库的方法

    一.配置多数据库 大多数情况下,我们都会采用同一类型的数据库,只是为了缓解压力分成主从或分布式形式而已.声明你可以在 主配置文件 ( main.php )   中里声明其它的数据库连接: <?p ...

  4. 在VMware虚拟机中安装CentOS 7

    [声明] 欢迎转载,但请保留文章原始出处 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3917 ...

  5. nagios为监控图像添加图片

    1. 背景介绍 在监控web页面上显示主机都为问号,如下图所示: 本文的主要目的就是将监控的图片添加进去,让监控图像变得美观. 2. 图片的下载地址 图片的下载地址如下: https://exchan ...

  6. 你可能不知道的30个Python语言的特点技巧

    1 介绍 从我开始学习Python时我就决定维护一个经常使用的“窍门”列表.不论何时当我看到一段让我觉得“酷,这样也行!”的代码时(在一个例子中.在StackOverflow.在开源码软件中,等等), ...

  7. effective c++:尽量替换define,确保对象使用前初始化

    #define ASPECT_RATIO 1.653 名为ASPECT_RATIO的值在预编译阶段被替换成1.653,如果在这个常量上出现编译错误,我们可能会困惑1.653的值是什么意思,于是将因为跟 ...

  8. Flex的基础用法【转】

    //获得屏幕的分辨率 var x:Number=Capabilities.screenResolutionX; var y:Number=Capabilities.screenResolutionY; ...

  9. IIS启动出错解决方法

    IIS出现server application error,最终解决办法2007年10月30日 星期二 20:38Server Application Error The server has enc ...

  10. ios自定义View自动布局时计算大小

    https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/Impleme ...