Yerli proqram, VPN qaydası: FORWARD zənciriniz niyə heç vaxt işə düşmür
Maşındakı proses FORWARD deyil, OUTPUT istifadə edir. Qaydayı düzgün ad sahəsindəki qarmağa bağlayın, sonra markın və ya sadə marşrutun kifayət edib-etmədiyinə qərar verin.
VPN trafiki üçün FORWARD zəncirinə qayda əlavə edirsiniz, sorğunu həmin Linux maşınından işə salırsınız və sayğac sıfırda qalır. Qayda çox güman ki düzgündür. Paket heç vaxt o yolla getməyib, çünki maşının özünün yaratdığı sorğu onun tərəfindən yönləndirilmir. Paketin soketdən naqilə qədər həyatını izləmək bunun səbəbini və qaydanın əslində hara aid olduğunu aydınlaşdırır.
Paketin harada doğulduğunu tapın
Netfilter-in qarmaq sırası üç halı ayırır və yalnız biri FORWARD-a aiddir:
| Origin | Path | Hook that sees it |
|---|---|---|
| Local process | OUTPUT then POSTROUTING | OUTPUT, POSTROUTING |
| Addressed to a local service | PREROUTING then INPUT | PREROUTING, INPUT |
| Received for another host | PREROUTING, FORWARD, POSTROUTING | FORWARD |
Yerli tətbiq OUTPUT yolunda başlayır, çünki nüvə artıq müəyyən edib ki, paket buradan yaranır və heç vaxt yönləndirmə namizədi deyil. Tunel yaratmaq bu təsnifatı dəyişmir; tunel paketin tərk edə biləcəyi bir qurğudur, yerli çıxışı tranzitə çevirən mərhələ deyil.
İki paket, bir hekayə
Tunel qalxdıqdan sonra tətbiqin daxili paketi və şifrələnmiş xarici paket fərqli obyektlərdir. Daxili paket tətbiqin seçdiyi təyinatı və yükü daşıyır. Xarici paket şifrəli mətni həmkarın ünvanına və portuna daşıyır və fiziki interfeysi faktiki keçən də elə budur.
Siyasətiniz onlardan birinə aiddir və səhv olanı seçmək qaydanın heç nə etmədiyi təəssüratı yaratmasının adi səbəbidir. Həmkarın xarici ünvanına uyğun gələn qayda içəridəki tətbiq nə edirsə etsin, hər tunel paketini eyni cür görür. Daxili təyinata uyğun gələn qayda isə sizi maraqlandıran trafiki görür və yalnız o paket qaydanı quraşdırdığınız qarmağa çatanda işə düşəcək.
Ad sahələri sərhədi yerindən tərpədir
Konteyner prinsipi dəyişmədən bunu çətinləşdirir. Tətbiqin sorğusu konteynerin şəbəkə ad sahəsi daxilində yerli çıxışdır. Host bu trafiki virtual Ethernet interfeysində qəbul edir və onu yönləndirə bilər, ona görə hostdakı FORWARD qaydası mənalı ola bilər, baxmayaraq ki sorğunu yaradan proses hostun OUTPUT zəncirinə heç vaxt toxunmayıb.
Qarmaq seçməzdən əvvəl qayda dəstinin və tunelin faktiki harada yaşadığını müəyyənləşdirin. Konteyner daxilində tunel, hostda tunel və konteynerin ondan yönləndirilməsi, ayrı ad sahəsində tunel — bunlar üç fərqli topologiya və üç fərqli qayda yerləşdirilməsidir. Qaydaları qurğuya sahib olan ad sahəsinin içində oxuyun, yalnız standart olanda deyil.
Ümumiyyətlə mark lazımdırmı, soruşun
Məqsəd bir təyinat prefiksini tuneldən keçirməkdirsə, o prefiks üçün bir marşrut kifayət edə bilər. Əvvəlcə effektiv marşrutlara baxın, serverin itələdiyi hər şey daxil olmaqla: yönləndirilmiş defolt nəzərdə tutduğunuz dar siyasətdən qat-qat çox trafiki VPN-dən keçirir və heç bir mark miqdarı nəticəni niyyətə uyğunlaşdırmayacaq.
Təsnifat o zaman lazımdır ki, qərar marşrutun ifadə edə bilmədiyi bir şeydən asılı olsun: mənbə, istifadəçi və ya proses. Qəbul edilən trafik üçün PREROUTING-də mark işləyir. Yerli trafik üçün mark çıxış mərhələsində qoyulmalıdır ki, mark qoyulandan sonra yeni marşrut axtarışı başlada bilsin. nftables-da bu, çıxış qarmağında route tipli zəncirdir; adi çıxış filtri zənciri dəyəri qoyacaq və marşrutu dəyişməz qoyacaq.
iptables-da ekvivalent mangle OUTPUT quruluşunda yaşayır və eyni tələb keçərlidir: marşrut qərarı mark mövcud olduqdan sonra yenidən nəzərdən keçirilməlidir. Sonra siyasət qaydası markı istehlak etməli və istifadə oluna bilən marşrut saxlayan cədvələ yönəlməlidir. Conntrack markı qoymaq üçüncü, ayrı əməliyyatdır; o, axına dəyər yazır və bununla həmin dəyəri marşrutlaşdırmanın oxuya biləcəyi cari paketə qoymur.
Axtarışı və sayğacı birlikdə yoxlayın
nft list ruleset
ip route get 198.51.100.25
ip route get 198.51.100.25 mark 0x1
Ünvan və mark nümunə üçündür və iki marşrut sorğusu fərqli suallara cavab verir. İkincisi, paket həmin markı daşısaydı nüvənin nə edəcəyini soruşur; bu, qayda dəstinizin mark təyin etdiyini göstərmir. Ona fərziyyə testi kimi baxın, siyasətin işlədiyinə dəlil kimi deyil.
Sonra zərərsiz bir sorğu işə salın və eyni vaxtda iki şeyi izləyin: seçdiyiniz qarmaqdakı sayğacı və paketin faktiki götürdüyü çıxışı. Sayğac tərpənirsə və paket başqa yerdən çıxırsa, mark və ya cədvəl səhvdir. Heç biri tərpənmirsə, paket o qarmağa ümumiyyətlə çatmır və növbəti sual ad sahəsi və ya yoldur.
Nəhayət, testi mexanizmin ifadə edə bildiyi ilə məhdudlaşdırın. Bir ünvan üçün bir marşrut, ünvanları dövr edən bir xidmət üçün daimi siyasətə çevrilmir. Əvvəlcə paket əhatəsini qərar verin, sonra yönləndirmə və mark dizaynının yenidən qoşulmadan sonra bu əhatəni saxlaya bildiyini yoxlayın.