Nginx能代理一切吗?

是的,Nginx可以作为一个优秀的http网关,但nginx能代理SSH2,MySQL,Oracle的连接吗?也算行吧,nginx有stream-module,专门处理TCP,UDP连接。不过即使忽略

  • stream-module反人类的使用方式、
  • nginx内部复杂的阶段划分、
  • 各个阶段对使用方式的限制、
  • 以及为了完成某个功能不得不重新编译下载的一系列缺点,

Stream-module的功能也远远不够。不信你可以试试修改一个包的内容,或者自动回复某种类型的包试试,更别提完成这样几个操作:修改一下客户端输入的sql语句,或者更进一步,加入一个身份验证。

如果你是一个nginx+lua或Openresty或KONG或APISix的网关重度依赖用户,那么你肯定急切的希望把网关的能力扩展到TCP/IP领域。

我们来看几个示例

修改Linux|Unix欢迎屏幕为所有男人的梦想

记录SQL或shell命令



防止删库跑路(命令过滤和禁止)



踢人下线

怎么做到的

上面的示例是怎么做到的?不要着急,我们的主人公就要出场了:SuProxy,一个纯Lua,事件驱动模型,基于包分析的开源代理库。

纯LUA意味着拷贝可用,事件驱动意味着使用方便,包分析意味着可以真正自由修改包内容

我们来看看怎么修改linux的欢迎屏幕

local function myWelcome(context,source)
local digger={"\r\n",
[[ .-. ]].."\r\n",
[[ / \ ]].."\r\n",
[[ _____.....-----|(o) | ]].."\r\n",
[[ _..--' _..--| .'' ]].."\r\n",
[[ .' o _..--'' | | | ]].."\r\n",
[[ / _/_..--'' | | | ]].."\r\n",
[[ ________/ / / | | | ]].."\r\n",
[[ | _ ____\ / / | | | ]].."\r\n",
[[ _.-----._________|| || \\ / | | | ]].."\r\n",
[[|=================||=||_____\\ |__|-' ]].."\r\n",
[[| suproxy ||_||_____// (o\ | ]].."\r\n",
[[|_________________|_________/ |-\| ]].."\r\n",
[[ `-------------._______.----' / `. ]].."\r\n",
[[ .,.,.,.,.,.,.,.,.,.,.,.,., / \]].."\r\n",
[[ ((O) o o o o ======= o o(O)) ._.' /]].."\r\n",
[[ `-.,.,.,.,.,.,.,.,.,.,.,-' `.......' ]].."\r\n",
[[ scan me to login ]].."\r\n",
"\r\n",
}
return table.concat(digger),false
end local ssh=require("suproxy.ssh2"):new()
local cmd=require("suproxy.ssh2.commandCollector"):new()
cmd.BeforeWelcomeEvent:addHandler(ssh,myWelcome)
local channel=require("suproxy.channel"):new({{ip="127.0.0.1",port=2222}},ssh)
channel:run()

上面的例子里,通过处理commandCollector.BeforeWelcomeEvent事件,在事件中修改了默认的欢迎屏幕。

每个协议都有自己独特的事件,比如利用TNSProcessor.commandEntered事件,我们就能过滤用户输入的命令,使用OnAuthenticate事件就能够自行处理验证。事件的使用可参见https://www.cnblogs.com/yizhu2000/p/13885263.html或英文文档https://github.com/yizhu2000/suproxy

还想更进一步

除了上面这些直观的事件,在底层SuProxy还为高级用户提供了协议解析事件,这些事件把协议内部的包往来暴露出来,用户可以处理这些事件从而修改包的内容,实现更高级的逻辑,比如SSH2协议提供了如下事件(C2P意味着从Client到SuProxy,S2P意味着从SuProxy到Server)

C2PParser.events.KeyXInitEvent,C2PParser.events.AuthReqEvent,C2PParser.events.DHKeyXInitEvent,C2PParser.events.NewKeysEvent,C2PParser.events.ChannelDataEvent,S2PParser.events.KeyXInitEvent,S2PParser.events.DHKeyXReplyEvent,S2PParser.events.AuthSuccessEvent,S2PParser.events.AuthFailEvent,S2PParser.events.NewKeysEvent,S2PParser.events.ChannelDataEvent

熟悉SSH2协议的同学可以自行解析扩展。

实现方式

SuProxy自行处理了request socket的数据,并在上下游间建立通道,在通道中使用不同处理器处理协议相关的内容

Channel 负责管理连接,数据收发

Parser负责进行解析和打包

Processor 负责处理加解密及对解析后的包进行业务处理

其中processor和parser用户都可以自行扩展,增加processor可以扩展协议,增加parser可以扩展协议中某类特定包的解析

三个层次都会发出事件。具体可见下图

欢迎拍砖

看了上面的介绍,感兴趣的同学有问题可以在此留言,或直接在git上提交

https://github.com/yizhu2000/suproxy/issues

也可以通过邮件组suproxy@googlegroups.com,或直接发邮件到yizhu2000@hotmail.com进行沟通

当然SuProxy当前还在试验阶段,已经支持SSH2,LDAP,TNS,TDS协议,使用示例和文档将会陆续在博客园,CSDN博客,Git上发布,欢迎大家测试,并提出意见与建议,

项目Git地址:

https://github.com/yizhu2000/suproxy

文档地址(英文):

https://github.com/yizhu2000/suproxy/blob/main/readme.md

想用Nginx代理一切?行!的更多相关文章

  1. ubuntu下发布asp.net core并用nginx代理之旅

    asp.net core 1.0.1发布已有些日子了,怀着好奇的心情体验了把ubuntu下的asp.net core 系统运行环境:ubuntu 16.0.4 for developer 首先搭建.n ...

  2. nginx代理tomcat

    http://blog.csdn.net/kongqz/article/details/6838989 http://www.800l.com/linux-nginx-tomcat-jdk.html ...

  3. Nginx 代理 jira 和 confluence

    原文出处:http://blog.chenlb.com/2012/01/nginx-proxy-jira-and-confluence.html jira 和 confluence 想部署到同一台机器 ...

  4. nginx代理 (带着请求头)

    当你获得云服务器之后, 你有这样一个需求:当你要访问一个url的时候,这个URL只能在人家的云服务器上访问(比如百度),所以你要买百度的BCC,你可能在想在BCC起服务,那样有点麻烦,直接使用ngin ...

  5. 使用nginx代理kibana并配置登录验证

    由于kibana不支持登录验证,谁都可以访问,放到公网就不合适了,这里配置用nginx进行代理: 生成密码文件 如果安装了httpd可以用htpasswd,比较方便: htpasswd -c /roo ...

  6. nginx代理配置 配置中的静态资源配置,root 和 alias的区别。启动注意事项

    这篇主要内容是:nginx代理配置 配置中的静态资源配置,root 和 alias的区别.启动注意事项! 为什么会在window上配置了nginx呢?最近我们的项目是静态资源单独放在一个工程里面,后端 ...

  7. 使用nginx代理后以及配置https后,如何获取真实的ip地址

    使用nginx代理后以及配置https后,如何获取真实的ip地址 Date:2018-8-27 14:15:51 使用nginx, apache等反向代理后,如果想获取请求的真实ip,要在nginx中 ...

  8. 多级nginx代理,获取客户端真实ip

    今天服务里的微信公众号支付业务突然不能用了,报错为网络环境未能通过安全验证,请稍后再试.检查后端日志,没有任何问题,看来是成功创建支付订单,但是调起支付时出现了问题.上网查了一下,这个报错的直接原因是 ...

  9. Nginx代理MysqlCluster集群

    -------Nginx代理MysqlCluster 公司有一个公网ip,有公网ip(222.222.222.222)那台服务器上装的nginx,mysql装在公司另外一台服务器上假设ip为192.1 ...

随机推荐

  1. 微服务实战系列(二)-注册中心Springcloud Eureka客户端

    1. 场景描述 前几天介绍了下springcloud的Eureka注册中心(springcloud-注册中心快速构建),今天结合springboot-web介绍下eureka客户端服务注册. 2. 解 ...

  2. tf.split函数的用法(tensorflow1.13.0)

    tf.split(input, num_split, dimension): dimension指输入张量的哪一个维度,如果是0就表示对第0维度进行切割:num_split就是切割的数量,如果是2就表 ...

  3. 转载:pycharm IDE 导入自定义模块

    http://www.mamicode.com/info-detail-2241193.html

  4. nginx 1.12安装

    准备工作 使用root用户安装. 到nginx官网下载Linux源码或者执行:wget http://nginx.org/download/nginx-1.12.2.tar.gz. 到pcre站点下载 ...

  5. [Vue warn]: Error in render: "TypeError: Cannot read property 'matched' of undefined" found in <App> at src/App.vue

    当用Vue模块化开发时,输入  http://localhost:8080  页面没有显示,首先按F12,检查是否有如下错误 话不多说,直接看下面: 解决方法1 如果是上面出的问题,以后就要注意了哦, ...

  6. js自定义属性的操作

    <body> <div id = "demo" index = "1" class = "nav"></div ...

  7. JavaScript按钮排他思想

    要求: 有一系列按钮,要求每单击其中一个,该按钮改变样式(以背景颜色为例),其他按钮恢复保持默认样式. 实现思路: 获取所有按钮元素 首先先把其他按钮的背景颜色去掉 再单独设置自己的样式 代码实现: ...

  8. python框架day01

    一.注意事项 # 如何让你的计算机能够正常的启动django项目 1.计算机的名称不能有中文 2.一个pycharm窗口只开一个项目 3.项目里面所有的文件也尽量不要出现中文 4.python解释器尽 ...

  9. 秒懂JVM的垃圾回收机制

    前言 阅读过王子之前JVM文章的小伙伴们,应该已经对JVM的内存分布情况有了一个清晰的认识了,今天我们就接着来聊聊JVM的垃圾回收机制,让小伙伴们轻松理解JVM是怎么进行垃圾回收的. 复制算法.Ede ...

  10. JVM(五):JVM模型与GC

    确定垃圾 引用计数(存在循环引用问题) 根可达算法 常见的垃圾回收算法 标记清除算法-位置不连续,产生碎片 拷贝算法- 没有碎片,浪费空间 标记压缩-没有碎片,效率偏低(多线程需要进行线程同步,单线程 ...