1. 背景简介

最近研究如何在内网搭架FTP服务器,同时要保证外网(公网)能访问的到。终成正果,但走了一些弯路,在此记下,以飨后人。

2. 基础知识

FTP 使用 2 个端口,一个数据端口和一个命令端口(也叫做控制端口)。这两个端口一般是21 (命令端口)和 20 (数据端口),当然你也可以自定义。控制 Socket 用来传送命令,数据 Socket 是用于传送数据。每一个 FTP 命令发送之后,FTP 服务器都会返回一个字符串,其中包括一个响应代码和一些说明信息。其中的返回码主要是用于判断命令是否被成功执行了。

2.1. 命令端口

一般来说,客户端有一个 Socket用来连接 FTP 服务器的相关端口,它负责 FTP 命令的发送和接收返回的响应信息。一些操作如“登录”、“改变目录”、“删除文件”,依靠这个连接发送命令就可完成。

2.2. 数据端口

对于有数据传输的操作,主要是显示目录列表,上传、下载文件,我们需要依靠另一个 Socket来完成。

如果使用被动模式,通常服务器端会返回一个端口号。客户端需要用另开一个 Socket 来连接这个端口,然后我们可根据操作来发送命令,数据会通过新开的一个端口传输。

如果使用主动模式,通常客户端会发送一个端口号给服务器端,并在这个端口监听。服务器需要连接到客户端开启的这个数据端口,并进行数据的传输。

下面对 FTP 的主动模式和被动模式做一个简单的介绍。

2.3. 主动模式(PORT)

主动模式下,客户端随机打开一个大于1024 的端口向服务器的命令端口 P,即 21 端口,发起连接,同时开放N +1 端口监听,并向服务器发出 “port N+1” 命令,由服务器从它自己的数据端口 (20) 主动连接到客户端指定的数据端口 (N+1)。

FTP 的客户端只是告诉服务器自己的端口号,让服务器来连接客户端指定的端口。对于客户端的防火墙来说,这是从外部到内部的连接,可能会被阻塞。

2.4. 被动模式(PASV)

为了解决服务器发起到客户的连接问题,有了另一种 FTP 连接方式,即被动方式。命令连接和数据连接都由客户端发起,这样就解决了从服务器到客户端的数据端口的连接被防火墙过滤的问题。

被动模式下,当开启一个 FTP 连接时,客户端打开两个任意的本地端口 (N > 1024 和 N+1) 。

第一个端口连接服务器的 21 端口,提交 PASV 命令。然后,服务器会开启一个任意的端口 (P > 1024 ),返回如“227 entering passive mode (127,0,0,1,4,18)”。 它返回了 227 开头的信息,在括号中有以逗号隔开的六个数字,前四个指服务器的地址,最后两个,将倒数第二个乘256 再加上最后一个数字,这就是 FTP 服务器开放的用来进行数据传输的端口。如得到 227 entering passive mode(h1,h2,h3,h4,p1,p2),那么端口号是 p1*256+p2,ip 地址为h1.h2.h3.h4。这意味着在服务器上有一个端口被开放。客户端收到命令取得端口号之后, 会通过 N+1 号端口连接服务器的端口 P,然后在两个端口之间进行数据传输。

3. 我走过的弯路

使用Serv-U搭架FTP服务器很简单,网上教程也很多,不再累述。我这里只记录下我遇到的问题。

3.1. 使用环境

操作系统

FTP软件

FTP软件版本

FTP服务器

Windows XP

Serv-U

版本15.0.1.20

FTP客户端

Windows XP

FileZilla

版本3.8.0

FTP服务器安装在公司内网的电脑上,FTP客户端在外网的电脑上(严格来说也是在另一外局域网内)。

3.2. PASV端口范围

被动模式(PASV)下,有数据要传输时,服务器会打开一个数据端口(并处于监听状态),然后告知客户端,客户端连接这个数据端口发送数据。但是数据端口是随机的,那么服务器该如何将这些随机数据端口映射到公网的路由器上呢???总不能让内部网的一台机器完全暴露到公网上吧,虽然确实有这样的方案(称之为DMZ主机),但这绝对是最愚蠢的选择。

这就是我遇到的第一个弯路,折腾了很久才知道。虽然数据端口是随机的,但Serv-U可以指定随机的范围。打开Serv-U管理控制台 > 管理服务器 > 服务器限制和设置 > 服务器设置 。在“设置”选项卡里找到“PASV端口范围”,如下图所示,在这里就可以指定随见的范围了。你只要把这些端口映射到路由器就可以了。

图表 1 PASV 端口范围

当然别忘了,还有一个命令端口也得映射。

3.3. PASV IP地址

我遇到的第二个难缠的问题是,FileZilla客户端获取不到FTP服务器的目录列表。日志信息如下:

状态:    正在连接 125.89.123.99:13000...

状态:    连接建立,等待欢迎消息...

响应:    220 Serv-U FTP Server v15.0 ready...

命令:    USER zhangsan

响应:    331 User name okay, need password.

命令:    PASS ***

响应:    230 User logged in, proceed.

命令:    CLNT FileZilla

响应:    200 Noted.

命令:    OPTS UTF8 ON

响应:    200 OPTS UTF8 is set to ON.

命令:    OPTS MLST type;size;modify;perm;

响应:    200 MLST OPTS Type;Size;Modify;Perm;

状态:    已连接

状态:    读取目录列表...

命令:    PWD

响应:    257 "/" is current directory.

命令:    TYPE I

响应:    200 Type set to I.

命令:    PASV

响应:    227 Entering Passive Mode (100,100,100,100,50,203)

命令:    MLSD

响应:    150 Opening BINARY mode data connection for MLSD.

错误:    连接超时

错误:    读取目录列表失败

也是经过一阵折腾,最后突然发现服务器对PASV指令的响应是:227Entering Passive Mode (100,100,100,100,50,203),这里100.100.100.100是FTP服务器在内网IP,客户端自然连接不上。打开Serv-U管理控制台 > 你自定义的域名 > 域详细信息 > 监听器 > 编辑 ,在PASV IP地址或域名中设置公网IP即可。 如下图所示。

4. 总结

FTP服务器至少需要两个端口:命令端口和数据端口。命令端口是固定的,而数据端口是随机的。随机的端口如何映射到公网?Serv-U可以设置PASV端口范围,随机也只是在设定的范围内随机。另外需要设置PASV IP地址,否者服务器响应客户端的PASV 命令时,会把服务器在内网中的IP地址告知客户端,这个地址对应客户端来说是连接不上的。

外网访问内网的FTP服务器相关推荐

  1. 【内网穿透服务器】使用Frp外网访问内网FTP服务器(以访问内网samba服务为例)

    使用Frp外网访问内网FTP服务器(以访问内网samba服务为例) FTP是基于TCP的服务,使用两个端口,命令端口和数据端口,命令端口是21,数据端口在主动模式下为20,在被动模式随机分配. FTP ...

  2. nat123外网访问内网网站FTP数据库远程控制等等

    Nat123是什么?NAT技术?网络地址转换?外网访问内网应用?-- Nat123说明: Nat123无需安装客户端, 适合所有网络环境,支持所有TCP协议通信环境, 无需备案\无需公网IP\无需路由 ...

  3. 华为防火墙USG6000V---内网访问外网---外网访问内网服务器(NAT服务器)示例配置

    目录 一.配置要求 二.配置步骤 1. ping通防火墙接口IP地址的条件 2. 内网ping通外网终端的条件 3. 内网ping通DMZ(内网服务器)的条件 三.命令解析 一.配置要求 内网可以pi ...

  4. 无公网IP,VB应用从外网访问内网服务器

    应用需求 之前做的板子加密工具,需要客户在工厂将所有板子先扫描一遍,然后将扫描得到的结果文件通过邮件发送给开发人员.开发人员根据收到的数据文件,生成一个加密文件,并发回给工厂.工厂收到加密数据后,需要 ...

  5. 外网访问内网localhost web服务器

    在内网/局域网部署的web服务,只能在本地局域网内访问.要想在外网环境下也能够访问到,可以通过cpolar内网穿透来实现,不需要公网IP,也不需要进入到路由器,还不限制流量,支持http/https/ ...

  6. 通过外网访问内网服务器

    通过外网访问内网服务器 ---------------- 版权声明:本文为CSDN博主「Chao's Code」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文 ...

  7. 【Linux-Windows】关于外网访问内网服务器

    [Linux-Windows]关于外网访问内网服务器 1.背景 2.内网穿透 1.背景 有时候,我们搭建的服务器系统是在内网,内网即内部局域网. 内网可以访问外网,但是外网不能访问内网,外网即互联网或 ...

  8. SVN服务器搭建以及外网访问内网SVN

    一.SVN服务器的搭建 1.所需软件 TortoiseSVN,下载地址http://tortoisesvn.net/downloads.html TortoiseSVN中文语言包,下载地址http:/ ...

  9. 利用反向SSH从外网访问内网服务器

    学院的服务器在学院的内网,出了学院就不能访问,在宿舍.家里学习很不方便没有服务器的话.之前一直用TeamViewer,但是用着不舒服.最近新找到一个办法,就是利用外网服务器以及反向SSH搭一条通道,使 ...

  10. 外网访问内网服务器设置方法(路由器设置)

    A.外网访问内网服务器的设置方法  实验室有一台服务器,现有外网访问该服务器的需求,网上有各种教程,但是有些地方比较模糊,不甚详细,现将我的设置记录如下,作为参考.  目前的情况是,整个实验室属于一个 ...

最新文章

  1. 信息安全系统设计基础家庭作业
  2. 攻克指针(三)~自我总结篇
  3. 青龙羊毛——飞鸽花转省毛毛(搬运)
  4. FYFG的完整形式是什么?
  5. 李沐老师《动手学深度学习》课程总结1
  6. 【转】vc6.0移植到VS2010遇到的问题,散分给大家,虽然分不多,各位帮忙
  7. 下列有关计算机图形的叙述中错误的是,计算机图形学(9-16)-中国大学mooc-题库零氪...
  8. 递归下降分析法的基本思想。_八大算法思想总结提高
  9. java 压缩js css_Java使用YUI Compressor压缩JS/CSS文件
  10. 第四课曲面与曲线方程
  11. 流量焦虑意外带来契机,“福禄控股们”赚钱容易做大难?
  12. C# LeetCode刷题 - Leetcode 306. 累加数 - 题解
  13. 聊天机器人ChatGPT横空出世,今天来看看ChatGPT是如何回答面试官的问题的?
  14. 通过Value获取JSON中对应的KEY
  15. final 使用详解
  16. linux多字节错误,在Linux中解压缩时遇到多字节字符的问题
  17. python折叠次数计算、一张纸5毫米_一张纸最多能对折多少次?科学家:折上100次就能到达宇宙边缘...
  18. 编程中「缺省」是什么意思?
  19. TC358779XBG HDMI 转 MIPI DSI
  20. Linux离线安装yarn和配置离线仓库

热门文章

  1. 从12306看海量并发网站架构
  2. Python操作Neo4j图数据库的两种方式
  3. Java毕设项目电力公司员工安全培训系统计算机(附源码+系统+数据库+LW)
  4. 360旗下APP再遭苹果下架 巨头频遭“一刀切”
  5. 吴恩达机器学习系列课程笔记——第十六章:推荐系统(Recommender Systems)
  6. XSS 和 CSRF 详解
  7. 前端逼死强迫症之DOM
  8. 云主机的优势有哪些?
  9. python练习-模拟评委评分歌手,Python,一练,对,打分
  10. java 狗带风波_狗狗风波