想用Nginx代理一切?行!
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代理一切?行!的更多相关文章
- ubuntu下发布asp.net core并用nginx代理之旅
asp.net core 1.0.1发布已有些日子了,怀着好奇的心情体验了把ubuntu下的asp.net core 系统运行环境:ubuntu 16.0.4 for developer 首先搭建.n ...
- nginx代理tomcat
http://blog.csdn.net/kongqz/article/details/6838989 http://www.800l.com/linux-nginx-tomcat-jdk.html ...
- Nginx 代理 jira 和 confluence
原文出处:http://blog.chenlb.com/2012/01/nginx-proxy-jira-and-confluence.html jira 和 confluence 想部署到同一台机器 ...
- nginx代理 (带着请求头)
当你获得云服务器之后, 你有这样一个需求:当你要访问一个url的时候,这个URL只能在人家的云服务器上访问(比如百度),所以你要买百度的BCC,你可能在想在BCC起服务,那样有点麻烦,直接使用ngin ...
- 使用nginx代理kibana并配置登录验证
由于kibana不支持登录验证,谁都可以访问,放到公网就不合适了,这里配置用nginx进行代理: 生成密码文件 如果安装了httpd可以用htpasswd,比较方便: htpasswd -c /roo ...
- nginx代理配置 配置中的静态资源配置,root 和 alias的区别。启动注意事项
这篇主要内容是:nginx代理配置 配置中的静态资源配置,root 和 alias的区别.启动注意事项! 为什么会在window上配置了nginx呢?最近我们的项目是静态资源单独放在一个工程里面,后端 ...
- 使用nginx代理后以及配置https后,如何获取真实的ip地址
使用nginx代理后以及配置https后,如何获取真实的ip地址 Date:2018-8-27 14:15:51 使用nginx, apache等反向代理后,如果想获取请求的真实ip,要在nginx中 ...
- 多级nginx代理,获取客户端真实ip
今天服务里的微信公众号支付业务突然不能用了,报错为网络环境未能通过安全验证,请稍后再试.检查后端日志,没有任何问题,看来是成功创建支付订单,但是调起支付时出现了问题.上网查了一下,这个报错的直接原因是 ...
- Nginx代理MysqlCluster集群
-------Nginx代理MysqlCluster 公司有一个公网ip,有公网ip(222.222.222.222)那台服务器上装的nginx,mysql装在公司另外一台服务器上假设ip为192.1 ...
随机推荐
- shiro 退出过滤器 logout ---退出清除HTTPSession数据
重写LogouFilter类 import org.apache.shiro.web.filter.authc.LogoutFilter; public class ShiroLogoutFilter ...
- Magicodes.IE之导入导出筛选器
总体设计 Magicodes.IE是一个导入导出通用库,支持Dto导入导出以及动态导出,支持Excel.Word.Pdf.Csv和Html.在本篇教程,笔者将讲述如何使用Magicodes.IE的 ...
- Redis利用,攻击内网(ssrf)
Redis语法 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统. Redis是一个开源的使用ANSI C ...
- MySQL中concat()、concat_ws()、group_concat()函数的使用技巧与心得总结
Author:极客小俊 一个专注于web技术的80后 我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人! CSDN@极客小俊,原创文章, B站技术分享 B站视频 : Bilibili.c ...
- C# 中的延时的方法。
转载:https://blog.csdn.net/caixiexin/article/details/5769121 System.Threading.Thread.Sleep(2000); 其中20 ...
- Batch批处理 间断向EXE发送参数
参考:https://blog.csdn.net/wjz1029/article/details/45044033 找了很久的一种方法: 怎样向一个EXE 发送一个参数,得到反馈后,再向EXE发送一个 ...
- DevOps元素周期表——1号元素 Gitlab
DevOps元素周期表--1号元素 Gitlab GitLab 是由 GitLab Inc.开发,一款基于 Git 的完全集成的软件开发平台(fully integrated software dev ...
- 白话解析:一致性哈希算法 consistent hashing【转】
学习一致性哈希算法原理的时候看到博主朱双印的一片文章,看完就懂,大佬! 白话解析:一致性哈希算法 consistent hashing
- 50种编程语言,一句 “Hello, World”!展现编程语言七十年发展!
mod confinment { use std::os::raw::{c_char}; extern "C" { pub fn puts(txt: *const c_char); ...
- spring boot: 从配置文件中读取数据的常用方法(spring boot 2.3.4)
一,从配置文件中读取数据有哪些方法? 通常有3种用法: 1,直接使用value注解引用得到配置项的值 2, 封装到Component类中再调用 3, 用Environment类从代码中直接访问 生 ...