NGINX entwickelt sich zu Cloud Native weiter, alles in OpenNJet
Range- Port-Weiterleitungsmodul
1.1 Anforderungen
In vielen Fällen müssen Funktionen wie Traffic Hijacking und FTP-Proxy im passiven Modus die Weiterleitung des Traffic-Ports unterstützen. Beispielsweise ist es erforderlich, den gesamten Datenverkehr im Portbereich von 10000 bis 11000 an Port 12000 zu übertragen und dann alle Pakete auf Port 12000 zur weiteren Verarbeitung zu empfangen.
1.2 Abhängigkeiten
Die Implementierung dieser Funktion hängt von iptables ab. Bei der Installation über das RPM-Paket wird der Berechtigungsprozess automatisch als Root gestartet.
Wenn es von einem normalen Benutzer gestartet wird, müssen setuid-Berechtigungen für opennjet festgelegt werden.
setcap cap_setuid=eip /home/njet/sbin/njet
1.3 Anleitungsdesign
Syntax |
Bereichstyp={tcp|udp} src_ports={port1:port2} dst_port={dst_port} ;
Wenn der Standard- iptables-Pfad /usr/sbin/iptables ist und der System- iptables- Pfad nicht dieser ist, müssen Sie den folgenden Befehl angeben und verwenden Bereich iptables_path={iptables_path}; |
Standard |
- |
Kontext |
Core, unterstützt mehrere Konfigurationen |
Parameterbeschreibung:
Parameter |
Typ |
Erforderlich |
Standardwert |
veranschaulichen |
Typ |
Zeichenfolge |
NEIN |
TCP |
[tcp|udp] gibt an, ob es sich um TCP- oder UDP- Daten handelt. Der Standardwert ist TCP |
src_ports |
Zeichenfolge |
Ja |
-
|
Unterstützt einen einzelnen Port oder einen Portbereich . Das Format lautet wie folgt: Portbereich (durch Doppelpunkt getrennt): 11000:12000 Ein Port : 11000 |
dst_port |
int |
Ja |
- |
Zielport |
iptables_path
|
Zeichenfolge |
NEIN
|
/usr/sbin/iptables
|
Dies hängt vom System ab. Beim Aufrufen des Systems zur Ausführung kann der Fehler „iptables nicht gefunden“ auftreten. Zu diesem Zeitpunkt müssen Sie den iptables-Pfad des entsprechenden Systems überprüfen und dann diesen Parameter festlegen.
Wenn mehrere Bereichsanweisungen konfiguriert sind, hat der zuletzt explizit angegebene iptables_path Vorrang. |
Konfigurationsbeispiel (TCP als Beispiel):
- Leiten Sie an den lokalen Portbereich 11000 bis 12000 gesendete Daten an Port 13000 weiter:
Bereichstyp=TCP src_ports=11000:12000 dst_port=13000
- Der an den lokalen Computer gesendete Port ist 11000 und wird an Port 13000 weitergeleitet:
Bereichstyp=TCP src_ports=11000 dst_port=13000
- Legen Sie den iptables-Pfad auf /usr/sbin/iptables fest
Bereich iptables_path=/usr/sbin/iptables;
1.4 Umsetzungsplan
Diese Funktion wird mit Hilfe von iptables-Regeln implementiert, die Parameter über den Range-Befehl analysieren und dann entsprechende iptables-Regeln für die Verteilung generieren.
Der Range-Befehl unterstützt die Konfiguration mehrerer Regeln
Wenn das Modul init ist, werden iptables-Regeln basierend auf den Regeln generiert.
Die Regeln werden gelöscht, wenn das Modul beendet wird.
Alle Regeln werden in der benutzerdefinierten iptables-Kette OPENNJET platziert
1.5 Test
1.5.1 Konfigurationsbeispiel
Konfigurieren Sie zwei Bereichsanweisungen in der njet.conf- Konfiguration
... Load_module module/njt_range_module.so; #Bereichsmodul laden |
1.5.2 Testergebnisse
Bevor Sie OpenNJet starten
Iptables-Regeln des Abfragesystems:
Nach dem Start von OpenNJet
Fragen Sie die iptables-Regeln erneut ab und stellen Sie fest, dass zwei Regeln gelten.
Nach dem Neuladen wird neu gestartet
Führen Sie eine erneute Abfrage durch und stellen Sie fest, dass noch zwei Regeln vorhanden sind
Nach dem Stoppen von OpenNJet
Fragen Sie erneut ab und löschen Sie zwei Regeln.
2. Imperative API zur dynamischen Konfiguration von Portweiterleitungsregeln
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规则消失
B站崩了两次、腾讯“3.29”一级事故……盘点 2023 十大宕机事故“冥场面” Vue 3.4 “灌篮高手”发布 MySQL 5.7、魔趣、李跳跳……盘点 2023“停更”的(开源)项目和网站 回顾 30 年前的 IDE:只有 TUI、背景颜色亮瞎眼…… Vim 9.1 发布,谨献给 Bram Moolenaar Redis 之父“锐评” LLM 编程:全知全能 && Stupid “后开源”时代已来:许可证失效、无法为普罗大众服务 联通宽带突然限制上传速度,遭大量用户投诉 Windows 主管承诺改进:让开始菜单再次伟大 Pascal 之父 Niklaus Wirth 逝世OpenNJet 最早是基于 NGINX1.19 基础 fork 并独立演进,具有高性能、稳定、易扩展的特点,同时也解决了 NGINX 长期存在的难于动态配置、管理功能影响业务等问题。 邮件组 官网