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 сесс, ач холбогдолтой байхаар хангалттай урт нэг дамжуулалт, сул зогсолтын түвшинд буцаж буй дескрипторын тоо.

Холбоотой нийтлэлүүд