VPN müştəri trafikini ötürməsi üçün Debian şlüzünə net.ipv6.conf.all.forwarding=1 qoydum və təxminən yarım saat sonra maşında IPv6 standart marşrutu qalmadı. Yuxarı marşrutlaşdırıcı işləyirdi, link-local qonşu hələ cavab verirdi və uplink öz qlobal ünvanını saxlayırdı. Dayanan şey kernelin həmin interfeysdə router advertisements qəbul etməyə davam etmək istəyi idi. Marşrut mən sysctl yazanda yox olmadı; o, RA-dan öyrənilmiş standart marşrutun ömrü bitəndə yox oldu və heç nə onu yeniləmədi.

İlk baxışda heç nə pozulmuş görünmürdü. Yönləndirmə işləyirdi, köhnə marşrut keşdə olduqca müştərilər keçirdi və nasazlıq onu törədən dəyişiklikdən sonra gəldi. Məhz bu gecikmə buna yuxarı tərəfin və ya heç vaxt iştirak etməmiş firewall qaydasının günahı kimi baxılmasına səbəb olur.

Hər hansı sysctl-ə toxunmazdan əvvəl marşrut cədvəlini oxuyun

ip -6 route show default ilə başlayın və yalnız şlüzü deyil, atributları oxuyun. RA-dan öyrənilmiş standart marşrut proto ra kimi işarələnib, üstünlük daşıyır və expires geri sayımını göstərir. Əllə əlavə etdiyiniz marşrutda bunların heç biri yoxdur və bu fərq marşruta hansı mexanizmin sahib olduğunu söyləyir.

$ ip -6 route show default
default via fe80::1 dev eth0 proto ra metric 1024 expires 1432sec hoplimit 64 pref medium

Sonra ünvana baxın: ip -6 addr show dev eth0. Saatlarla ölçülən üstünlük və etibarlılıq ömrü olan qlobal ünvan, marşrutlaşdırıcı ömrü dəqiqələrlə ölçülən standart marşrutdan daha uzun yaşayacaq. Ünvan var, standart marşrut yoxdur, bu, elan probleminin imzasıdır. Ünvan da yoxdursa, ilk növbədə keçid, prefiks məlumatı və ya təkrar ünvan aşkarlanması ilə məşğul olmaq lazımdır.

Niyə yönləndirmə RA emalını söndürür

RA 134 tipli ICMPv6 paketidir, 255 hop limiti ilə link-local mənbədən göndərilir. Kernel ondan istifadə etməzdən əvvəl interfeysin accept_ra dəyərinə baxır. Standart dəyər 1-dir və 1 «bəli» demək deyil. O deməkdir: yalnız bu host yönləndirmədiyi müddətdə qəbul et. forwarding=1 qoysanız, bu şərt pozulur, ona görə elan içindəki hər hansı prefiks və ya standart marşrutlaşdırıcı nəzərdən keçirilməmişdən atılır.

Üç dəyər var və yönləndirmədən yalnız üçüncüsü sağ qalır:

accept_raforwarding=0forwarding=1
0ignoredignored
1 (default)acceptedignored
2acceptedaccepted

Daha iki bayraq nəyin həqiqətən quraşdırılacağını müəyyən edir. accept_ra_defrtr elandakı standart marşrutlaşdırıcının marşruta çevrilməsini idarə edir, accept_ra_pinfo isə prefiks məlumatının ünvan konfiqurasiyası üçün istifadə olunmasını idarə edir. accept_ra_defrtr söndürmək, yönləndirən hostda standart marşrut öyrənmədən SLAAC ünvanlarını saxlamağın adi yoludur. Bu, accept_ra dən fərqli bir qoldur və ünvan istəyib marşrut istəmədikdə ona əl atırsınız. Kernelin IP sysctl sənədi hər üçünü sadalayır.

Bunu üç əmrlə təsdiqləyin

Əvvəlcə yükləndiyini düşündüyünüz faylın yerinə canlı dəyərləri oxuyun:

sysctl net.ipv6.conf.eth0.forwarding net.ipv6.conf.all.forwarding \
       net.ipv6.conf.eth0.accept_ra net.ipv6.conf.eth0.accept_ra_defrtr

İkincisi, elanların hələ gəldiyini sübut edin. ICMPv6 tip baytına görə süzgəc kifayətdir və qonşu aşkarlama trafikinin divarını oxumaqdan qurtarır:

tcpdump -ni eth0 'icmp6 and ip6[40] == 134'

Bir neçə dəqiqə ərzində heç nə görünmürsə, accept_ra sizin probleminiz deyil. Yuxarı tərəf elan verməyi dayandırdı, yolda nəsə ICMPv6 süzür və ya bu interfeys həqiqətən düşündüyünüz seqmentdə deyil. Üçüncüsü, elanı özünüz istəyin və sahələrini oxuyun:

rdisc6 eth0

rdisc6 Debian və Ubuntu-da ndisc6 paketində gəlir. Çıxışda başqa heç nəyi dəyişməzdən əvvəl marşrutlaşdırıcı ömrünə və üstünlüyə baxın. Marşrutlaşdırıcı ömrü 0 olan elan standart marşrutlaşdırıcını silmək əmridir və heç bir accept_ra dəyəri bunu yararlı marşruta çevirmir. Bu yolla körpü rejimindəki yuxarı CPE-ni də tutursunuz, o prefikslər paylayır, amma özünü marşrutlaşdırıcı kimi təklif etmir.

Uplink-i yeganə icazəli interfeys edin

Yuxarı tərəf standart marşrutlaşdırıcı olmalıdırsa, yönləndirməyə baxmayaraq elanları orada qəbul edin, başqa yerdə yox:

# /etc/sysctl.d/60-ipv6-router.conf
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.eth0.accept_ra = 2
net.ipv6.conf.eth0.accept_ra_defrtr = 1

Məhdudlaşdırma vacibdir, çünki Linux-da IPv6 yönləndirməsi bir qlobal açar, hər keçid üçün bir deyil. net.ipv6.conf.wg0.forwarding içinə 1 yazın və sonra net.ipv6.conf.all.forwarding oxuyun: qlobal dəyər çevrilir və hər interfeys yönləndirməyə başlayır. Siz tuneldə marşrutlaşdırıcı, LAN-da isə adi host ola bilməzsiniz. Məhdudlaşdıra biləcəyiniz şey qəbuldur. accept_ra=2 uplink-də saxlayın, tunel və LAN interfeyslərini 1 və ya 0-da qoyun ki, tuneldən gələn azğın elan ora yönələn standart marşrut quraşdıra bilməsin.

Müvəqqəti sysctl -w növbəti yükləmədən sonra qalmayacaq və həm systemd-networkd, həm də NetworkManager bu dəyərləri öz konfiqurasiyasından yazır. networkd-də uplink-in .network faylında IPv6Forwarding=yes və IPv6AcceptRA=yes qoyun; networkd IPv6Forwarding-i kerneldəki eyni səbəbdən qlobal kimi sənədləşdirir. NetworkManager-də uplink-dəki ipv6.method=auto accept_ra dəyərini idarə edir, ona görə nmcli connection up sonra sysctl-i yenidən oxuyun, ilk yoxlamaya güvənməyin.

Statik alternativ, ip -6 route add default via fe80::1 dev eth0, həqiqətən işləyir və yuxarı marşrutlaşdırıcının sabit link-local ünvanı olduqda ağlabatan cavabdır. Nədən imtina etdiyinizi aydın bilin. Statik standart marşrut heç vaxt yenilənmir və heç vaxt geri çəkilmir, ona görə yuxarı tərəf dəyişdirildikdən sonra da ölü qonşuya işarə edir. RA marşrutu təhlükəsiz şəkildə sıradan çıxır; statik olan səssizcə sıradan çıxır.

Şlüzün öz paketini deyil, yönləndirilmiş paketi yoxlayın

Şlüzün öz pinqləri heç bir müştərinin istifadə edə bilmədiyi marşrutla uğurla keçə bilər və şlüz mənbə olduğu üçün də uğurlu ola bilər. Qoşulmuş müştəridən yoxlayın, sonra şlüzdən həmin müştərinin ünvanı üçün nə edəcəyini soruşun:

# on the VPN client
ping -6 -c 3 2001:4860:4860::8888

# on the gateway, using a client address
ip -6 route get 2001:4860:4860::8888 from fd42:20::2

Sonra bir marşrutlaşdırıcı ömrü gözləyin və yenidən baxın. İstədiyiniz sabit vəziyyət proto ra ilə işarələnmiş standart marşrutdur, onun expires dəyəri daim sıfırlanır, üstəgəl all.forwarding=1. Əgər expires yalnız geri sayırsa, elanlar hələ də haradasa atılır və adi günahkar yükləmə zamanı sysctl artıq icra olunduqdan sonra accept_ra dəyərini yenidən yazan şəbəkə meneceridir.

Bunu bağlamazdan əvvəl dörd şeyi təsdiqləyin: standart marşrut proto ra və yenilənir, accept_ra=2 yalnız uplink-ə aiddir, yönləndirmə yenidən yükləmədən sonra da, menecer yenidən işə salındıqdan sonra da 1-dir və IPv6 pinqini şlüz deyil, müştəri tamamlayır. Əgər müştəri sağlam marşrutla yenə də alınmırsa, növbəti şübhəli geri yol və ya yuxarı firewall-dır, elan deyil.

Əlaqəli məqalələr