Puncte:0

Actualizări rulante ale backend-ului cu socket-uri de server udp

drapel fr

Am un sistem backend folosit pentru dispozitivele IOT care folosesc protocolul UDP pentru comunicații. Și există anumite API-uri bazate pe TCP (HTTP2) pentru aplicații mobile din același backend.

Încerc să creez o caracteristică de actualizare continuă pentru a activa 0 corecție pentru timpul de nefuncționare a serviciilor de backend.

Configurația mea este așa.

În loc să expun direct socket-urile la aplicații, încerc să fac un proxy transparent proceselor mele. Am expus 2 prize (1 udp și 1 tcp) la internetul public folosind firewall.

Serverul meu de producție deschide un set diferit de porturi pentru udp și tcp (care pot fi modificate prin variabilele de mediu fără a schimba binarul de bază).

Pasul 1:

introduceți descrierea imaginii aici

Încerc să creez un proxy transparent în aceeași mașină de la portul udp 16002 la 17002. Pentru udp, serverul meu va iniția și o anumită comunicare cu dispozitivele din sălbăticie. Serverul ar trebui să vadă IP-ul/portul sursă și să comunice înapoi cu aceste dispozitive care ar putea fi sub anumite NAT (de obicei, router WiFi) prin respectarea aceleiași politici de origine a NAT-urilor.

Și același lucru pentru tcp. De la portul 16012 la portul 17012. Aceasta este implementarea tipică prin externalizarea porturilor reale.

Nu pot face asta să funcționeze.

Pasul 2:

Ori de câte ori există cod nou care trebuie corectat, vreau să afișez noul cod pe două seturi diferite de porturi, așa cum se arată în imaginea de mai jos (P2 - Procesul 2).

Când procesul 2 este activ și rulează, voi schimba maparea adresei IP la noul Proces (P2). După ce acordăm un anumit timp pentru ca P1 să termine orice operațiuni IO în așteptare, vom opri Procesul P1.

Pentru următorul patch, vom afișa P1' și inversele procesului.

introduceți descrierea imaginii aici

Există vreun defect în acest design? Acest lucru poate fi realizat din punct de vedere tehnic folosind iptables și tproxy sau orice alte instrumente Linux?

M-am gândit să construiesc un router L7 și să transmit pachetele înainte și înapoi prin definirea obiectelor de nivel înalt. Dar sunt curios dacă acest lucru se poate face folosind rutarea de nivel scăzut L3/L4, deoarece poate fi mai eficient și testat în luptă. Cu siguranță, aceste instrumente nft, iptables au probleme de utilizare și nu sunt foarte intuitive, în special nft, pentru un dezvoltator.

Puncte:1
drapel br

Puteți face acest lucru cu iptables. Pentru a crea un port forwarding de la 17X la 16X:

iptables -A PREROUTING -t nat -p tcp -m tcp --dport 16012 -j DNAT --to-destination :17012
iptables -A PREROUTING -t nat -p udp -m udp --dport 16002 -j DNAT --to-destination :17002

Apoi, când doriți să comutați spre ce port indică după ce ați pornit versiunea actualizată a aplicației dvs.:

iptables -D PREROUTING -t nat -p tcp -m tcp --dport 16012 -j DNAT --to-destination :17012
iptables -D PREROUTING -t nat -p udp -m udp --dport 16002 -j DNAT --to-destination :17002
iptables -A PREROUTING -t nat -p tcp -m tcp --dport 16012 -j DNAT --to-destination :18012
iptables -A PREROUTING -t nat -p udp -m udp --dport 16002 -j DNAT --to-destination :18002

Dacă sunteți într-o distribuție folosind un iptables.service și doriți ca aceste modificări să fie permanente, puteți adăuga liniile -A la /etc/sysconfig/iptables sau oriunde se află fișierul dvs. de configurare. Dacă utilizați o distribuție care utilizează a firewalld.service atunci puteți atinge același obiectiv și îl puteți face permanent în timpul repornirilor astfel:

Această primă linie este necesară o singură dată pentru a activa masquerading în general

firewall-cmd --permanent --add-masquerade

Apoi, pentru a crea redirecționările inițiale:

firewall-cmd --permanent --add-forward-port=port=16002:proto=udp:toport=17002
firewall-cmd --permanent --add-forward-port=port=16012:proto=tcp:toport=17012

Când doriți să schimbați aplicația pentru a asculta pe un alt port, rulați:

firewall-cmd --permanent --remove-forward-port=port=16002:proto=udp:toport=17002
firewall-cmd --permanent --remove-forward-port=port=16012:proto=tcp:toport=17012
firewall-cmd --permanent --add-forward-port=port=16002:proto=udp:toport=18002
firewall-cmd --permanent --add-forward-port=port=16012:proto=tcp:toport=18012
drapel fr
Multumesc Bofa pentru raspunsul clar. Voi încerca să actualizez acceptarea într-o zi sau două, deoarece sunt ocupat să lucrez la alte versiuni.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.