range内核端口数据转发模块
NGINX 向云原生演进,All in OpenNJet
range 端口转发模块
1.1 需求
在很多时候,比如流量劫持、ftp被动模式代理等功能需要能够支持流量端口转发。比如需要将10000到11000端口范围的所有流量都统一转到12000端口上,然后在12000端口上接收所有的报文进行后续处理。
1.2 依赖
该功能的实现依赖于iptables,如果通过rpm包安装,则自动为privilege进程为root启动
如果是普通用户启动,需要对opennjet设置setuid权限
setcap cap_setuid=eip /home/njet/sbin/njet
1.3 指令设计
Syntax | range type={tcp|udp} src_ports={port1:port2} dst_port={dst_port};
如果默认iptables path为/usr/sbin/iptables, 如果系统iptables路径不是这个,需要指定使用如下指令 range iptables_path={iptables_path}; |
Default | - |
Context | Core, 支持配置多条 |
参数说明:
参数 | 类型 | 必填 | 默认值 | 说明 |
type | string | 否 | tcp | [tcp|udp], 指明是tcp还是udp数据,默认tcp |
src_ports | string | 是 | -
| 支持单端口或者端口范围,格式如下: 端口范围(冒号分隔): 11000:12000 一个端口: 11000 |
dst_port | int | 是 | - | 目标端口 |
iptables_path
| string | 否
| /usr/sbin/iptables
| 这个根据系统而定,调用system执行的时候可能会出现找不到iptables错误,这个时候需要看看对应系统的iptables path,然后设置一下这个参数
如果配置多条range指令,则以最后一个明确指定的iptables_path为准 |
配置示例(tcp为例):
- 将发往本机端口为11000到12000范围的数据,转发到13000端口:
range type=tcp src_ports=11000:12000 dst_port=13000
- 将发往本机端口为11000,转发到13000端口:
range type=tcp src_ports=11000 dst_port=13000
- 设置iptables path为/usr/sbin/iptables
range iptables_path=/usr/sbin/iptables;
1.4 实现方案
本功能的实现借助于iptables规则,通过range指令解析参数,然后生成对应的iptables规则下发。
range指令支持配置多条规则
模块init的时候会根据规则生成iptables规则
模块exit的时候会将规则进行删除
所有的规则都会放到自定义iptables链 OPENNJET上
1.5 测试
1.5.1 配置示例
njet.conf 配置里配置两条range指令
... load_module modules/njt_range_module.so; #加载range模块 |
1.5.2 测试结果
启动OpenNJet前
查询系统iptables 规则:
启动OpenNJet后
重新查询iptables规则,发现两条规则生效
reload重启后
重新查询,发现两条规则还在
停止OpenNJet后
重新查询,两条规则删除
2. 命令式 API 动态配置端口转发规则
2.1 需求:
能够通过api接口查询全量的range 配置规则
能够通过api增加或者删除一条range配置规则
根据type、src_ports、dst_port三个字段来确定一条规则
2.2 配置
ctrl控制面配置:
... |
2.3 动态API
查询:
GET http://192.168.40.136:8081/range
{ |
PUT http://192.168.40.136:8081/range
#添加一条规则 |
参数 | 类型 | 必填 | 默认值 | 说明 |
action | string | 是 | - | [add|del] |
type | string | 是 | - | [tcp|udp], 指明是tcp还是udp数据 |
src_ports | string | 是 | -
| 支持单端口或者端口范围,格式如下: 端口范围(冒号分隔): 11000:12000 一个端口: 11000 |
dst_port | int | 是 | - | 目标端口 |
return:
{ |
错误码
code | msg | 描述 |
|
0 | success | 成功 |
|
2 | - | 内存分配失败相关的一些错误信息 |
|
4 | rule is not found | 删除一个不存在的规则 |
|
4 | rule has exist | 添加一个已经存在的规则 |
|
4 | 其他错误 |
|
|
2.4 swagger访问
可以通过doc模块提供的swagger界面操作
http://192.168.40.136:8081/doc/swagger/
2.5 测试
通过swagger页面进行api测试
初始状态get 查询配置
查询iptables
通过swagger页面添加一个规则
再次 查询配置和iptables
reload后再次查询,动态添加的配置和iptables都存在刚才动态添加的配置
Stop OpenNJet后,iptables规则消失
OpenNJet 最早是基于 NGINX1.19 基础 fork 并独立演进,具有高性能、稳定、易扩展的特点,同时也解决了 NGINX 长期存在的难于动态配置、管理功能影响业务等问题。 邮件组 官网

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
中间件是开箱即用的吗?为什么要开发中间件adapter?
本文分享自华为云社区《中间件是开箱即用的吗?为什么要开发中间件adapter?》,作者:张俭。 中间件在很多系统中都存在 在一个系统里面,或多或少地都会有中间件的存在,总会有数据库,其他的如消息队列,缓存,大数据组件。即使是基于公有云构筑的系统,公有云厂商只提供广泛使用的中间件,假如你的系统里面有很多组件没那么泛用,那么就只能自己维护,如ZooKeeper、Etcd、Pulsar、Prometheus、Lvs等 什么是中间件adapter 中间件adapter指的是和中间件运行在一起(同一个物理机或同一个容器),使得中间件和商用系统中已有的组件进行对接,最终使得该中间件达到在该系统商用的标准。像Prometheus的众多exporter,就是将中间件和已有的监控系统(Prometheus)进行对接的adpater。 为什么不修改中间件源码直接集成 原因可以有很多,这里我列出几点 源码修改容易,维护困难 很多时候不是社区通用需求,无法合并到社区主干。后续每次中间件版本升级,源码的修改就要重新进行一次。社区大版本代码重构,有的甚至不知道如何修改下去。并且对研发人员的技能要求高。 源码与团队...
- 下一篇
通义千问 Qwen-72B-Chat 大模型在PAI平台的微调实践
通义千问-72B(Qwen-72B)是阿里云研发的通义千问大模型系列的720亿参数规模的大语言模型,在2023年11月正式开源。Qwen-72B的预训练数据类型多样、覆盖广泛,包括大量网络文本、专业书籍、代码等。Qwen-72B-Chat是在Qwen-72B的基础上,使用对齐机制打造的基于大语言模型的AI助手。 阿里云人工智能平台PAI是面向开发者和企业的机器学习/深度学习平台,提供包含数据标注、模型构建、模型训练、模型部署、推理优化在内的AI开发全链路服务。 本文将以Qwen-72B-Chat为例,介绍如何在PAI平台的快速开始PAI-QuickStart和交互式建模工具PAI-DSW中高效微调千问大模型。 使用PAI-DSW快速体验和轻量化微调Qwen-72B-Chat PAI-DSW是云端机器学习开发IDE,为用户提供交互式编程环境,同时提供了丰富的计算资源。Qwen-72B-Chat的教程可以在智码实验室(https://gallery.pai-ml.com/)Notebook Gallery中检索到,参见下图: 上述Notebook可以使用阿里云PAI-DSW的实例打开,并且...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Red5直播服务器,属于Java语言的直播服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7