Linux

Wireguard 作為虛擬機橋接,在 VPN 上不可見虛擬機管理程序

  • September 14, 2019

我正在嘗試通過網際網路將兩個管理程序連接在一起。兩個管理程序都執行 KVM 進行虛擬化,我手動為 VM 網路創建了網橋,目前可以使用。

我想使用 Wireguard 連接這兩個虛擬機管理程序上的虛擬機橋接器,以便虛擬機可以從一個虛擬機管理程序遷移到另一個虛擬機管理程序,而虛擬機本身沒有任何路由/網路更改。

不過,在開始之前,我意識到我不知道如何設置 Wireguard,以使兩個管理程序上的網橋對另一個管理程序可見,但管理程序本身不會出現在 VPN 上,因此虛擬機無法直接連接/攻擊管理程序。

Wireguard 能夠做到這一點嗎?或者由於 Wireguard 在 OSI 堆棧而不是乙太網幀級別上的工作方式,這是不可能的?

誰能說出是否可以使用 Wireguard 來“盲目地”橋接兩個網路?還是主機也總是出現在網路上?其他一些 VPN 解決方案會允許這樣做嗎?或者我最好使用防火牆來鎖定我不想被訪問的主機?

提前致謝!

Wireguard 在第 3 層(路由 IP 數據包)工作,而網橋在第 2 層(交換乙太網幀)工作。所以wireguard不能這樣做。這個問題已經被問過,並且wireguard的作者在wireguard的郵件列表中做出了回答:Bridging wg and normal interfaces?.

所以在通過wireguard之前需要一個額外的封裝層。我確信有多種選擇(其中VXLAN在Linux上也可用)。

我使用GRETAP和命名空間(而不是實際的管理程序和虛擬機)做了一個範例。我發現,為了避免強製本地 VM 流量具有比可能的更有限的數據包大小,需要進行分段處理,但GRETAP有一些限制,如下所述:GRE 橋接、IPsec 和 NFQUEUE我選擇使用nftables 的有效負載修飾而不是 NFQUEUE 和使用者空間來解決它。

另請注意,RFC 6864解釋說,由於 IP ID 欄位的限制,分段數據包大部分時間應限制為 6.4Mbp/s,現在速度很慢,但通過具有強完整性檢查的隧道,可以放鬆它。

在這裡,(假)虛擬機通過網橋連結,沒有其他連接。除了他們自己,他們看不到其他任何東西:他們看不到使用 gretap+wireguard 連結兩個網橋的(假)管理程序。只需執行這個創建和配置多個命名空間的 bash 腳本。使用 nftables 0.9.2 和核心 5.2.x 進行測試。

#!/bin/bash

if ip netns id | grep -qv '^ *$' ; then
   printf 'ERROR: leave netns "%s" first\n' $(ip netns id) >&2
   exit 1
fi

hosts='vm11 vm12 hyp1 router hyp2 vm21 vm22'

for ns in $hosts; do
   ip netns del $ns 2>/dev/null || :
   ip netns add $ns
   ip netns exec $ns sysctl -q -w net.ipv6.conf.default.disable_ipv6=1
   ip netns exec $ns sysctl -q -w net.ipv4.icmp_echo_ignore_broadcasts=0
done

for ns in $hosts; do
   ip -n $ns link set lo up
done

link_ns () {
   ip -n $1 link add name "$3" type veth peer netns $2 name "$4"
   ip -n $1 link set dev "$3" up
   ip -n $2 link set dev "$4" up
}

for h in 1 2; do
   ip -n hyp$h link add bridge0 address 02:00:00:00:00:0$h type bridge
   ip -n hyp$h link set bridge0 up
   for n in 1 2; do
       link_ns vm$h$n hyp$h eth0 port$n
       ip -n hyp$h link set dev port$n master bridge0
       ip -n vm$h$n address add 10.0.$h.$n/16 dev eth0
   done
   link_ns hyp$h router eth0 site$h
done

ip -n router address add 192.0.2.1/24 dev site1
ip -n router address add 198.51.100.1/24 dev site2

ip -n hyp1 address add 192.0.2.100/24 dev eth0
ip -n hyp1 route add default via 192.0.2.1

ip -n hyp2 address add 198.51.100.200/24 dev eth0
ip -n hyp2 route add default via 198.51.100.1

privkey1=$(wg genkey)
privkey2=$(wg genkey)

pubkey1=$(printf '%s' "$privkey1" | wg pubkey)
pubkey2=$(printf '%s' "$privkey2" | wg pubkey)

for h in 1 2; do
   ip -n hyp$h link add name wg0 type wireguard
   ip -n hyp$h address add 10.100.0.$h/24 dev wg0
   ip -n hyp$h link set dev wg0 up
done

ip netns exec hyp1 wg set wg0 private-key <(printf '%s' "$privkey1") listen-port 11111 peer "$pubkey2" endpoint 198.51.100.200:22222 allowed-ips 10.100.0.2
ip netns exec hyp2 wg set wg0 private-key <(printf '%s' "$privkey2") listen-port 22222 peer "$pubkey1" endpoint 192.0.2.100:11111 allowed-ips 10.100.0.1

for h in 1 2; do
   ip -n hyp$h link add name gt0 mtu 1500 type gretap remote 10.100.0.$((3-$h)) local 10.100.0.$h nopmtud
   ip -n hyp$h link set gt0 master bridge0
   ip -n hyp$h link set gt0 up
   ip netns exec hyp$h nft -f /dev/stdin << EOF
table ip filter {
   chain output {
       type filter hook output priority 0; policy accept;
       ip protocol gre ip saddr 10.100.0.$h ip daddr 10.100.0.$((3-$h)) ip frag-off set ip frag-off & 0xbfff counter
   }
}
EOF
done

範例(來自遠端端的延遲更大):

# ip netns exec vm11 ping -b 10.0.255.255
WARNING: pinging broadcast address
PING 10.0.255.255 (10.0.255.255) 56(84) bytes of data.
64 bytes from 10.0.1.1: icmp_seq=1 ttl=64 time=0.048 ms
64 bytes from 10.0.1.2: icmp_seq=1 ttl=64 time=0.194 ms (DUP!)
64 bytes from 10.0.2.2: icmp_seq=1 ttl=64 time=0.646 ms (DUP!)
64 bytes from 10.0.2.1: icmp_seq=1 ttl=64 time=0.685 ms (DUP!)
64 bytes from 10.0.1.1: icmp_seq=2 ttl=64 time=0.059 ms
64 bytes from 10.0.1.2: icmp_seq=2 ttl=64 time=0.154 ms (DUP!)
64 bytes from 10.0.2.2: icmp_seq=2 ttl=64 time=0.476 ms (DUP!)
64 bytes from 10.0.2.1: icmp_seq=2 ttl=64 time=0.490 ms (DUP!)
^C
--- 10.0.255.255 ping statistics ---
2 packets transmitted, 2 received, +6 duplicates, 0% packet loss, time 1050ms
rtt min/avg/max/mdev = 0.048/0.344/0.685/0.243 ms

引用自:https://serverfault.com/questions/982403