Wireguard VPN-故障排除

接下來,我們在“ init”(原始)命名空間中創建一個線蟲接口:

Torguards IP檢查器

像所有Linux網絡接口一樣,VireGuard集成到網絡名稱空間基礎架構中. 這意味著管理員可以擁有幾個完全不同的網絡子系統,並選擇每個接口都存在.

Wineguard做了很有趣的事情. 當創建了VireGuard接口(使用IP鏈接添加WG0類型WireGuard)時,它記得創建的名稱空間. “我是在命名空間中創建的.“以後,可以將Wineguard移至新名稱空間(“我正在移動到名稱空間B.”),但它仍然會記住它起源於命名空間.

Wineguard使用UDP插座實際發送和接收加密數據包. 這個插座 總是生活在命名空間 – 原始的出生地名稱空間. 這允許一些非常酷的屬性. 也就是說,您可以在一個名稱空間(a)中創建VireGuard接口,將其移至另一個名稱空間(b),並具有從名稱空間B發送的clearText數據包,該數據包通過命名空間中的UDP插座發送發送。.

(請注意,通過在一個名稱空間中創建套接字文件描述符,在更改為另一個命名空間並將文件描述符從先前的命名空間打開之前,請在一個名稱空間中創建套接字文件描述符,可用於基於用戶空間的接口,可以使用相同的技術。.)

這打開了一些非常好的可能性.

普通容器化

最明顯的用法是給予容器(例如Docker容器),將其作為唯一接口.

容器#ip addr 1:lo:mtu 65536 qdisc noqueue狀態未知組默認qlen 1鏈接/loopback 00:00:00:00:00:00:00:00 BRD 00:00:00:00:00:00:00 :00:00:00:00 INET 127 INET 127 INET 127.0.0.1/8示波器主機lo valif_lft永遠preferred_lft永遠17:WG0:MTU 1423 QDISC NOQUEUE狀態未知組默認QLEN 1鏈接/無INET 192.168.4.33/32範圍全局wg0有效_lft永遠preferred_lft永遠 

在這裡,訪問網絡可能的唯一方法是通過WG0,Vireguard接口.

完成這樣的設置的方法如下:

首先,我們創建稱為“容器”的網絡名稱空間:

#IP NETN添加容器 

接下來,我們在“ init”(原始)命名空間中創建一個線蟲接口:

#IP鏈接添加WG0類型Wineguard 

最後,我們將界面移至新名稱空間:

#IP鏈接集WG0 NETN容器 

現在,我們可以照常配置WG0,除非我們在這樣做時指定其新名稱空間:

#IP -N容器ADDR添加192.168.4.33/32開發WG0#IP Netns Exec Container WG SetConf WG0/etc/wireguard/wg0.conf#ip -ip -n容器鏈接集wg0 up#ip -n容器路由添加默認DEV WG0 

瞧,現在訪問“容器”網絡資源的唯一方法將通過WireGuard接口.

請注意,Docker用戶可以指定Docker進程的PID,而不是網絡名稱空間名稱,以使用Docker已經為其容器創建的網絡名稱空間:

#IP鏈接集WG0 Netns 879 

路由所有流量

不太明顯的用法,但強大的用法是使用這款Vireguard的特徵來重定向您的所有普通Internet流量通過Winebuard進行. 但是首先,讓我們回顧一下這樣做的舊通常解決方案:

經典解決方案

經典解決方案依賴於不同類型的路由表配置. 對於所有這些,我們需要為實際的線蟲端點設置一些明確的路線. 對於這些示例,讓我們假設Vireguard端點是演示.線人.com,截至寫作時,它將解決至163.172.161.0 . 此外,假設我們通常使用ETH0和192的經典網關連接到Internet.168.1.1 .

更換默認路線

最直接的技術是僅替換默認路由,但為Wineguard端點添加一個明確的規則:

#ip路由del def#ip路由添加默認DEV WG0#IP路由添加163.172.161.0/32通過192.168.1.1 dev eth0 

這起作用,相對簡單,但是DHCP守護程序,不幸地撤消了我們剛剛做的事情,不幸的是.

覆蓋默認路線

因此,我們可以使用默認的兩個特定規則將其覆蓋為默認值,但在默認情況下匹配:

#IP路由添加0.0.0.0/1開發WG0#IP路由添加128.0.0.0/1開發WG0#IP路由添加163.172.161.0/32通過192.168.1.1 dev eth0 

這樣,我們就不會駛入默認路線. 不過,這也很好,不幸的是,當Eth0上下移動時,演示的明確路線.線人.com將被遺忘,這很煩人.

基於規則的路由

有些人更喜歡使用基於規則的路由和多個路由表. 此工作的方式是,我們為線路路由創建一個路由表,以及一個用於明文Internet路由的路由表,然後添加規則以確定每個路由表:

#IP規則添加到163.172.161.0查找主PREF 30#IP規則添加到所有查找80 PROF 40#IP路由添加默認DEV WG0表80 

現在,我們能夠將路由表分開. 不幸的是,缺點是仍然需要添加明確的端點規則,並且刪除界面時沒有清理,並且現在需要重複更複雜的路由規則.

改進的基於規則的路由

先前的解決方案依賴於我們知道應免於隧道的明確端點IP,但是線guard端點可以漫遊,這意味著此規則可能會過時. 幸運的是,我們能夠在Wineguard的UDP插座上的所有數據包上設置一個FWMark,然後將其免於隧道:

#wg設置WG0 FWMARK 1234#IP路由添加默認DEV WG0表2468#IP規則添加不添加FWMark 1234表2468#IP規則添加表MAIN PUSS_PRESS_PREFIXLENGTH 0 

我們首先在接口上設置FWMark,並在替代路由表上設置默認路由. 然後我們表明沒有FWMark的數據包應轉到此替代路由表. 最後,我們添加了一個方便功能,用於仍訪問本地網絡,如果沒有FWMark的數據包,則可以使用主路由表,而不是Vireguard Interface的路由表,如果它匹配其前綴長度大於零的前綴長度,例如非默認本地路線. 這是WG-Quick(8)工具使用的技術.

改善經典解決方案

Wineguard作者有興趣在內核中添加一個名為“ notoif”的功能以覆蓋隧道用例. 這將允許接口說“不要以自己為界面路由此數據包,以避免路由循環”. Wineguard將能夠添加像 .flowi4_not_oif = wg0_idx,基於userpace tun的接口將能夠在其傳出插座上設置一個選項,例如setSockopt(fd,so_notoif,tun0_idx); . 不幸的是,這尚未合併,但是您可以在這裡閱讀LKML線程.

新名稱空間解決方案

事實證明,我們可以使用網絡名稱空間通過WireGuard來路由所有Internet流量,而不是經典的路由表hacks. 這種工作的方式是,我們將連接到Internet(例如ETH0或WLAN0)的接口移動到名稱空間(我們稱為“物理”),然後具有“ INIT”名稱空間中的VireGuard接口是唯一的接口.

首先,我們創建“物理”網絡名稱空間:

#IP Netn添加物理 

現在,我們將ETH0和WLAN0移至“物理”名稱空間:

#ip鏈接集ETH0 NETNS物理#IW PHY PHY0集Netns Netn名稱物理 

(請注意,必須使用IW並指定物理設備PHY0進行無線設備 .)

現在,我們在“物理”名稱空間中具有這些接口,而“ init”名稱空間中沒有接口:

# ip -n physical link 1: lo: mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: ETH0:MTU 1500 QDISC PFIFO_FAST狀態下模式默認組默認組默認QLEN 1000鏈接/Ether AB:CD:EF:G1:23:45 BRD FF:FF:FF:FF:FF:FF:FF:FF:FF:FF :FF:FF:WLAN0:MTU 1500 QDIS QDISC MQ MQ State up Up Up模式休眠組默認QLEN 1000鏈接/以太01:23:45:67:89:AB BRD FF:FF:FF:FF:FF:FF: FF:FF#IP鏈接1:LO:MTU 65536 QDISC NOCEQUEUE狀態default default default默認QLEN 1鏈接/循環00:00:00:00:00:00 BRD 00:00:00:00:00:00:00: 00 

現在,我們直接在“物理”名稱空間中添加了一個線guard接口:

#IP -N物理鏈接添加WG0類型Wireguard 

WG0的出生地名稱空間現在是“物理”名稱空間,這意味著Ciphertext UDP插座將分配給ETH0和WLAN0等設備 . 現在,我們可以將WG0移至“ Init”名稱空間中;它仍然會記住其插座的發源地.

#IP -N物理鏈接集WG0 NETN 1 

我們將“ 1”指定為“ init”名稱空間,因為這是系統上第一個過程的pid. 現在,“ init”名稱空間具有WG0設備:

#IP鏈接1:LO:MTU 65536 QDISC NOQUEUE狀態未知模式默認組默認組1鏈接/loopback 00:00:00:00:00:00:00:00 BRD 00:00:00:00:00:00: 00:00:00:00 17:wg0:mtu 1423 qdisc noqueue狀態未知模式默認組默認qlen 1鏈接/無 

現在,我們可以使用普通工具配置物理設備,但是我們在“物理”網絡名稱空間中啟動它們:

#ip netns exec exect dhcpcd wlan0#ip netns exec exect yterhy wpa_supplicant -iwlan0 -c/etc/etc/wpa_supplicant/wpa_supplicant.conf#ip -n物理addr添加192.168.12.52/24 DEV ETH0 

等等. 最後,我們可以像通常一樣配置WG0接口,並將其設置為默認路由:

#wg setConf WG0/etc/vireguard/wg0.conf#ip addr添加10.2.4.5/32 DEV WG0#IP鏈接SET wg0 up up#ip路由添加默認DEV WG0 

完成的! 此時,系統上的所有普通過程都將通過“ init”名稱空間路由數據包,該名稱空間僅包含WG0接口和WG0路由. 但是,WG0的UDP插座居住在“物理”名稱空間中,這意味著它將從ETH0或WLAN0發送流量 . 正常過程甚至都不知道ETH0或WLAN0,除了DHCPCD和WPA_SUPPLICANT,它們是在“物理”名稱空間中產生的.

但是,有時,您可能想打開一個網頁或使用“物理”名稱空間快速做某事. 例如,也許您打算像往常一樣通過Vireguard將所有流量路由,但是您坐在的咖啡店需要您使用網站進行身份驗證,然後才能為您提供真正的互聯網鏈接. 因此,您可以使用“物理”接口執行選擇過程(作為本地用戶):

$ sudo -e ip netns exec helphys sudo -e -u \#$(id -u)-g \#$(id -g)鉻 

當然,這可以成為一個很好的功能 .Bashrc:

physexec()

現在,您可以在“物理”名稱空間中編寫以下內容以打開鉻.

$ physexec鉻 

當您完成登錄咖啡店網絡時,像往常一樣播放瀏覽器,然後清楚地衝浪知道您的所有流量都受到Wineguard的保護:

$鉻 

示例腳本

以下示例腳本可以保存為/usr/local/bin/wgphys,並用於諸如wgphys up,wgphys down和wgphys exec之類的命令:

#!/bin/bash set -ex [[$ uid != 0]] && exec sudo -e $(readlink -f $ 0 $@ 向上() < 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 >向下() < 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> -- $@ >命令=$ 1 轉移 案件 $命令  向上) $@ ;向下) $@ ; exec)execi $@ ; *)迴聲 “用法: $ 0 向上| down | exec” >&2;出口1 ;; ESAC 

以上的一個小演示:

©版權所有2015-2022 Jason A. 多嫩菲爾德. 版權所有. “ Vireguard”和“ Vireguard”徽標是Jason A的註冊商標. 多嫩菲爾德.

該項目來自ZX2C4和Edge Security,這是一家致力於信息安全研究專業知識的公司.

Wireguard VPN-故障排除

通過手錶WG命令,將終端打開可能會有所幫助. 這是一個示例輸出,顯示了一個配置兩個對等的系統,到目前為止,只有一個已經建立了VPN:

每2個.0S:WG J-WG:星期五8月26日17:44:37 2022接口:wg0公共密鑰: +t3t3htmeyredvim8fbxbyjbz +/poeotg3rlvl9kjmm = private key = private key = private key :(隱藏) 10.172.196.106:51000允許的IP:10.10.11.2/32最新握手:3小時27分鐘35秒前轉移:3.06 KIB收到,2.80 KIB發送對等:Zliz1HlarzqvfxpMyme2ectxdk611nb7uzlad4Mcpgi =允許IPS:10.10.11.3/32 

內核調試消息

在登錄方面,Wireguard也保持沉默. 本質上,作為一個內核模塊,我們需要明確啟用其模塊的詳細記錄. 這是通過以下命令完成的:

$ ECHO“模塊Wineguard +P” | sudo Tee/sys/kernel/debug/dynamic_debug/control 

這將在內核日誌上寫下WireGuard記錄消息,可以與之進行現場觀看:

$ sudo dmesg -wt 

要禁用日誌記錄,請運行以下操作:

$ ECHO“模塊Wineguard -P” | sudo Tee/sys/kernel/debug/dynamic_debug/control 

需要地址

如果您ping ip並收回這樣的錯誤:

$ ping 10.10.11.2 ping 10.10.11.2(10.10.11.2)56(84)數據. 從10開始.10.11.1 ICMP_SEQ = 1目標主機無法到達的ping:sendmsg:所需的目標地址 

發生這種情況是因為為此目的地選擇的線蟲接口不知道它的端點. 換句話說,它不知道在哪裡發送加密流量.

一個常見的情況是在沒有端點配置的對等方面,這是完全有效的,主機試圖將流量發送到該對等. 讓我們以咖啡店的場景為例.

筆記本電腦連接到VPN並照常交換流量. 然後它停止了一會兒(那個人去了一個杯子). 交通不止. 如果現在重新啟動家用路由器上的鋼絲員,那麼恢復後,它將不知道如何到達筆記本電腦,因為以前從未與之聯繫. 這意味著此時,如果家庭路由器試圖將流量發送到咖啡店的筆記本電腦,則會遇到上述錯誤.

現在,筆記本電腦用戶返回,並為家庭網絡生成一些流量(請記住:筆記本電腦具有家庭網絡的端點值). VPN“醒來”,數據已交換,握手完成,現在家用路由器知道與筆記本電腦相關的端點,並且可以再次啟動新的流量而沒有問題.

另一種可能性是,其中一個同齡人是NAT的背後,並且沒有足夠的交通供州的防火牆考慮“連接”活著,並且它丟棄了它的NAT映射. 在這種情況下,同伴可能會受益於持久性的配置,這使Vireguard發送 活著 每秒鐘探測一次.

必需的密鑰不可用

$ ping 10.10.11.1 ping 10.10.11.1(10.10.11.1)56(84)數據. 從10開始.10.11.2 ICMP_SEQ = 1目標主機無法到達的ping:sendmsg:必需的密鑰不可用 

當您有將流量引導到Vireguard接口時,可能會發生,但是該接口沒有其允許的配置中列出的目標地址.

如果您已啟用了Vineguard的內核調試,則還將在DMESG輸出中看到這樣的消息:

Wineguard:Home0:沒有同行允許IPS匹配10.10.11.1