Wireguard VPN – Fejlfinding
Dernæst opretter vi en Wireguard -grænseflade i “init” (originalt) navneområde:
Torguards IP -checker
Som alle Linux -netværksgrænseflader integreres Wireguard i netværksnavneområdet infrastruktur. Dette betyder, at en administrator kan have flere helt forskellige netværksundersystemer og vælge hvilke grænseflader der bor i hver.
Wireguard gør noget ganske interessant. Når der oprettes en Wireguard -grænseflade (med IP -link tilføj WG0 -type Wireguard), husker det det navneområde, hvor det blev oprettet. ”Jeg blev oprettet i navneområde A.”Senere kan Wireguard flyttes til nye navneområder (” Jeg flytter til navneområde B.”), men det vil stadig huske, at det stammer fra navneområdet a.
Wireguard bruger en UDP -stik til faktisk at sende og modtage krypterede pakker. Denne stikkontakt Lever altid i navneområdet a – det originale navneområde for fødested. Dette giver mulighed for nogle meget seje egenskaber. Nemlig kan du oprette Wireguard -grænsefladen i et navneområde (A), flytte det til en anden (B) og få ClearText -pakker sendt fra navneområdet B blive sendt krypteret gennem en UDP -stik i navneområdet A.
(Bemærk, at denne samme teknik er tilgængelig for UserSpace Tun-baserede grænseflader ved at oprette en socket-fil-beskrivende i et navneområde, før du skifter til et andet navneområde og holder fil-beskrivelsen fra det forrige navneområde åbent.)
Dette åbner nogle meget flotte muligheder.
Almindelig containerisering
Den mest åbenlyse anvendelse af dette er at give containere (som f.eks. Docker -containere) en Wireguard -grænseflade som dens eneste interface.
Container # IP Addr 1: LO: MTU 65536 QDISC NOQUEUE STATE Ukendt gruppe Standard Qlen 1 Link/Loopback 00: 00: 00: 00: 00: 00 BRD 00: 00: 00: 00: 00: 00 Inet 127.0.0.1/8 Scope Host Lo Valid_Lft Forever Preferred_LFT Forever 17: WG0: MTU 1423 QDISC NOQUEUE STATE Ukendt gruppe Standard QLEN 1 LINK/INGEN INET 192.168.4.33/32 Omfang Global WG0 VALID_LFT Forever Preferred_LFT Forever Forever
Her er den eneste måde at få adgang til det mulige netværk gennem WG0, Wireguard -interface.
Vejen til at opnå en opsætning som denne er som følger:
Først opretter vi netværksnavneområdet kaldet “container”:
# IP Netns Tilføj container
Dernæst opretter vi en Wireguard -grænseflade i “init” (originalt) navneområde:
# IP -link Tilføj WG0 -type Wireguard
Endelig flytter vi denne grænseflade ind i det nye navneområde:
# IP Link Set WG0 Netns Container
Nu kan vi konfigurere WG0 som sædvanligt, bortset fra at vi specificerer dets nye navneområde ved at gøre det:
# ip -n container addr tilføj 192.168.4.33/32 dev WG0 # ip Netns Exec container WG SetConf Wg0/etc/Wireguard/WG0.conf # ip -n container link sæt wg0 op # ip -n container rute tilføj standard dev wg0
Og voila, nu den eneste måde at få adgang til nogen netværksressourcer til “container” vil være via Wireguard -interface.
Bemærk, at Docker -brugere kan specificere PID for en Docker -proces i stedet for netværksnavnepace -navnet, for at bruge det netværksnavneområde, som Docker allerede har oprettet til sin container:
# IP Link Set WG0 NETNS 879
Routing af al din trafik
En mindre indlysende anvendelse, men alligevel ekstremt kraftfuld er at bruge denne egenskab ved Wireguard til at omdirigere al din almindelige internettrafik over Wireguard. Men lad os først gennemgå de gamle sædvanlige løsninger til at gøre dette:
De klassiske løsninger
De klassiske løsninger er afhængige af forskellige typer routingtabelkonfigurationer. For alle disse er vi nødt til at indstille en eksplicit rute til det faktiske Wireguard -slutpunkt. For disse eksempler, lad os antage, at Wireguard -slutpunktet er demo.Wireguard.com, som ved skrivning løser til 163.172.161.0 . Lad os endvidere antage, at vi normalt opretter forbindelse til internettet ved hjælp af eth0 og den klassiske gateway på 192.168.1.1 .
Udskiftning af standardruten
Den mest ligetil teknik er bare at udskifte standardruten, men tilføje en eksplicit regel for Wireguard Endpoint:
# IP Route Del Standard # IP Route Tilføj standard Dev Wg0 # IP Route Tilføj 163.172.161.0/32 via 192.168.1.1 Dev Eth0
Dette fungerer og er relativt ligetil, men DHCP -dæmoner og sådan kan du fortryde det, vi lige har gjort, desværre.
Tilsidesætter standardruten
Så i stedet for at udskifte standardruten, kan vi bare tilsidesætte den med to mere specifikke regler, der tilføjes i beløb til standard, men matcher før standard:
# IP -rute Tilføj 0.0.0.0/1 dev WG0 # IP Route Tilføj 128.0.0.0/1 dev WG0 # IP Route Tilføj 163.172.161.0/32 via 192.168.1.1 Dev Eth0
På denne måde klapper vi ikke standardruten. Dette fungerer dog også godt, desværre når eth0 går op og ned, den eksplicitte rute for demo.Wireguard.com vil blive glemt, hvilket er irriterende.
Regelbaseret routing
Nogle mennesker foretrækker at bruge regelbaseret routing og flere routingborde. Den måde, dette fungerer på, er, at vi opretter en routingtabel til Wireguard -ruter og en routingtabel for PLAINTEXT Internetruter, og tilføj derefter regler for at bestemme, hvilken routingtabel der skal bruges til hver:
# IP -regel tilføj til 163.172.161.0 opslag hovedpræ 30 # IP -regel Tilføj til al opslag 80 Præ 40 # ip rute Tilføj standard dev WG0 Tabel 80
Nu er vi i stand til at holde routingborde adskilt. Desværre er ulempen, at der stadig skal tilføjes eksplicitte slutpunktsregler, og der er ingen oprydning, når grænsefladen fjernes, og mere komplicerede routingregler skal nu duplikeres.
Forbedret regelbaseret routing
Den forudgående løsning er afhængig af, at vi kender det eksplicitte slutpunkt IP, der skal være fritaget for tunnelen, men Wireguard -endepunkter kan strejfe, hvilket betyder. Heldigvis er vi i stand til at indstille et fwmark på alle pakker, der går ud af Wireguards UDP -stik, som derefter vil være fritaget for tunnelen:
# WG SET WG0 FWMARK 1234 # IP ROUTE Tilføj standard Dev Wg0 Tabel 2468 # IP -regel Tilføj ikke FWMark 1234 Tabel 2468 # IP -regel Tilføj tabel Main Suppress_PrefixLength 0
Vi indstiller først FWMark på grænsefladen og indstiller en standardrute på en alternativ routingtabel. Derefter angiver vi, at pakker, der ikke har FWMark, skal gå til denne alternative routingtabel. Og til sidst tilføjer vi en bekvemmelighedsfunktion for stadig at få adgang til det lokale netværk, hvorved vi tillader pakker uden fwmark at bruge hovedrutetabellen, ikke Wireguard -interface’s routingtabel, hvis den matcher nogen ruter i den med en præfiks længde større end nul, såsom lokale lokale ruter ikke. Dette er den teknik, der bruges af WG-Quick (8) værktøjet.
Forbedring af de klassiske løsninger
Wireguard -forfatterne er interesseret i at tilføje en funktion kaldet “Notoif” til kernen til at dække sager om brug af tunnel. Dette ville give grænseflader mulighed for at sige “ikke rute denne pakke ved hjælp af mig selv som en grænseflade, for at undgå routingsløjfen”. Wireguard ville være i stand til at tilføje en linje som .flowi4_not_oif = wg0_idx, og UsSpace Tun -baserede grænseflader ville være i stand til at indstille en mulighed på deres udgående sokkel som setSockOpt (FD, SO_NOTOIF, TUN0_IDX); . Uheldigvis er dette endnu ikke blevet fusioneret, men du kan læse LKML -tråden her.
Den nye navneområdeopløsning
Det viser sig, at vi kan rute al internettrafik via Wireguard ved hjælp af netværksnavneområder snarere end de klassiske routingtabelhacks. Den måde, dette fungerer på, er, at vi flytter grænseflader, der opretter forbindelse til internettet, som eth0 eller WLAN0, til et navneområde (som vi kalder “fysisk”) og derefter har en Wireguard -grænseflade være det eneste interface i “init” -navneområdet.
Først opretter vi det “fysiske” netværksnavneområde:
# ip netns tilføjer fysisk
Nu flytter vi ETH0 og WLAN0 ind i det “fysiske” navneområde:
# ip link sæt eth0 netns fysisk # iw phy phy0 sæt netns navn fysisk
(Bemærk, at trådløse enheder skal flyttes ved hjælp af IW og ved at specificere den fysiske enhed Phy0 .)
Vi har nu disse grænseflader i det “fysiske” navneområde, mens vi ikke har nogen grænseflader i navneområdet “Init”:
# IP -n Fysisk link 1: LO: MTU 65536 QDISC NOOP STATE Down Mode Standardgruppe Standard QLEN 1 LINK/LOOPBACK 00: 00: 00: 00: 00: 00 BRD 00: 00: 00: 00: 00: 00 2: ETH0: MTU 1500 QDISC PFIFO_FAST STATE Down Mode Standardgruppe Standard QLEN 1000 LINK/Ether AB: CD: EF: G1: 23: 45 BRD FF: FF: FF: FF: FF: FF 3: WLAN0: MTU 1500 QDISC MQ State UP Mode Sovende gruppe Standard QLEN 1000 LINK/Ether 01: 23: 45: 67: 89: AB BRD FF: FF: FF: FF: FF: FF # IP Link 1: LO: MTU 65536 QDISC NOQUEUE STAT Ukendt Mode Standardgruppe Standard QLEN 1 Link/Loopback 00: 00: 00: 00: 00: 00 BRD 00: 00: 00: 00: 00: 00
Nu tilføjer vi en Wireguard -grænseflade direkte til det “fysiske” navneområde:
# ip -n fysisk link Tilføj WG0 -type wireguard
Fødestedens navneområde på WG0 er nu det “fysiske” navneområde, hvilket betyder, at Ciffertext UDP -stikkontakter vil blive tildelt enheder som Eth0 og WLAN0 . Vi kan nu flytte WG0 ind i “init” -navneområdet; det vil dog stadig huske sin fødested for stikkene.
# ip -n fysisk link sæt Wg0 Netns 1
Vi specificerer “1” som “init” navneområde, fordi det er PID for den første proces på systemet. Nu har “init” -navneområdet WG0 -enheden:
# IP -link 1: LO: MTU 65536 QDISC NOQUEUE STATE Ukendt Mode Standardgruppe Standard QLEN 1 LINK/LOOPBACK 00: 00: 00: 00: 00: 00 BRD 00: 00: 00: 00: 00: 00 17: WG0: MTU 1423 QDISC NOQUEUE STATE Ukendt Mode Standardgruppe Standard Qlen 1 Link/Ingen
Vi kan nu konfigurere de fysiske enheder ved hjælp af de almindelige værktøjer, men vi lancerer dem inden for det “fysiske” netværksnavneområde:
kl.Conf # ip -n Physical Addr Tilføj 192.168.12.52/24 Dev Eth0
Og så videre. Endelig kan vi konfigurere WG0 -interface som sædvanligt og indstille den som standardrute:
# WG SETCONF WG0/etc/Wireguard/WG0.conf # ip addr tilføj 10.2.4.5/32 dev WG0 # IP Link Set WG0 UP # IP Route Tilføj standard Dev WG0
Færdig! På dette tidspunkt vil alle almindelige processer på systemet dirigere deres pakker gennem “init” -navneområdet, der kun indeholder WG0 -interface og WG0 -ruterne. WG0 har imidlertid sin UDP -stik, der bor i det “fysiske” navneområde, hvilket betyder, at det vil sende trafik ud af Eth0 eller WLAN0 . Normale processer vil ikke engang være opmærksomme på eth0 eller WLAN0, undtagen DHCPCD og WPA_Supplicant, som blev spawned inde i det “fysiske” navneområde.
Nogle gange vil du dog måske åbne en webside eller gøre noget hurtigt ved hjælp af det “fysiske” navneområde. F.eks. Så du kan udføre udvalgte udvalgte processer (som din lokale bruger) ved hjælp af den “fysiske” grænseflade:
$ sudo -e ip netns exec fysisk sudo -e -u \#$ (id -u) -g \#$ (id -g) krom
Dette kunne selvfølgelig gøres til en dejlig funktion til .Bashrc:
physexec ()
Og nu kan du skrive følgende til åbning af krom i det “fysiske” navneområde.
$ Physexec -krom
Når du er færdig med at underskrive i kaffebarnetværket, spawn en browser som sædvanlig og surfe roligt ved at vide, at al din trafik er beskyttet af Wireguard:
$ krom
Eksempel på script
Følgende eksempel script kan gemmes som/usr/lokal/bin/wgphys og bruges til kommandoer som WGPHYS UP, WGPHYS Down og WGPHYS EXEC:
#!/bin/bash sæt -ex [[$ uid != 0]] && exec sudo -e "$ (ReadLink -f "$ 0")" "$@" op() < killall wpa_supplicant dhcpcd || true ip netns add physical ip -n physical link add wgvpn0 type wireguard ip -n physical link set wgvpn0 netns 1 wg setconf wgvpn0 /etc/wireguard/wgvpn0.conf ip addr add 192.168.4.33/32 dev wgvpn0 ip link set eth0 down ip link set wlan0 down ip link set eth0 netns physical iw phy phy0 set netns name physical ip netns exec physical dhcpcd -b eth0 ip netns exec physical dhcpcd -b wlan0 ip netns exec physical wpa_supplicant -B -c/etc/wpa_supplicant/wpa_supplicant-wlan0.conf -iwlan0 ip link set wgvpn0 up ip route add default dev wgvpn0 >ned() < killall wpa_supplicant dhcpcd || true ip -n physical link set eth0 down ip -n physical link set wlan0 down ip -n physical link set eth0 netns 1 ip netns exec physical iw phy phy0 set netns 1 ip link del wgvpn0 ip netns del physical dhcpcd -b eth0 dhcpcd -b wlan0 wpa_supplicant -B -c/etc/wpa_supplicant/wpa_supplicant-wlan0.conf -iwlan0 >execi () < exec ip netns exec physical sudo -E -u \#$ Sudo_uid:-$ (id -u)> -g \#$ Sudo_gid:-$ (id -g)> -- "$@" > Kommando ="$ 1" flytte sag "$ kommando" i op op "$@" ;; ned) ned "$@" ;; Exec) execi "$@" ;; *) ekko "Brug: $ 0 op | ned | exec " > & 2; Afgang 1 ;; esac
En lille demo af ovenstående:
© Copyright 2015-2022 Jason A. Donenfeld. Alle rettigheder forbeholdes. “Wireguard” og “Wireguard” -logoet er registrerede varemærker til Jason A. Donenfeld.
Dette projekt er fra ZX2C4 og fra Edge Security, et firma, der er afsat til ekspertise inden for informationssikkerhedsforskning.
Wireguard VPN – Fejlfinding
Det kan være nyttigt at forlade en terminal åben med Watch WG -kommandoen. Her er en prøveudgang, der viser et system med to kammerater konfigureret, hvor kun én har etableret VPN indtil videre:
Hver 2.0S: WG J-WG: Fre 26. august 17:44:37 2022 Interface: WG0 Offentlig nøgle: +T3T3HTMEYREDVIM8FBXBYJBZ +/POEOTG3RLVL9KJMM = privat nøgle: (Hidden) Lytning Port: 51000 Peer: 2Cjdfcnzxv4yugyDaHTAFRBSRRFSCBY Endpoint: 10.172.196.106: 51000 tilladt IPS: 10.10.11.2/32 Seneste håndtryk: 3 timer, 27 minutter, 35 sekunder siden Overførsel: 3.06 Kib modtaget, 2.80 kib sendt peer: zliz1hlarzqvfxpmyme2ectxdk611nb7uzlad4mcpgi = tilladt ips: 10.10.11.3/32
Kernelfejlbeskeder
Wireguard er også tavs, når det kommer til logning. At være et kernemodul i det væsentlige, er vi nødt til eksplicit at muliggøre verbose -logning af dets modul. Dette gøres med følgende kommando:
$ Echo "Modul Wireguard +P" | sudo tee/sys/kerne/debug/dynamic_debug/kontrol/kontrol
Dette vil skrive Wireguard -loggingsmeddelelser til kerneloggen, som kan ses live med:
$ sudo dmesg -wt
For at deaktivere logning skal du køre dette:
$ Echo "Module Wireguard -p" | sudo tee/sys/kerne/debug/dynamic_debug/kontrol/kontrol
Destinationsadresse kræves
Hvis du ping en IP og får tilbage en fejl som denne:
$ ping 10.10.11.2 ping 10.10.11.2 (10.10.11.2) 56 (84) byte af data. Fra 10.10.11.1 ICMP_SEQ = 1 Destination vært Ubehæfket Ping: Sendmsg: Destination Adresse krævet
Dette sker, fordi Wireguard -grænsefladen, der er valgt til denne destination, ikke kender slutpunktet for det. Med andre ord, det ved ikke, hvor man skal sende den krypterede trafik.
Et almindeligt scenarie for dette er på en peer, hvor der ikke er nogen slutpunktkonfiguration, som er perfekt gyldig, og værten forsøger at sende trafik til den peer. Lad os tage det kaffebar -scenarie, vi beskrev tidligere som et eksempel.
Den bærbare computer er tilsluttet VPN og udveksler trafikken som sædvanligt. Så stopper det lidt (personen gik for at få endnu en kop). Trafik ophører (Wireguard er tavs, husk). Hvis Wireguard på hjemme -routeren nu genstartes, når det kommer tilbage, ved det ikke, hvordan man når den bærbare computer, fordi den aldrig blev kontaktet af den før. Dette betyder, at på dette tidspunkt, hvis hjemme routeren prøver at sende trafik til den bærbare computer i kaffebaren, får det ovenstående fejl.
Nu kommer den bærbare computer tilbage og genererer en vis trafik til hjemmenetværket (husk: den bærbare computer har hjemmenetværkets slutpunktværdi). VPN “vågner op”, data udveksles, håndtryk afsluttes, og nu kender hjemme routeren det slutpunkt, der er knyttet til den bærbare computer, og kan igen indlede ny trafik til det uden problemer.
En anden mulighed er, at en af jævnaldrende ligger bag en NAT, og der var ikke nok trafik til den statlige firewall til at overveje ”forbindelsen” i live, og den faldt den NAT -kortlægning, den havde. I dette tilfælde kan peer muligvis drage fordel af den vedvarende Keepalive -konfiguration, der får Wireguard til at sende en holde i live sonde hvert så mange sekunder.
Krævet nøgle ikke tilgængelig
$ ping 10.10.11.1 ping 10.10.11.1 (10.10.11.1) 56 (84) bytes af data. Fra 10.10.11.2 ICMP_SEQ = 1 destination vært Ubehæfket ping: Sendmsg: Nødvendigt nøgle ikke tilgængelig
Kan ske, når du har en rute, der dirigerer trafik til Wireguard -interface, men denne grænseflade har ikke måladressen, der er anført i dens tilladte konfiguration.
Hvis du har aktiveret kernefejlbugging til Wireguard, vil du også se en besked som denne i DMESG -output:
Wireguard: Home0: Ingen peer har tilladt IPS Matching 10.10.11.1