概述

本文系原创,同时发布于F5社区。

Nginx从1.9.0开始加入了stream模块支持四层的代理,转发和负载均衡。但是,stream模块的功能相对简单。对需要ALG处理的协议比如FTP的支持也远远不够。

我试着去修改了Nginx 的源代码,使之支持了FTP PORT模式和Passive模式的ALG功能。并且结合vsftpd进行了测试。 Github的源码地址为:https://github.com/pei-jikui/nginx-alg 。

可能大家会说,Passive模式不需要ALG。准确的说,Passive模式下,如果ftp client到server路由可达,可以不需要ALG。但是在client到server路由不可达的情况下,Passive模式也必须有ALG的支持。

代码修改更多是为了功能实验,代码写得比较粗糙,要想和Nginx本身的代码完全融合起来,还需要一些时间去做修改和打磨。

实验的效果如下:

图1: FTP被动数据连接

图2: FTP主动数据连接

FTP和ALG

FTP协议

FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一,也属于典型的客户端服务器结构。

FTP客户端和服务器之间需要建立两条TCP连接,一条是控制连接,用来发送控制指令,另外一条是数据连接,真正的文件传输是通过数据连接来完成的。比如在ftp客户端输入ls命令,ls命令本身是通过控制连接发送的,而ls得到的内容是通过数据连接发送的。

图3: FTP主动连接

图4:FTP被动连接

如上图对于两种传输模式来说,控制连接的建立过程都是一样,均为服务器监听21号端口,客户端向服务器的该端口发起TCP连接。

对于数据连接,FTP有两种工作方式,一种是主动方式(Port方式),另外一种是被动方式(Passive方式)。 这两种工作方式的命名是以服务器的视角来区分的。主动方式就是数据连接是服务器主动来连接客户端。被动方式是服务器被动地等待客户端来连接。主动模式服务器通过控制连接知道客户端监听的端口后,使用自己的20号端口作为源端口,“主动”发起TCP数据连接。

而被动模式服务器监听1024-65535的一个随机端口,并通过控制连接将该端口告诉客户端,客户端向服务器的该端口发起TCP数据连接,这种情况下数据连接的建立相当于服务器是“被动”的。

FTP和NAT

FTP协议出现时,Internet规模还没有如此庞大。IPV4的地址足够每一个客户端使用。所以,FTP在那时工作的很好。

随着Internet的飞速发展,IPV4的地址已经远远不够。为了解决这一问题,NAT技术就出现了。NAT技术使得多个client可以使用同一个IP进行Internet访问。但是NAT技术只会改变报文头部的IP地址,并不会改变数据报文里面的内容。这使得FTP协议在NAT环境下,数据连接会出现问题。

图5: FTP主动模式经过NAT

图6:FTP被动模式经过NAT

如上图,常见的FTP使用场景,客户端在内网,服务器在外网。客户端访问服务需要经过NAT。

客户端的报文经过了路由器NAT之后,服务器端看到的报文的客户端的报文的IP源地址和端口都已经被改变了,当然对于控制连 接来说这没有影响,因为有网关或者路由器的NAT模块在中间做管理。

对于正要通过控制连接建立的数据连接就有问题了,因为NAT改变的仅仅是IP报文 头,而对于因为报文中PORT和PASV命令中包含的地址和端口信息没有做任何改动,这样对与PORT模式服务器是无法和一个内部地址建立连接的。对于PASV模式,而且客户端和服务路由不可达的情况下,客户端无法直接和Server建立连接。所以这个时候就出现了ALG这个功 能。

ALG

ALG是Application Layer Gateway的简称。它的功能就是在发现如果报文头做了NAT,在这个时候如果发现这个是一个FTP的连接的时候,就需要同时改变PORT和PASV命令中的地址和端口。从而让client和server之间可以正确连接。在这个过程中,ALG不仅需要监听,修改控制连接的报文,还需要代理转发数据连接的报文。

代码改动的原理

Nginx Stream模块对于协议只是进行了简单的两端数据交换。本身不会对协议包内容进行任何的监听和修改。

图7:ALG对ftp的支持

代码的修改原理是,

  1. 监听ftp控制连接上的数据,如果发现server给client方法PASV <IP> <PORT>命令。修改报文中的<IP>和<PORT>。把IP改写成自己的IP地址,同时用一个新port N代替原来报文里面的PORT。
  2. 在port N上启一个监听socket.同时把修改后的报文传给client.
  3. Client收到新的报文以后就会往Nginx的port N上进行连接。
  4. 建立连接以后,Nginx再向server原来的地址和port发起连接。

等两端连接建立起来以后,client和server的数据通道就可以打通了。

结语

通过修改Nginx代码支持FTP的passive模式的ALG,可以进一步学习和理解Nginx的原理和代码,从而进一步掌握Nginx的内部运行机理。

添加Nginx ALG模块支持FTP协议ALG相关推荐

  1. 万花筒写轮眼之防火墙ALG技术之FTP协议穿墙术

    FTP协议主动模式穿越SNAT 主动模式穿越SNAT主要用于FTP服务器部署在公网,客户端需要通过SNAT转换访问服务器.如图1-1所示,描述了FTP主动模式穿越SNAT时的工作流程,此时需要借助AL ...

  2. 一款支持FTP协议的LTE物联网模块操作实例

    CLM920 AC5 MD支持分级天线 以及FTP协议,本文延时FTP协议操作过程 模块开机,确认模块初始化完成 AT+CFTPPORT 设置FTP服务器端口 ( FTP默认端口21) 示例: AT+ ...

  3. 基于Nginx+rtmp搭建支持hls协议的点播流媒体服务器(windows/Linux)

    前言:公司最近因为客户端视频文件过大导致视频加载时间很长,让我将视频播放做成流媒体点播的形式,于是查阅了几十篇相关文章以及文档,最终将功能实现.可能是存在版本差异,绝大部分文章介绍的教程并不能成功实施 ...

  4. 人脸门禁 刷卡模块 支持ISO14443A协议 手机NFC读取响应

    HSJ600HTP 非接触IC卡射频读卡模块,采用13.56MHZ射频识别频率,支持IC卡的卡号读取.当有卡靠近模块时,模块会以串口或韦根方式输出卡号,用户仅需简单的读取即可.该读卡模块支持各系列mi ...

  5. centos php ssl,CentOS下在Nginx中添加SSL证书以支持HTTPS协议访问

    1,上传证书文件至服务器,如 /usr/local/nginx/ssl 目录下 2,修改nginx的配置文件,若是虚拟站点,刚需要修改对应的配置文件,修改内容如下: #基本的SSL配置 server ...

  6. nginx webdav模块实现http协议上传文件

    1.简介 WebDAV (Web-based Distributed Authoring and Versioning) 一种基于 HTTP 1.1协议的通信协议.它扩展了HTTP 1.1,在GET. ...

  7. 基于lnmp 一键安装 添加 Nginx 的模块(module)

    lnmp 根目录下 1 lnmp.conf Nginx_Modules_Options 后添加所需的模块 如: Nginx_Modules_Options='–add-module=/usr/loca ...

  8. Nginx如何实现支持HTTPS协议详细说明

    2019独角兽企业重金招聘Python工程师标准>>> 首选Tomcat此处省略,Nginx安装时的准备工作如下: Nginx安装如下插件: openssl-1.0.2 pcre-8 ...

  9. FTP协议的分析和扩展

    2019独角兽企业重金招聘Python工程师标准>>> FTP协议的分析和扩展 出处: http://elly.blogdriver.com/index.jsp >> 1 ...

  10. 基于FTP协议实现文件上传与下载

    目录 一.FTP简介 二.关于FTP服务器 三.文件上传 分步讲解: 完整实现代码: 四.下载文件 分步讲解: 完整实现代码: 小结 一.FTP简介 FTP(File Transfer Protoco ...

最新文章

  1. 深度 | 人工智能的游戏征途:超级玛丽简直小菜一碟,星际争霸、LOL才是大boss...
  2. X86Windows 相关链接....持续更新中....
  3. vertica数据库将一个字段用逗号分割与拼接
  4. 帧中继网配置实例学习记录
  5. php使用 163邮箱接口,G. PHP发送邮件功能实现(使用163邮箱)
  6. Excel如何在文本间插入分隔符
  7. 计算机怎样更新卡驱动,电脑显卡驱动怎么更新(NVIDIA显卡手动更新教程)
  8. r52500u学计算机,r52500u相当于i几
  9. 记一次CTFd平台搭建
  10. ad域推送软件_如何在域管理环境中进行软件的推送安装
  11. Linux网络开始收发包之前需要做的事情——创建ksoftirqd内核进程
  12. 微信小程序真机调试:createEvent is not a function
  13. 如何使用web of science查找SCI WOC 号或者EI来查找检索号
  14. 熊猫烧香案疑犯抓捕全程揭秘
  15. Epic Games CEO,《无尽之剑》创始人Tim Sweeney:下一代智能手机和平板电脑的游戏趋势
  16. 织梦插件-站长必备免费织梦插件快速收录
  17. Oracle 中的一些函数
  18. UEFI引导 WIN10下安装Ubuntu18.04
  19. IntelliJ IDEA 的 Win 和 Mac 快捷键大全
  20. Springboot发送Email

热门文章

  1. 【tensorboard】解决ValueError: Duplicate plugins for name projector
  2. java无限循环小数_无限循环小数转化成分数(Java实现)
  3. Serial Scope——基于QCustomPlot的串口虚拟示波器开发过程
  4. 数据结构课程设计【银行储蓄系统】
  5. 系统重启后接口代理服务器ip地址会变,重启路由器可以IP会变吗
  6. 错误 C1083 无法打开源文件
  7. 深圳地铁五号线联网监控!
  8. 支付宝登录java和android
  9. 计算机开机跳过硬盘检查,怎样取消电脑开机磁盘自检 关闭硬盘自检方法全析...
  10. online judge start_01