VPN релесі SSH қабылдауды тоқтатады: файл дескрипторларының шектеулері
Туннель трафигі жалғасады, бірақ оның артындағы socat релесі жаңа сеанстардан бас тартады. Жолды қадағалаңыз, содан кейін тірі PID-дегі мұраланған шектеуді оқыңыз.
WireGuard қол алысуы әлі де аяқталады, peer әлі де жақындағы endpoint көрсетеді, бірақ оның артындағы реле арқылы жаңа SSH сеансы баннерсіз ілініп қалады. Бұл үйлесім туннельден алыс, socket қабылдайтын процеске бағыттайды. socat тәрізді реле өз дескриптор бюджетімен, өз балаларымен және өз мұраланған шектеулерімен қолданба жолында отырады. Төмендегі жүріс клиенттен басталып, тағы бір socket аша алмайтын бірінші компонентте тоқтайды.
Санды өзгертуден бұрын жолды қадағалаңыз
Бүкіл туннель туралы ойлаудың орнына бір сәтсіз сұранысты қадағалаңыз. Клиент туннельге жазады, VPN демоны шифрды ашады және маршруттайды, ал реле қарсы жақта қабылдайды. Әрбір қадам дескрипторларды жұмсайды, және әдетте таусылатыны — соңғысы.
Қайталай алатын сұраныстан бастап, оның уақытын өлшеңіз. Егер TCP қол алысуы аяқталып, бірақ қолданба баннері келмесе, реле socket-ті алып, содан кейін балада немесе өзінің жоғарғы аяғында тұрып қалды. Егер қол алысудың өзі ешқашан аяқталмаса, себебі — маршруттау, firewall немесе тыңдаушы күйі, дескриптор шегі емес. Екі пішіннің қайсысын байқағаныңызды жазып алыңыз, өйткені олар әртүрлі процестерді көрсетеді.
Жұмысты қайталайтын секірістерді де санаңыз. Тармақталған тыңдаушы әр қабылданған socket-ті өз көшірмесін сақтайтын балаға береді, сондықтан нақты жиынтық бүкіл ағаштың қасиеті, тек ата-ананың емес.
Реленің мұраланған шектеуін оқыңыз
Маңызды жалғыз шектеу жұмыс істеп тұрған процеске тиесілі және оны сол процесті іске қосқан нәрсе белгілеген. Shell ішінде ulimit -n теру shell-ді сипаттайды. Қызмет менеджерінен қандай шектеу қолданғанын сұрап, содан кейін PID-де растаңыз.
systemctl show -p MainPID -p LimitNOFILE vpn-relay.service
cat /proc/$(systemctl show -p MainPID --value vpn-relay.service)/limits
limits файлы жұмсақ және қатты шектерді процесс көргендей басып шығарады. Жомарт қатты мәннің астындағы төмен жұмсақ мән демонның өз шегін көтеруге рұқсаты бар екенін білдіреді, ал кейбіреулері мұны іске қосылу кезінде жасайды; тең төмен мәндер unit файлы көз екенін білдіреді.
Drop-in файлдары лексикалық тәртіппен жүктеледі және кейінгі файлдар жеңеді, сондықтан systemctl cat vpn-relay.service қолданылатынның беделді көрінісі. Менеджер ешқашан оқымайтын файлды өңдеу — көтерілген санның әсері болмауының ең жиі себебі.
Тұрақты параллельдікті сақталған күйден бөліңіз
Екі процесс өзара байланыссыз себептермен бір шекке жетуі мүмкін, ал емдеу жолдары әртүрлі. Пайдалы бір мезгілдегі сеанстарды қадағалайтын сұраныс — сыйымдылық мәселесі. Жұмыс біткеннен кейін жалғасатын өсу — ағу немесе ешкім жаппаған сеанстар жиынтығы.
Бос күйде, әдеттегі шыңыңызда және жүктеме тоқтағаннан кейін бірнеше минут өткен соң қайта өлшеңіз. Ашық жазбаларды ls /proc/PID/fd | wc -l арқылы жұмсақ шекке қарсы санау сізге алшақтықты айтады, ал шектен бір-екі төмен сан — баяу жол емес, қатты тоқтау.
Сан төмендеуге қарсы болса, жиынтыққа емес, socket күйлеріне қараңыз. CLOSE_WAIT күйінде отырған дескрипторлар peer жапқанын, ал сіздің жағыңыз ешқашан жабпағанын білдіреді, бұл қолданбаның өмірлік циклінің ақауы және оны үлкенірек шектеу тек кейінге қалдырады. Балалар моделін де шектеңіз: бір мезгілдегі балаларға шектеуі жоқ тармақталған реле дескрипторларды, процесс ұяларын және жадыны бірге тауысады.
Жаңа мәнді тірі процесте тексеріңіз
Unit файлын өңдегеннен кейін менеджерді қайта жүктеп, қызметті қайта іске қосыңыз, өйткені жай қайта жүктеу жұмыс істеп тұрған процесс мұраланған шектеулерді ешқашан алмастырмайды. Трафикті нақты қамтамасыз ететін процесте тексеріңіз.
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
awk жолы жаңа жұпты қайтарады; егер ол әлі ескіні көрсетсе, сіз өңдеген drop-in жүктелмейді. ss саны — сіздің жүктеме тексерісі, сондықтан күткен сеанс санын ашып, оның өсуін бақылаңыз. Сол сеанстар жабылғаннан кейін де өсе беретін сан шектеудің ешқашан бүкіл мәселе болмағанын білдіреді.
Кез келген үлкен ұлғаюмен бір ескерту жүреді. select() арқылы сұрайтын қолданбалар FD_SETSIZE-ден жоғары дескрипторларды бақылай алмайды, бұл әдеттегі құрастыруларда 1024, сондықтан одан жоғары көтерілген шек байланыссыз көрінетін қателер тудыруы мүмкін. systemd орындау анықтамасы өзі іске қосатын қызметтер үшін сол ескертуді ұстанады.
Қайта іске қосуды туннель қолжетімділігінен алыс ұстаңыз
Релені қайта іске қосу оның белсенді сеанстарын тастайды, және бұл VPN-нің төмендеуінен бөлек оқиға. Өзгерісті реле цикл жасағанда туннель жоғары тұратындай реттеңіз және ұзақ сеансы оны кесіп өтетін әркімді ескертіңіз.
Қайтару — алдыңғы unit файл плюс тағы бір қайта іске қосу, және бұл файл жаңа мән бір жұмыс күнін өткізгенше орнында қалады. Содан кейін циклді бастапқыда сәтсіз болған сұраныспен жабыңыз: реле арқылы бір жаңа SSH сеансы, маңызды болуға жеткілікті ұзақ бір тасымал және бос деңгейіне қайтатын дескриптор саны.