如果对于被动模式还有不同的意见,我们可以再看下这篇文章:
 
 
 
如果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. 使GridView可以单行横向滑动

    最近做的练手的小项目中存在一个横向滑动的问题,需要HorizontalScroll中嵌套GridView,但是GridView默认是竖直排放的item,况且HorizontalScroll与GridV ...

  2. 被投资人“送”入看守所 z

    http://news.cnblogs.com/n/506969/ 拜读了[[畅言]读<被投资人“送”入看守所>一文有感]一文有感,很想跟作者探讨几句.虽然他的看法很有理性,但站在一个刑案 ...

  3. Excel导出问题(导出时不去掉前面的0)(转)

    最简单的方法是:在数字前面加'符号.即代码里添加: "'" 以下均是网上搜集到的其他解答: 一.代码如下: style="mso-number-format:'/@';& ...

  4. 【转】linux下cpio命令使用

    转自:http://www.51testing.com/html/32/498132-816949.html 功能说明:备份文件. 补充说明:cpio是用来建立,还原备份档的工具程序,它可以加入,解开 ...

  5. 渗透测试实例Windows XP SP2

    一.msf> use exploit/windows/dcerpc/ms03_026_dcom.看到命令提示符的改变表明该命令已经运行成功. 二.为漏洞利用代码设置必要的参数,show opti ...

  6. (转载)OC学习篇之---Foundation框架中的NSObject对象

    前一篇文章讲到了OC中的代理模式,而且前几篇文章就介绍了OC中的类相关知识,从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套a ...

  7. static public和 public static 区别

    static:加static 的是静态成员,不能实例化在你运行的时候他自己在内存中开辟了块空间,不用在new, 有点像全局变量,如果不用你必须去 实例化(new)才能用 static是静态的意思,pu ...

  8. 在JSP中使用CKEditor网页编辑器

    为了在我的一个项目使用CKEditor网页编辑器,我开始了寻找应用之法. 我下载了ckeditor_4.3.3_standard和ckeditor-java-core-3.5.3. 之前的版本和现在版 ...

  9. gem 相关命令

    gem #查看gem源 gem sources # 删除默认的gem源 gem sources --remove http://rubygems.org/ # 增加taobao作为gem源 gem s ...

  10. HDU-3874 Necklace 线段树+离线

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3874 比较简单的题,题意也好懂. 先O(n)求每个数左边第一次出现的与他相同的数的位置l[i].对询问 ...