动态配置

1.功能描述

能够通过api接口查询全量的range 配置规则

能够通过api增加或者删除一条range配置规则

根据type、src_ports、dst_port三个字段来确定一条规则

2.依赖模块

njet.onf :

load_module modules/njt_range_module.so;           #range 模块
load_module modules/njt_http_dyn_range_module.so;  #range 动态修改模块,依赖于上面的range模块

njet_ctrl.conf:

load_module modules/njt_http_range_api_module.so; 

3.配置样例

njet_ctrl控制面配置:

 ...
 load_module modules/njt_http_range_api_module.so;   #load range api module
 
 ...
    server {
        listen       8081;
        
         location /api {
        dyn_module_api;
         }

       location /doc {
        doc_api;
        }
    }
...

njet.conf 配置

load_module modules/njt_range_module.so;           #range 模块
load_module modules/njt_http_dyn_range_module.so;  #range 动态修改模块,依赖于上面的range模块

user nobody;

events {
    worker_connections  1024;
}
error_log         logs/error_privilege.log info;


#默认路径为/usr/sbin/iptables, 如果系统路径不一致需要调用该指令设置下路径
range iptables_path=/usr/sbin/iptables;

#range 静态配置
range type=tcp src_ports=11000:12000 dst_port=10001;
range type=tcp src_ports=10000 dst_port=14000;

http {
    access_log        logs/access_privilege.log combined;


    include           mime.types;

    server {
       。。。

   }

}


cluster_name helper;
node_name node1;

4. API

4.1 API列表

查询接口:

GET  http://IP+port/api/v1/range

修改接口:

PUT   http://IP+port/api/v1/range
#添加一条规则
{
    "action": "add",
    "type": "tcp",
    "src_ports": "11000:13000",
    "dst_port": 10001
}

#删除一条规则
{
    "action": "del",
    "type": "tcp",
    "src_ports": "11000:13000",
    "dst_port": 10001
}
参数 类型 必填 默认值 说明
action string - [add|del]
type string - [tcp|udp], 指明是tcp还是udp数据
src_ports string - 支持单端口或者端口范围,格式如下:端口范围(冒号分隔): 11000:12000一个端口: 11000
dst_port int - 目标端口

错误码

code msg 描述
0 success 成功
2 - 内存分配失败相关的一些错误信息
4 rule is not found 删除一个不存在的规则
4 rule has exist 添加一个已经存在的规则
4 其他错误

4.2 调用样例

查询:

GET http://192.168.40.136:8081/api/v1/range

返回:

{
  "ranges": [
    {
      "type": "tcp",
      "src_ports": "11000:12000",
      "dst_port": 10001
    },
    {
      "type": "tcp",
      "src_ports": "10000",
      "dst_port": 14000
    }
  ]
}

PUT http://192.168.40.136:8081/api/v1/range

#添加一条规则
{
    "action": "add",
    "type": "tcp",
    "src_ports": "11000:13000",
    "dst_port": 10001
}

#删除一条规则
{
    "action": "del",
    "type": "tcp",
    "src_ports": "11000:13000",
    "dst_port": 10001
}

返回:

{
    "code": 0,         #0 表示成功,   非0 表示失败
    "msg": "success"
}

4.3 swagger访问

可以通过doc模块提供的swagger界面操作

http://192.168.40.136:8081/doc/swagger/

通过swagger页面进行API测试

初始状态get 查询配置

curl -X 'GET' \
  'http://192.168.40.158:8088/api/v1/range'  |jq

查询iptables

img img

通过swagger页面添加一个规则

curl -X 'PUT' \
  'http://192.168.40.158:8088/api/v1/range' \
  -H 'accept: */*' \
  -H 'Content-Type: application/json' \
  -d '{
  "action": "add",
  "type": "tcp",
  "src_ports": "15200",
  "dst_port": "16000"
}'

再次查询配置和iptables

curl -X 'GET' \
  'http://192.168.40.158:8088/api/v1/range'  |jq

img img

reload后再次查询,动态添加的配置和iptables都存在刚才动态添加的配置

img img

Stop OpenNJet后,iptables规则消失

img img

4.4 range 配置支持集群

在同一个机器上开启3个njet 实例,njet.conf :

3个njet 实例,cluster_name分别为cluster_name helper1 ; cluster_name helper2 ; cluster_name helper3

配置示例如下:

helper broker modules/njt_helper_broker_module.so conf/mqtt.conf;
helper ctrl modules/njt_helper_ctrl_module.so conf/ctrl.conf;
load_module modules/njt_http_split_clients_2_module.so;
load_module modules/njt_agent_dynlog_module.so;
load_module modules/njt_http_location_module.so;
load_module modules/njt_http_dyn_bwlist_module.so;
load_module modules/njt_range_module.so;
load_module modules/njt_http_dyn_range_module.so;

load_module modules/njt_dyn_ssl_module.so;
load_module modules/njt_http_vtsc_module.so;

cluster_name helper;
node_name node1;

worker_processes auto;
#user root;

error_log logs/error.log info;
pid logs/njet.pid;

events {
        worker_connections 1024;
  use epoll;
}

range type=udp family=ipv6  src_ports=1002 dst_port=20002;
range iptables_path=/usr/sbin/iptables;
range ip_path=/usr/sbin/ip;
http {
        dyn_kv_conf conf/iot-work.conf;
        include mime.types;
        include conf.d/*.conf;
        upstream backend1{
            zone upstream_backend1 64k;
            server  192.168.40.158:9101;

    }

        server {
        listen       9100;
        server_name  localhost;

        location / {
           proxy_pass http://backend1;

        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

}
stream {
    server {
        listen 20001 udp  mesh;
        proxy_pass 192.168.40.158:8888;
        proxy_timeout 30s;
    }
}

生成的iptables 规则3个实例如图所示:

img img