Damier IP de Torguards

Contents

Wireguard VPN – dépannage

Ensuite, nous créons une interface Wireguard dans l’espace de noms “init” (original):

Damier IP de Torguards

Comme toutes les interfaces de réseau Linux, Wireguard s’intègre dans l’infrastructure d’espace de noms de réseau. Cela signifie qu’un administrateur peut avoir plusieurs sous-systèmes de mise en réseau entièrement différents et choisir les interfaces vivent dans chaque.

Wireguard fait quelque chose de très intéressant. Lorsqu’une interface Wireguard est créée (avec IP Link Ajouter Wg0 Type Wireguard), il se souvient de l’espace de noms dans lequel il a été créé. “J’ai été créé dans l’espace de noms A.”Plus tard, Wireguard peut être déplacé vers de nouveaux espaces de noms (” Je passe à l’espace de noms B.”), mais il se souviendra toujours qu’il est originaire de l’espace de noms.

Wireguard utilise une prise UDP pour envoyer et recevoir des paquets cryptés réellement. Cette prise vit toujours dans l’espace de noms a – L’espace de noms du lieu de naissance d’origine. Cela permet des propriétés très cool. À savoir, vous pouvez créer l’interface Wireguard dans un espace de noms (a), le déplacer vers un autre (b), et faire envoyer des paquets ClearText à partir de l’espace de noms B.

(Notez que cette même technique est disponible pour les interfaces basées sur l’espace utilisateur, en créant un fichier-descripteur de socket dans un espace de noms, avant de passer à un autre espace de nom.)

Cela ouvre de très belles possibilités.

Conteneurisation ordinaire

L’utilisation la plus évidente de ceci est de donner des conteneurs (comme des conteneurs Docker, par exemple) une interface Wireguard comme interface unique.

conteneur # ip addr 1: LO: MTU 65536 QDISC NOqueue State Group inconnu par défaut Qlen 1 Lien / 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 Group Unknown Default Qlen 1 lien / Aucun INET 192.168.4.33/32 Scope Global Wg0 valid_lft Forever Preferred_lft Forever 

Ici, la seule façon d’accéder au réseau possible est via WG0, l’interface Wireguard.

La façon d’accomplir une configuration comme celle-ci est la suivante:

Nous créons d’abord l’espace de noms de réseau appelé “conteneur”:

# IP Netns Ajouter un conteneur 

Ensuite, nous créons une interface Wireguard dans l’espace de noms “init” (original):

# lien IP Ajouter WG0 Type Wireguard 

Enfin, nous déplacons cette interface dans le nouvel espace de noms:

# lien IP SET CONTTEMER WG0 NETNS 

Maintenant, nous pouvons configurer WG0 comme d’habitude, sauf que nous spécifions son nouvel espace de noms en le faisant:

# ip -N Container Addr Ajouter 192.168.4.33/32 DEV WG0 # IP NETNS EXEC CONTUTER WG SETCONF WG0 / ETC / WIREURARD / WG0.Conf # ip -n lien de conteneur définir wg0 up # ip -n couteneur route Ajouter le dev par défaut wg0 

Et le tour est joué, maintenant le seul moyen d’accéder aux ressources du réseau pour “conteneur” sera via l’interface Wireguard.

Notez que les utilisateurs de Docker peuvent spécifier le PID d’un processus Docker au lieu du nom de l’espace de noms de réseau, pour utiliser l’espace de noms de réseau que Docker a déjà créé pour son conteneur:

# lien IP SET WG0 NETNS 879 

Rouvrir tout votre trafic

Une utilisation moins évidente, mais extrêmement puissante, consiste à utiliser cette caractéristique de Wireguard pour rediriger tout votre trafic Internet ordinaire sur Wire Guin. Mais d’abord, passons en revue les anciennes solutions habituelles pour ce faire:

Les solutions classiques

Les solutions classiques reposent sur différents types de configurations de table de routage. Pour tous ces éléments, nous devons définir un itinéraire explicite pour le point de terminaison réel Wireguard. Pour ces exemples, supposons que le point de terminaison Wire Guélectricité est une démo.givré.com, qui, à partir de l’écriture, se résout à 163.172.161.0 . De plus, supposons que nous nous connectons généralement à Internet en utilisant ETH0 et la passerelle classique de 192.168.1.1 .

Remplacement de l’itinéraire par défaut

La technique la plus simple consiste à remplacer simplement l’itinéraire par défaut, mais à ajouter une règle explicite pour le point de terminaison Wireguard:

# ip route delt default # ip route Ajouter Default Dev Wg0 # ip route Ajouter 163.172.161.0/32 via 192.168.1.1 dev eth0 

Cela fonctionne et est relativement simple, mais les démons du DHCP et tels de défaire ce que nous venons de faire, malheureusement.

Remplir l’itinéraire par défaut

Ainsi, au lieu de remplacer l’itinéraire par défaut, nous pouvons simplement le remplacer avec deux règles plus spécifiques qui s’additionnent en somme à la valeur par défaut, mais correspondent avant la valeur par défaut:

# ip Route Ajouter 0.0.0.0/1 dev Wg0 # ip ip route Ajouter 128.0.0.0/1 dev Wg0 # ip ip route Ajouter 163.172.161.0/32 via 192.168.1.1 dev eth0 

De cette façon, nous n’obtimons pas l’itinéraire par défaut. Cela fonctionne également assez bien, cependant, malheureusement lorsque Eth0 monte et descendit, la route explicite pour la démo.givré.com sera oublié, ce qui est ennuyeux.

  Tout tout yify

Routage basé sur les règles

Certaines personnes préfèrent utiliser le routage basé sur les règles et plusieurs tables de routage. La façon dont cela fonctionne est que nous créons une table de routage pour les routes Wireguard et une table de routage pour les itinéraires Internet en texte clair, puis ajouter des règles pour déterminer la table de routage à utiliser pour chacun:

# Règle IP Ajouter à 163.172.161.0 Lookup Main Pref 30 # Règle IP Ajouter à toutes les recherches 80 Préf 40 # Route IP Ajouter le Dev Dev-Dev Wg0 Tableau 80 

Maintenant, nous pouvons séparer les tables de routage. Malheureusement, l’inconvénient est que les règles de point de terminaison explicites doivent encore être ajoutées, et il n’y a pas de nettoyage lorsque l’interface est supprimée, et les règles de routage plus compliquées doivent désormais être dupliquées.

Amélioration du routage basé sur les règles

La solution antérieure repose sur nous en connaissant l’IP explicite du point de terminaison qui devrait être exempté du tunnel, mais les points de terminaison Wireguard peuvent errer, ce qui signifie que cette règle peut devenir périmé. Heureusement, nous sommes en mesure de définir un FWMark sur tous les paquets sortant de la prise UDP de Wireguard, qui sera ensuite exempté du tunnel:

# wg set wg0 fwmark 1234 # ip route Ajouter Default Dev Wg0 Tableau 2468 # Règle IP Ajouter non FWMARK 1234 Table 

Nous définissons d’abord le FWMark sur l’interface et définissons un itinéraire par défaut sur une table de routage alternative. Ensuite, nous indiquons que les paquets qui n’ont pas le FWMark doivent aller à ce tableau de routage alternatif. Et enfin, nous ajoutons une fonctionnalité de commodité pour accéder au réseau local, par lequel nous permettons aux paquets sans le FWMark d’utiliser la table de routage principale, et non la table de routage de l’interface Wire Guélectrique, s’il correspond à des itinéraires avec une longueur de préfixe supérieure à zéro, comme les voies locales non défautes. Ceci est la technique utilisée par l’outil WG-QUICK (8).

Améliorer les solutions classiques

Les auteurs de Wireguard sont intéressés à ajouter une fonctionnalité appelée “notoif” au noyau pour couvrir les cas d’utilisation du tunnel. Cela permettrait aux interfaces de dire “ne acheminez pas ce paquet en utilisant moi-même comme interface, pour éviter la boucle de routage”. Wireguard pourrait ajouter une ligne comme .FlowI4_NOT_OIF = WG0_IDX, et les interfaces basées sur l’espace USERSPACE pourraient définir une option sur leur socket sortante comme SetSockOPT (FD, SO_NOTOIF, TUN0_IDX); . Malheureusement, cela n’a pas encore été fusionné, mais vous pouvez lire le fil LKML ici.

La nouvelle solution d’espace de noms

Il s’avère que nous pouvons acheminer tous. La façon dont cela fonctionne est que nous déplaçons les interfaces qui se connectent à Internet, comme Eth0 ou Wlan0, à un espace de noms (que nous appelons “physique”), puis avons une interface Wireguard être la seule interface dans l’espace de noms “init”.

Nous créons d’abord l’espace de noms de réseau “physique”:

# IP Netns Ajouter le physique 

Maintenant, nous déplacons ETH0 et WLAN0 dans l’espace de noms “physique”:

# lien ip set Eth0 nenss physique # iw phy phy0 set nets nom physique 

(Notez que les appareils sans fil doivent être déplacés à l’aide de IW et en spécifiant le périphérique physique PHY0 .)

Nous avons maintenant ces interfaces dans l’espace de noms “physique”, tout en n’ayant pas d’interfaces dans l’espace de noms “init”:

# IP -N Lien physique 1: LO: MTU 65536 QDISC NOOP Mode Down Group par défaut Par défaut Qlen 1 Lien / Loopback 00: 00: 00: 00: 00: 00 BRD 00: 00: 00: 00: 00: 00 2: eth0: mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default 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 GROUPE DORMANT DEALUX QLEN 1000 LINK / ETher 01: 23: 45: 67: 89: AB BRD FF: FF: FF: FF: FF: FF # Lien IP 1: LO: MTU 65536 QDISC NOqueue State Inconnu Mode Mode Par défaut Par défaut Qlen 1 lien / bouclage 00: 00: 00: 00: 00: 00 BRD 00: 00: 00: 00: 00: 00 

Maintenant, nous ajoutons une interface Wireguard directement à l’espace de noms “physique”:

# lien physique IP -N Ajouter Wg0 Type Wire Guad Guil 

L’espace de noms en lieu de naissance de WG0 est désormais l’espace de noms “physique”, ce qui signifie que les prises UDP de texte chiffré seront affectées à des appareils comme Eth0 et Wlan0 . Nous pouvons maintenant déplacer WG0 dans l’espace de noms “init”; Il se souviendra toujours de son lieu de naissance pour les prises, cependant.

# ip -n lien physique définir wg0 nets 1 

Nous spécifions “1” comme espace de noms “init”, car c’est le PID du premier processus sur le système. Maintenant, l’espace de noms “init” a le périphérique WG0:

# IP Link 1: LO: MTU 65536 QDISC NOqueue State Mode inconnu Groupe par défaut par défaut Qlen 1 Lien / Loopback 00: 00: 00: 00: 00: 00 BRD 00: 00: 00: 00: 00: 00 17: WG0: MTU 1423 QDISC NOqueue State Mode inconnu Groupe Par défaut Par défaut Qlen 1 Lien / Aucun 

Nous pouvons désormais configurer les appareils physiques à l’aide des outils ordinaires, mais nous les lançons dans l’espace de noms de réseau “physique”:

# IP Netns Exec Physical dhcpcd wlan0 # ip netns exec physique wpa_supplicant -iwlan0 -c / etc / wpa_supplicant / wpa_supplicant.Conf # ip -n addr physique ajouter 192.168.12.52/24 DEV ETH0 

Et ainsi de suite. Enfin, nous pouvons configurer l’interface WG0 comme d’habitude et le définir comme l’itinéraire par défaut:

# wg setconf wg0 / etc / wireguard / wg0.conf # ip addr ajouter 10.2.4.5/32 DEV WG0 # lien IP SET WG0 UP # ip Route Ajouter Default Dev Wg0 

Fini! À ce stade, tous les processus ordinaires du système achemineront leurs paquets via l’espace de noms “init”, qui ne contient que l’interface WG0 et les routes WG0. Cependant, WG0 a sa prise UDP vivant dans l’espace de noms “physique”, ce qui signifie qu’il enverra le trafic de Eth0 ou WLAN0 . Les processus normaux ne seront même pas conscients de Eth0 ou Wlan0, à l’exception de DHCPCD et WPA_SUPPLICANT, qui ont été engendrés à l’intérieur de l’espace de noms “physique”.

  Servidores NordVPN DNS

Parfois, cependant, vous voudrez peut-être ouvrir une page Web ou faire quelque chose rapidement en utilisant l’espace de noms “physique”. Par exemple, vous prévoyez peut-être d’acheter tout votre trafic via Wireguard comme d’habitude, mais le café où vous êtes assis vous oblige à vous authentifier à l’aide d’un site Web avant qu’il ne vous donne un vrai lien Internet. Ainsi, vous pouvez exécuter des processus sélectionnés (en tant qu’utilisateur local) à l’aide de l’interface “physique”:

$ sudo -e ip nens exec physique sudo -e -u \ # $ (id -u) -g \ # $ (id -g) chrome 

Bien sûr, cela pourrait être transformé en une belle fonction pour .Bashrc:

phySexec ()

Et maintenant, vous pouvez écrire ce qui suit pour l’ouverture du chrome dans l’espace de noms “physique”.

$ chrome physexec 

Lorsque vous avez fini de vous connecter au réseau de café, demenez un navigateur comme d’habitude et surfez calmement en sachant que tout votre trafic est protégé par Wireguard:

$ chrome 

Exemple de script

L’exemple de script suivant peut être enregistré en tant que / usr / local / bin / wgphys et utilisé pour des commandes comme WGPHYS UP, WGPHYS Down et WGPHYS Exec:

#!/ bac / bash set -ex [[$ uid != 0]] && exec sudo -e "$ (readLink -f "0 $")" "$ @" en haut() < 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 >vers le bas() < 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)> -- "$ @" > Command ="1 $" changement cas "$ Command" dans haut Haut "$ @" ;; bas bas "$ @" ;; exec) execi "$ @" ;; *) écho "Usage: 0 $ up | down | exec " > & 2; sortie 1 ;; ESAC 

Une petite démo de ce qui précède:

© Copyright 2015-2022 Jason A. Donenfeld. Tous droits réservés. “Wireguard” et le logo “Wireguard” sont des marques enregistrées de Jason A. Donenfeld.

Ce projet provient de ZX2C4 et de Edge Security, une entreprise consacrée à l’expertise de recherche sur la sécurité de l’information.

Wireguard VPN – dépannage

Il peut être utile de laisser un terminal ouvert avec la commande wg watch. Voici un exemple de sortie montrant un système avec deux pairs configurés, où un seul a établi le VPN jusqu’à présent:

Tous les 2.0S: WG J-WG: Ven 26 août 17:44:37 2022 Interface: Wg0 Clé public: + T3T3HTMEYREDVIM8FBXBYJBZ + / POEOTG3RLVL9KJMM = PRIVÉE: (Hidden) Port d'écoute: 51000 PEER: 2CJDFCNZXV4YYGYDTAHTAHTAFRBSRFSCCY 10.172.196.106: 51000 IPS autorisés: 10.dix.11.2/32 Dernière poignée de main: 3 heures, 27 minutes, 35 secondes Transfert: 3.06 Kib reçu, 2.80 kib envoyé pair: zliz1hlarzqvfxpmyme2ectxdk611nb7uzlad4mcpgi = IPS autorisé: 10.dix.11.3/32 

Messages de débogage du noyau

Wireguard est également silencieux en matière de journalisation. Étant essentiellement un module de noyau, nous devons explicitement activer l’exploitation verbeuse de son module. Cela se fait avec la commande suivante:

$ echo "module wireguard + p" | Sudo Tee / Sys / Kernel / Debug / Dynamic_debug / Control 

Cela écrira des messages de journalisation Wireguard au journal du noyau, qui peut être regardé en direct avec:

$ sudo dmesg -wt 

Pour désactiver la journalisation, exécutez ceci:

$ echo "module wireguard -p" | Sudo Tee / Sys / Kernel / Debug / Dynamic_debug / Control 

Adresse de destination requise

Si vous cinglez une IP et récupérez une erreur comme ceci:

$ ping 10.dix.11.2 ping 10.dix.11.2 (10.dix.11.2) 56 (84) octets de données. À partir de 10.dix.11.1 ICMP_SEQ = 1 Hôte de destination Ping inaccessible: SendMsg: Adresse de destination requise 

Cela se produit parce que l’interface Wireguard sélectionnée pour cette destination ne connaît pas le point de terminaison pour cela. En d’autres termes, il ne sait pas où envoyer le trafic crypté.

Un scénario commun pour cela est sur un pair où il n’y a pas de configuration de point de terminaison, qui est parfaitement valide, et l’hôte essaie d’envoyer du trafic à ce pair. Prenons le scénario du café que nous avons décrit plus tôt comme un exemple.

L’ordinateur portable est connecté au VPN et échangeant le trafic comme d’habitude. Ensuite, ça s’arrête un peu (la personne est allée chercher une tasse de plus). Le trafic cesse (Wireguard est silencieux, rappelez-vous). Si le gibier de fil sur le routeur d’origine est maintenant redémarré, à l’époque, il ne saura pas comment atteindre l’ordinateur portable, car il n’a jamais été contacté auparavant. Cela signifie qu’à l’heure actuelle, si le routeur domestique essaie d’envoyer du trafic à l’ordinateur portable dans le café, il obtiendra l’erreur ci-dessus.

Maintenant, l’utilisateur de l’ordinateur portable revient et génère un peu de trafic vers le réseau domestique (rappelez-vous: l’ordinateur portable a la valeur de point de terminaison du réseau domestique). Le VPN «se réveille», les données sont échangées, les poignées de main terminées et maintenant le routeur domestique connaît le point de terminaison associé à l’ordinateur portable et peut à nouveau y accéder un nouveau trafic sans problèmes.

Une autre possibilité est que l’un des pairs est derrière un NAT, et il n’y avait pas assez de trafic pour que le pare-feu avec état considère la «connexion» vivante, et il a abandonné la cartographie NAT qu’elle avait. Dans ce cas, le pair pourrait bénéficier de la configuration persistante de la Gardien rester en vie sonder toutes les deux secondes.

Clé requise non disponible

$ ping 10.dix.11.1 ping 10.dix.11.1 (10.dix.11.1) 56 (84) octets de données. À partir de 10.dix.11.2 ICMP_SEQ = 1 Hôte de destination Ping inaccessible: SendMsg: clé requise non disponible 

Peut se produire lorsque vous avez un trafic d’itinéraire vers l’interface Wireguard, mais cette interface n’a pas l’adresse cible répertoriée dans sa configuration ALLOLIPS.

Si vous avez activé le débogage du noyau pour Wireguard, vous verrez également un message comme celui-ci dans la sortie DMESG:

Wireguard: Home0: Aucun pair n'a permis à IPS correspondant à 10.dix.11.1