Niyə ofis LAN-da VPN klienti hər cavabı itirir
Ofis LAN-da və eyni altşəbəkədəki tuneldə olan noutbuk səhv interfeysdən cavab verir. Boş tərs-marşrut filtrləmə bu səssizliyi izah edir.
Noutbuk Ethernet üzərindən ofisin /24 şəbəkəsində oturur və həm də həmin /24-də yaşayan OpenVPN serverinə qoşulur. Həmkar tunel ünvanına ping göndərir; sorğu aydın şəkildə çatır, geri heç nə getmir. Tunel jurnalı təmizdir və brauzer işləyir, deməli tunel səhv şübhəlidir. Qəbul edən maşında IPv4 mənbə yoxlaması paketi hər hansı şey onu oxumadan əvvəl atır.
Atma paketi heç nə oxumadan əvvəl baş verir
Mənbə yoxlaması hər gələn paket üçün bir sual verir: əgər bu host həmin mənbəyə cavab versəydi, cavab paketin indicə gəldiyi interfeysdən çıxardımı? Cavab “yox” olduqda nüvə paketi gəldiyi anda atır. Nə bir soket, nə də bir yönləndirmə yolu onu heç vaxt görmür, buna görə tuneldəki tutma tətbiqin heç vaxt almadığı sorğunu yenə də qeyd edir.
Buradakı klient tunelində 10.66.0.9 saxlayır, OpenVPN serveri isə ofis prefiksi daxilində 192.168.80.10 ünvanından cavab verir. 192.168.80.25 ünvanındakı həmkar tunel ünvanına ping göndərir, sorğu LAN-ı keçir, server onu tunelə yönləndirir və o, ofis mənbə ünvanı daşıyaraq klientin tunel interfeysinə çatır. Həmin maşının marşrut cədvəlində ofis prefiksi Ethernet cihazına aiddir, tunelə yox. Yoxlama gəliş interfeysini marşrutla müqayisə edir, uyğunsuzluq tapır və paketi atır, buna görə həmkar tam itki görür, halbuki iki tərəf sağlam tunel bildirir.
Əks istiqamət eyni formadadır: klient ofisə doğru başladıqda cavablar ofis tərəfində eyni səbəbdən atıla bilər. Yalnız bir istiqamətdə təsdiqlənmiş düzəliş adətən ikinci bilet kimi qayıdır.
Hər hansı sysctl-ə toxunmadan əvvəl qüvvədə olan rejimi sübut edin
Distribusiya defoltuna güvənmək əvəzinə faktiki dəyərləri oxuyun, çünki interfeys üzrə parametr qərarın yalnız yarısıdır. Qüvvədə olan rejim interfeys dəyəri ilə all dəyərindən böyüyüdür, yəni tunel interfeysindəki sıfır, all bir olduğu müddətcə heç nə ifadə etmir. Sərt rejimin qərarı marşrut qərarıdır, buna görə nüvənin işlətdiyi axtarışı işlədin və cavabını paketin həqiqətən gəldiyi interfeyslə müqayisə edin.
tcpdump -ni tun0 icmp and host 192.168.80.25
ip route get 192.168.80.25
sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.tun0.rp_filter
Sonra xəta sayğacını izləyərək ping-i təkrarlayın. Tutmanın artıq göstərdiyi sorğunun yanında artan say bu atmanın imzasıdır, itkin marşrutun yox. Orada olarkən marsian qeydiyyatını yandırın ki, nüvə rədd etdiyi mənbəyi və interfeysi adlandırsın. Birlikdə şifrəni, firewall-u və itkin iroute-u izah kimi istisna edirlər.
Nəyisə dəyişməzdən əvvəl baza xəttini yazın: hər iki dəyər, axtarışın seçdiyi cihaz və izlədiyiniz sayğac. Sonradan dəyişikliyin düşündüyünüzü etdiyini sizə deyən məhz bu qeyddir.
Hər rp_filter rejiminin həqiqətən qəbul etdiyi
Nüvə hər interfeys üçün üç dəyər təqdim edir və bunlar bir qaydanın üç çaları deyil. Sıfır yoxlamanı söndürür. Bir sərtdir və mənbəyin gəliş interfeysindən geri yönləndirilməsini tələb edir. İki boşdur və yalnız cədvəldə mənbəyə hansısa marşrutun olmasını tələb edir, hara baxmasından asılı olmayaraq.
| Value | Name | Accepts | Still rejects |
|---|---|---|---|
| 0 | off | any source at all | nothing on this check |
| 1 | strict | a source routed back out the arrival interface | a source whose route points elsewhere |
| 2 | loose | a source with any route in the table | a source with no route at all |
Burada vacib olan sətir boş olandır və onun rədd etməyə davam etdiyi şeydir. Cədvəlinizdə hər hansı yerdə yönləndirilə bilən saxta mənbə keçir, heç marşrutu olmayan mənbə isə yenə rədd edilir. Noutbukda bu dar güzəştdir; başqaları üçün trafik yönləndirən marşrutlaşdırıcıda isə geniş güzəştdir. Rejim hosta aiddir, buna görə eyni rəqəm iki yerdə fərqli çəki daşıyır.
Bu topologiyanın hansı sətri tələb etdiyi vərdişdən deyil, cədvəldən çıxır. Paket qanunidir və mənbəyi yönləndirilə biləndir, buna görə boş onu qəbul edir, sərt isə yox. İşdə heç nə sıfırı tələb etmir və sıfırı seçmək burada heç nəyə başa gəlməyən yoxlamanı aradan qaldırardı.
Qeyri-müəyyənliyi aradan qaldıran ən kiçik dəyişikliyi seçin
Boş rejim uyğun gələn ən kiçik dəyişiklikdir və zərərsiz açar deyil, sərtlikdə real azalmadır. Topologiya imkan verdikcə daha yaxşı variant var: üst-üstə düşməni çıxarın və qeyri-müəyyənlik yox olur.
Ofis prefiksi yalnız Ethernet üzərindən lazım olduqda, onu profilin dartdığı marşrutlardan çıxarın və ünvan bir yolla əlçatan olur. Hər iki yol həqiqətən birgə mövcud olmalı olduqda, hər interfeysdə yoxlamanı boşaltmaq əvəzinə mənbəyi və cihazı siyasət qaydası ilə bərkidin. Bu, maşındakı hər şey üçün sərt filtrləməni saxlayır və istisnanı növbəti mühəndisin axtaracağı yerdə sənədləşdirir.
Hansı yolu seçsəniz də, onu canlı əmr əvəzinə sysctl drop-in faylında qeyd edin. Paketin yenidən qoşulması sərt rejimi sakitcə bərpa edə bilməsin deyə all və default açarlarını birlikdə qurun.
# /etc/sysctl.d/99-rp-filter.conf
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
sysctl --system
Boş rejim nəyi və harada itirir
Boş rejim heç bir marşrutun çata bilmədiyi mənbəyi yenə rədd edir və təsadüfən yönləndirilə bilən saxta mənbəni rədd etməyi dayandırır. Noutbukda bu dar güzəştdir. Sahibi olmadığı trafiki yönləndirən cihazda eyni seçim daha geniş güzəştdir. Buna görə eyni parametr işlədiyi yerdən asılı olaraq iki çox fərqli məna daşıyır.
Başqaları üçün trafik yönləndirən hostda yoxlamanı tamamilə söndürmək qaçmaq lazım olan yeganə düzəlişdir. Sıfır, boş rejimin diqqətlə saxladığı yoxlamanı atır. Host başqaları üçün yönləndirirsə, əvəzində əvvəlki bölmədəki siyasət qaydası variantını müdafiə edin.
İki interfeysi, üst-üstə düşən prefiksi və indi uğur qazanan dəqiq sınağı adlandıran qeyd buraxın. Bu, filtrləmənin düzəldildiyini deyən sətirdən növbəti mühəndis üçün daha faydalıdır.