动态配置
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
通过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
reload后再次查询,动态添加的配置和iptables都存在刚才动态添加的配置
Stop OpenNJet后,iptables规则消失
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个实例如图所示: