VPN-Relais hält op SSH unzehuelen: Limite vun Dateideskriptoren
Den Tunneltrafic fléisst weider, wärend de socat-Relais dohannert nei Sessiounen ofleet. Verfollegt de Wee, a liest dann de geierfte Limit um liewege PID.
En WireGuard-Handshake gëtt nach ëmmer fäerdeg, de Peer weist nach ëmmer en aktuelle Endpunkt, an trotzdem hänkt eng nei SSH-Sessioun duerch de Relais dohannert ouni Banner. Dës Kombinatioun weist ewech vum Tunnel a Richtung de Prozess, deen de Socket unhëlt. En Relais wéi socat sëtzt am Wee vun der Applikatioun mat sengem eegene Deskriptorbudget, sengen eegene Kanner a sengen eegene geierfte Limiten. De Wee hei drënner fänkt beim Client un a stoppt bei der éischter Komponent, déi keen anere Socket méi opmaache kann.
Verfollegt de Wee, ier dir eng Zuel ännert
Verfollegt eng eenzeg feelgeschloen Ufro amplaz iwwer den Tunnel als Ganzt ze raisonnéieren. De Client schreift an den Tunnel, den VPN-Daemon entschlësselt a routet, an de Relais hëlt op der anerer Säit un. All Schrëtt verbraucht Deskriptoren, an deen, deen normalerweis ausget, ass de leschten.
Fänkt mat enger Ufro un, déi dir reproduzéiere kënnt, a moosst hir Zäit. Wann den TCP-Handshake fäerdeg gëtt, awer kee Banner vun der Applikatioun kënnt, huet de Relais de Socket geholl an ass duerno an engem Kand oder op sengem Upstream-Been hänke bliwwen. Wann den Handshake selwer ni fäerdeg gëtt, ass d’Ursaach Routing, Firewall oder Listener-Zoustand, net eng Deskriptor-Uewergrenz. Notéiert, wéi eng vun den zwou Formen dir gesinn hutt, well si weisen op verschidde Prozesser.
Zielt och d’Spréng, déi Aarbecht duplizéieren. En forking Listener gëtt all ugehollene Socket un e Kand, dat seng eege Kopie behält, sou datt den tatsächlechen Total eng Eegeschaft vum ganze Bam ass, net nëmme vum Elterendeel.
Liest de Limit, deen de Relais geierft huet
Den eenzegen Limit, deen zielt, gehéiert zum lafende Prozess, an hie gouf vun deem festgeluecht, wat de Prozess gestart huet. ulimit -n an enger Shell ze tippe beschreift d’Shell. Freet de Servicemanager, wat hien ugewannt huet, a bestätegt et dann um PID.
systemctl show -p MainPID -p LimitNOFILE vpn-relay.service
cat /proc/$(systemctl show -p MainPID --value vpn-relay.service)/limits
D’Datei limits dréckt de mëllen an den haarde Plaffong aus, wéi de Prozess se gesäit. En nidderege mëlle Wäert ënner engem generéisen haarde Wäert bedeit, datt den Daemon säin eegene Plaffong däerf hiewen, an e puer maachen dat beim Start; gläich niddereg Wäerter bedeiten, datt d’Unit-Datei d’Quell ass.
Drop-ins luede sech an lexikalescher Reihenfolge, an déi méi spéit Dateie gewannen, also ass systemctl cat vpn-relay.service déi autoritativ Vue dovun, wat gëllt. Eng Datei ze änneren, déi de Manager ni liest, ass dee heefegste Grond, firwat eng erhéicht Zuel keng Wierkung huet.
Trennt bestänneg Konkurrenz vum behalenen Zoustand
Zwee Prozesser kënnen aus onverbonnene Grënn deeselwechte Plaffong erreechen, an d’Remedien ënnerscheede sech. Nofro, déi nëtzlech gläichzäiteg Sessiounen suivéiert, ass eng Kapazitéitsfro. Wuesstem, deen no dem Enn vun der Aarbecht weidergeet, ass e Lach oder eng Rei Sessiounen, déi keen zougemaach huet.
Moosst am Rou, bei Ärem normale Spëtz a nach eng Kéier e puer Minutten nodeems d’Laascht gestoppt huet. Oppe Rubriken mat ls /proc/PID/fd | wc -l géint de mëllen Limit ze zielen seet Iech de Spalt, an eng Zuel een oder zwee ënner dem Plaffong ass en haarden Arrêt, keen luesen Wee.
Wann d’Zuel sech weigert ze falen, kuckt op Socket-Zoustänn amplaz op Totalen. Deskriptoren, déi an CLOSE_WAIT sëtzen, bedeiten, datt de Peer zougemaach huet an Är Säit ni, wat e Feeler am Liewenszyklus vun der Applikatioun ass, deen e méi grousse Limit just verspéit. Begrenzt och d’Kandmodell: e forking Relais ouni Kappgrenz fir gläichzäiteg Kanner erschëpft Deskriptoren, Prozessslots a Gediechtnes zesummen.
Kuckt den neie Wäert um liewege Prozess no
Nodeems dir d’Unit geännert hutt, lued de Manager nei a start de Service nei, well en Nei-Lueden eleng ni d’Limiten ersetzt, déi e lafende Prozess schonn geierft huet. Iwwerpréift et um Prozess, deen tatsächlech Trafic servéiert.
systemctl daemon-reload
systemctl restart vpn-relay.service
awk '/Max open files/ {print}' /proc/$(systemctl show -p MainPID --value vpn-relay.service)/limits
ss -tnp state established '( sport = :2222 )' | wc -l
D’Linn awk gëtt dat neit Paar zréck; wann et nach ëmmer dat aalt weist, ass den Drop-in, deen dir geännert hutt, net deen, deen geluede gëtt. D’Zuel vun ss ass Är Laaschtkontroll, also maacht déi Zuel Sessiounen op, déi dir erwaart, a kuckt wéi se klëmmt. Eng Zuel, déi no dem Zoumaache vun dëse Sessiounen nach ëmmer klëmmt, bedeit, datt de Limit ni dat ganzt Problem war.
Eng Viraussetzung gehéiert zu all grousser Erhéijung. Applikatiounen, déi mat select() polléieren, kënnen keng Deskriptoren iwwer FD_SETSIZE iwwerwaachen, wat 1024 op typesche Builds ass, also kann en Plaffong, deen driwwer erhéicht gëtt, Feeler produzéieren, déi onverbonn ausgesinn. D’Systemd-Ausféierungsreferenz dréit déiselwecht Warnung fir d’Servicer, déi et start.
Halt den Neistart vun der Tunnelsverfügbarkeet ewech
De Relais nei starten verwërft seng aktiv Sessiounen, an dat ass en eegene Evenement vum Ausfall vum VPN. Ordent d’Ännerung sou, datt den Tunnel uewen bleift, wärend de Relais zirkuléiert, a warnt jiddereen, deem seng laang Sessioun se duerchkräizt.
De Réckzuch ass déi viregt Unit-Datei plus nach en Neistart, an déi Datei bleift op hirem Plaz, bis den neie Wäert en Aarbechtsdag iwwerlieft huet. Duerno maacht d’Schleef mam Ufro zou, déi ursprénglech feelgeschloen ass: eng nei SSH-Sessioun duerch de Relais, en Transfer laang genuch fir ze zielen, an eng Deskriptorzuel, déi op hiren Idle-Niveau zréckkënnt.