Nustatymas atrodo kaip jungiklis kiekvienai programai, todėl žmonės susieja klientą su WireGuard sąsaja ir tikisi, kad tunelį naudos tik tas klientas. Susiejimas iš tikrųjų parenka šaltinio adresą. Tada branduolys ieško maršruto paskirties taškui, randa įprastą numatytąjį maršrutą ir siunčia paketą fizine jungtimi su pridėtu tunelio adresu. Tik tam šaltinio adresui parinktas maršrutas įvykdo ketinimą.

Mechanizmas turi dvi puses: maršrutizavimo lentelę, kurią turėtų naudoti tik tunelio srautas, ir taisyklę, kuri atitinkantį šaltinį nusiunčia ten.

Susiejimas nustato šaltinio adresą ir nieko daugiau

Linux išėjimo sąsają parenka ieškodamas paskirties maršrutizavimo lentelėje, po to kai politikos taisyklės turėjo galimybę tą paiešką nukreipti kitur. Taisyklės gali rinktis pagal šaltinio adresą, ugniasienės ženklą, įeinančią sąsają, UID ar net prievadą; kiekviena jų yra kitas būdas pasakyti šis srautas, o ne visas. VPN kliento konfigūracija parenka lentelę, kurioje yra tunelio maršrutai; taisyklė parenka, kuriam srautui leidžiama į ją kreiptis. Vien susiejimas neduoda nė vieno.

Štai kodėl šis gedimas atrodo toks keistas. Programa tikrai naudoja tunelio adresą, tunelis tikrai veikia, o srautas tikrai išeina per netinkamą sąsają. Kiekvienas teiginys teisingas, ir kartu jie aprašo sistemą, kurioje niekas nesiejo adreso su maršrutu.

Duokite tuneliui savo lentelę

wg-quick įdiegia maršrutus ten, kur nurodo profilis. Table = 40 pridėjimas po [Interface] perkelia juos į 40 lentelę, o ne į pagrindinę. Pakelkite sąsają ir patvirtinkite, kad jie atkeliavo: ip -4 route ls table 40 turėtų rodyti tunelio maršrutus, o ip -4 route get 10.66.127.142 rodo, kaip branduolys dabar sprendžia vieną iš jų. Kai maršrutai yra savo lentelėje, pagrindinė lentelė toliau veikia viskam kitam.

Padarykite tą patį IPv6 atveju, o ne derinkite platų prefiksą. ip -6 rule add from fd00::2/128 lookup 40 prisega vieną adresą; fc00::/8 gali susidurti su kitomis sąsajomis hoste ir sukurti taisyklę, kuri atitinka daugiau nei numatyta.

Pridėkite šaltinio taisyklę ir stebėkite skaitiklius

Tada sujunkite abi puses: ip -4 rule add from 10.66.127.142/32 lookup 40, su tuo pačiu adresu, prijungtu prie WireGuard sąsajos. Įdėkite abi taisykles į PostUp, kad persijungimas jas atkurtų. Patikrinkite tikru užklausimu, o ne nustatymu: ip route get 1.1.1.1 from 10.66.127.142 turėtų įvardyti tunelio įrenginį, o curl --interface wg0 ifconfig.me turėtų pranešti tunelio adresą, o ne namų.

Kai vis tiek nepavyksta, perskaitykite ip -s rule. Taisyklė, kuri egzistuoja, bet niekada nesutapo, rodo nulinius skaitiklius, ir tai atskiria neteisingą taisyklę nuo taisyklės nebuvimo. Ta viena komanda sutaupo daug spėliojimų, ar programa nepaisė savo sąsajos nustatymo.

Atvirkštinis atvejis: laikykite SSH už tunelio

Priešinga problema tokia pat dažna: wg-quick valdo numatytąjį maršrutą ir SSH sesija su serveriu miršta įpusėjusi. Jos taisyklės yra žemo prioriteto numeriu, todėl išimtis turi būti įvertinta anksčiau už jas. ip rule add dport 22 ipproto tcp table main priority 123 tai daro naujame iproute2; kur selektoriaus nėra, pažymėkite srautą nftables ir derinkite ženklą.

Patikrinkite ir atsakymo kelią. SSH sesija, kuri užmezgama ir paskui nutyla, paprastai turi asimetrinį maršrutizavimą: viena kryptis išeina per tunelį, kita per fizinę sąsają. ip route get serverio adresui pasako, kuria kryptimi eitų atsakymas.

Užrašykite lentelės numerį, šaltinio taisyklę ir išimtį pačiame profilyje. Visi trys priklauso vienam projektui ir bus redaguojami kartu.

Susiję straipsniai