FreeBind және After=: systemd сокетін VPN мекенжайына байлау
FreeBind systemd-ге VPN мекенжайы пайда болмай тұрып тыңдаушыны иеленуге мүмкіндік береді; After= тек жұмыстарды реттейді. Екеуін салыстырып, содан кейін реттілік пен дайындықты тексеріңіз.
Жүктелу кезінде тіркелген VPN мекенжайын байланыстыратын сокет бірлігі туннель оны тағайындамай тұрып сәтсіз аяқталуы мүмкін, ал оның артындағы қызмет ешқашан іске қосылмайды. Екі ажыратқыш түзету сияқты көрінеді және сол мәселенің әртүрлі жартысын шешеді. FreeBind systemd-ге мекенжай әлі жоқ кезде тыңдаушыны жасауға мүмкіндік береді. After= тек жұмыстарды реттейді, сондықтан нәрселердің қашан басталатынын өзгертеді, бірақ мекенжайды ертерек жеткізбейді.
Екі түрлі мәселе, екі түрлі ажыратқыш
Бірінші мәселе — байланыстыру ақауы: ядро хост иеленбейтін мекенжайда тыңдаудан бас тартады, сондықтан сокет бірлігі бірден сәтсіз аяқталады және қызмет ешқашан белсендірілмейді. Екінші мәселе — дайындық ақауы: мекенжай ақыр соңында бар, бірақ бірдеңе оны туннель трафик тасымалдамай тұрып пайдалануға тырысады. FreeBind біріншісін шешеді және екіншісі үшін ештеңе істемейді. Реттілік директивалары екеуіне де тікелей қатыспайды, өйткені олар тек ненің қандай ретпен басталатынын анықтайды. Сізде шын мәнінде бар ақауды атау — бүкіл шешім.
Қайсысы бар екенін қызмет сипаттамасынан емес, журналдан растаңыз. Байланыстыру ақауы мекенжайды атайды және оны тағайындау мүмкін еместігін хабарлайды. Дайындық ақауы әдетте кейінірек көрінеді, уақыттың бітуі немесе қарсы жақтан көрінген қабылданбаған байланыс ретінде, ал журналдарда мүлдем сау сокет бірлігі болады.
FreeBind: тыңдаушы мекенжайдан бұрын бар
FreeBind ядроға жергілікті емес мекенжайға байланыстыруға рұқсат беруді айтады, осылайша systemd жүктелу кезінде тыңдайтын сокетті жасай алады және қолданба іске қосылған сайын оны қолданбаға бере алады. Бұл сокеттік белсендірудің мәні және сокеттің өзінің артындағы қызметтен ұзақ өмір сүруінің себебі.
[Socket]
ListenStream=
ListenStream=10.8.0.1:8443
FreeBind=yes
Бос тағайындау жаңа жазба қосылмай тұрып жеткізуші бірлігінен мұраланған тыңдау жазбаларын тазалайды, бұл қалған wildcard тыңдаушының әрбір интерфейсте жауап беруіне жол бермейді. Мекенжай мен портты өзіңіздікімен ауыстырыңыз және тек drop-in файлын емес, тиімді бірлікті тексеріңіз. Пакет файлын орнында өңдеудің орнына бірлік атымен drop-in пайдаланыңыз, өйткені келесі пакет жаңартуы өңдеуді қайта жазады және ниеттен ешбір із қалдырмайды. Содан кейін оны сокет бірлігі күтетін қайта жүктеу және қайта іске қосу процедурасымен қолданыңыз.
systemd сокетінің анықтамасы осы опцияның артындағы IPv4 және IPv6 мінез-құлқын құжаттайды, ал маңызды бөлшек — ол байланыстыруға қатысты, маршруттауға емес. Онда ештеңе мекенжай тағайындамайды және VPN іске қоспайды. FreeBind тыңдаушыға берілген рұқсат, интерфейстің орнын басушы емес.
After= және Wants=: реттілік дайындық емес
Реттілік пен талап бөлек осьтер, оларды шатастыру дұрыс ретпен басталып, бәрібір сәтсіз аяқталатын бірліктер тудырады. After=vpn-client.service тек екі жұмыс та басталса, бұл екіншісінің басталуын күтетінін білдіреді. Ол VPN-ді тартпайды және VPN қосылуды аяқтауын күтпейді.
Wants= және Requires= сияқты талап директивалары белсендірумен айналысады және тәуелділік сәтсіз болғанда не болатынымен ерекшеленеді: біреуі жалғастырады, екіншісі тоқтайды. Ешқайсысы қосылған туннельдің не екенін білмейді. VPN процесі мекенжай тағайындалмай-ақ белсенді болуы мүмкін, немесе мекенжай тағайындалып, серіктеске маршрут болмауы мүмкін, екі күй де тәуелділікті қанағаттандырады. Егер қолданбаға мекенжайдың болуы қажет болса, процестің басталуын дайындық дәлелі деп санаудың орнына сол шартты анық модельдеңіз.
systemctl cat және systemctl show -p After -p Wants -p Requires арқылы бірліктің шын мәнінде нені жариялайтынын тексеріңіз. Үш түрлі каталогтағы drop-in ешқашан жазбаған директиваларыңызды қосуы мүмкін, ал systemd тек тиімді бірлікті оқиды.
network-online.target нені істемейді
network-online.target кейін реттелген бірлік желі менеджері желіні пайдалануға жарамды деп жариялауын күтеді, бұл жүктелу кезіндегі синхрондау нүктесі, үздіксіз шарт емес. Ол нақты туннельдің көтерілгенін білдірмейді және VPN түстен кейін қайта қосылғанда қайта іске қосылмайды. Оны қайта қосылу мониторы деп қарау — сол мақсаттың ең кең тараған қате оқылуы.
systemd жобасы бұл айырмашылықты тікелей құжаттайды, ал практикалық салдар — туннель мекенжайы қажет нәрсенің бәрі тәуелділікті өзі иеленуі керек. network-online-ды күтіп, содан кейін туннель мекенжайын байланыстыратын бірлік туннель кездейсоқ бірінші көтерілгенде ғана дұрыс, ал бұл кездейсоқтық, дизайн емес.
Шын мәнінде таңдаған өмірлік циклді тексеріңіз
Таза жүктелуді, мекенжай пайда болғаннан кейінгі сұрауды және VPN құлап, қайта оралғаннан кейінгі мінез-құлықты тексеріңіз. Осы үш жағдай жұмыс істейтін тыңдаушыны жұмыс істейтін қызметтен ажыратады.
systemd-analyze verify myapp.socket
systemctl cat myapp.socket
ss -ltn "sport = :8443"
Бірінші команда қайта жүктеу алдында бірлік файлының қателерін ұстайды, екіншісі біріктірілген бірлікті көрсетеді, үшіншісі тыңдаушының барын және қай мекенжайда екенін дәлелдейді. Туннель мекенжайын күткен жерде wildcard мекенжайындағы тыңдаушы — бос ListenStream жоюға тиіс дәл сол қалдық. Мекенжайдың жылжығанын көру үшін VPN қайта қосылғаннан кейін үшінші команданы қайталаңыз.
Өмірлік циклді әдейі таңдаңыз: не тұрақты мекенжайдың қайта оралуын күтетін еркін байланған тыңдаушы, не туннельмен бірге тоқтап, қалпына келгенде қайта басталатын қызмет. Бұлар түрлі дизайндар және әртүрлі жолмен сәтсіз аяқталады. Содан кейін қатынау саясатын көздеген дереккөздер мен жолдарға байланыстыра ұстаңыз, өйткені тағайындалған мекенжайды байланыстыру қабылданған пакеттердің сенімді интерфейстен келгенін талап етпейді.