如何與命名空間共享wireguard?
我
wg0
在 $DAYJOB 的管理網路中與受信任的機器有一個線衛連接(介面名稱)。通常,我不想將 wg0 用於所有流量,僅用於 172.16.0.0/12 範圍內的 IP 地址。這很容易通過如下節來完成/etc/wireguard/wg0.conf
:[Peer] # ... AllowedIPs = 172.16.0.0/12
但是對於一個 Firefox 配置文件,我確實希望通過 wg0 路由所有內容,即使流量不是發往 172.16.0.0/12。此外,對於 DNS,我通常使用 dnscrypt-proxy + dnsmasq,但對於 wg0 流量,我想在 $DAYJOB 使用名稱伺服器。
通過使用 veth 對創建網路命名空間,我幾乎可以匹配這些約束。
ip netns
在命名空間內,只需將我的預設 resolv.conf 替換為包含備用名稱伺服器的文件。唯一的問題是我還沒有完全弄清楚如何使用 wg0 作為數據包離開命名空間的唯一方式。
- 使用的非預設 DNS:✓
- 來自命名空間的發往 172.16.0.0/12 的流量通過 wg0 正確路由:✓
- 退出命名空間的所有其他流量也通過 wg0:✗
Wireguard 有與 netns 相關的文件,但似乎假設您仍然不需要命名空間之外的 wireguard 介面。我確實希望命名空間之外的所有東西仍然可以訪問wireguard介面。
一些來源,例如1,建議使用 vlan 進行類似的操作。但是,wireguard 介面似乎不支持 vlan。這是發生的事情:
$ sudo ip link add link wg0 name wg0.4 type vlan id 4 $ sudo ip netns add ns-wg-test-1 $ sudo ip link set wg0.4 netns ns-wg-test-1 $ sudo ip netns exec ns-wg-test-1 su -c "/bin/bash -l" $USER $ sudo ip addr add 192.168.126.2 dev wg0.4 $ sudo ip link set dev wg0.4 up RTNETLINK answers: Cannot assign requested address
所以現在我在各種都有問題的替代方法之間模棱兩可。
可能性1:添加第二個wireguard介面。這將需要在
/etc/wireguard/wg1.conf
. 目前尚不清楚這是否可行或一個好主意。擁有多個wireguard介面和冗餘配置似乎不優雅。**可能性 2:**添加一些組合
ip route
和iptables -A
規則以強制退出命名空間的所有內容然後被引導到 wg0。但是,**我沒有遇到任何範例或文件來說明如何強制從一個介面傳入的所有流量的路由通過另一個介面傳出。**再說一次,我對這甚至是一個好方法持一定的懷疑態度。**可能性 3:**對wireguard 文件有信心。將 wg0 放在命名空間內,並告訴命名空間外的所有 172.16.0.0/12 流量通過連接到命名空間的 veth 對。在命名空間內,可能有路由/防火牆規則將所有從 veth 對轉發到 wg0。這個解決方案的問題在於,即使它有效,它也要求命名空間始終處於活動狀態。我希望發往 172.16.0.0/12 的流量總能找到通往 wg0 的路,無論我今天早上是否記得啟動命名空間。
所以問題是:什麼是最好或最規範的方式來與網路命名空間共享一個wireguard介面,同時仍然保留對命名空間之外的wireguard的訪問?
這不是基於意見的。當我看到一個健壯、高效、安全且可編寫腳本的工作範例時,我就會知道答案是正確的。它不需要是跨平台的。我只在 Void Linux(或者有時是 Arch Linux)上這樣做。
或者,如果整個企業不是一個好主意,或者由於某種原因不可能,否定答案可能包括論據、證據和引用來解釋原因。如果沒有更好的結果,我仍然會將其標記為正確。
所以問題是:什麼是最好或最規範的方式來與網路命名空間共享一個wireguard介面,同時仍然保留對命名空間之外的wireguard的訪問?
IMO,一個好的方法是為此使用基於策略的路由。例如,“來自介面 A 的任何數據包都應使用路由表 B”,其中介面 A 是 netns 之外的 veth/bridge 介面,而路由表 B 僅包含通過您的 wireguard 介面的路由(當然還有返回原始網路的路由命名空間)。使用
iproute2
, 一些類似的東西:# echo "100 dayjob" >> /etc/iproute2/rt_tables # ip route add <wireguard glue net> dev wg0 table dayjob # ip route add default via <wireguard gw> dev wg0 table dayjob # ip route add <netns net> dev <veth/bridge interface> table dayjob # ip rule add iif <veth/bridge interface> lookup table dayjob