從 OpenVPN 遷移到 WireGuard 以將網絡整合為一個 L2 網絡

從 OpenVPN 遷移到 WireGuard 以將網絡整合為一個 L2 網絡

我想分享一下我將三個地理位置遙遠的公寓的網絡組合成一個公共網絡的經驗,每個公寓都使用帶有 OpenWRT 作為網關的路由器。 當選擇一種方法將 L3 與子網路由和 L2 與橋接之間的網絡結合起來時,當所有網絡節點都在同一子網中時,優先選擇第二種方法,這種方法更難配置,但提供更多機會,因為透明在創建的網絡 Wake-on-Lan 和 DLNA 中計劃使用技術。

第 1 部分:背景

OpenVPN 最初被選為執行此任務的協議,因為首先,它可以創建一個可以毫無問題地添加到網橋的分路器設備,其次,OpenVPN 支持通過 TCP 協議進行操作,這也很重要,因為所有公寓都沒有專用 IP 地址,我無法使用 STUN,因為出於某種原因,我的 ISP 阻止了來自他們網絡的傳入 UDP 連接,而 TCP 協議允許我使用 SSH 轉發租用 VPS 上的 VPN 服務器端口。 是的,這種方法帶來了很大的負擔,因為數據被加密了兩次,但我不想將 VPS 引入我的私有網絡,因為仍然存在第三方控制它的風險,因此,有這樣一個家庭網絡上的設備是非常不受歡迎的,因此決定為安全支付高昂的開銷。

為了在計劃部署服務器的路由器上轉發端口,使用了 sshtunnel 程序。 我不會描述其配置的複雜性 - 這很容易完成,我只是注意到它的任務是將 TCP 端口 1194 從路由器轉發到 VPS。 接下來,在連接到 br-lan 網橋的 tap0 設備上配置 OpenVPN 服務器。 從筆記本電腦檢查到新創建的服務器的連接後,很明顯端口轉發的想法是合理的,我的筆記本電腦成為路由器網絡的成員,儘管它實際上並不在其中。

事情仍然很小:有必要在不同的公寓中分配 IP 地址,以免它們發生衝突,並將路由器配置為 OpenVPN 客戶端。
選擇了以下路由器 IP 地址和 DHCP 服務器範圍:

  • 192.168.10.1 有範圍 192.168.10.2 - 192.168.10.80 對於服務器
  • 192.168.10.100 有範圍 192.168.10.101 - 192.168.10.149 2號公寓的路由器
  • 192.168.10.150 有範圍 192.168.10.151 - 192.168.10.199 3號公寓的路由器

還需要通過將以下行添加到其配置中,將這些地址準確分配給 OpenVPN 服務器的客戶端路由器:

ifconfig-pool-persist /etc/openvpn/ipp.txt 0

並將以下行添加到 /etc/openvpn/ipp.txt 文件:

flat1_id 192.168.10.100
flat2_id 192.168.10.150

其中 flat1_id 和 flat2_id 是生成連接到 OpenVPN 的證書時指定的設備名稱

接下來,在路由器上配置 OpenVPN 客戶端,將兩者上的 tap0 設備添加到 br-lan 網橋。 在這個階段,一切似乎都井井有條,因為所有三個網絡都相互看到並作為一個整體工作。 然而,結果卻出現了一個不太令人愉快的細節:有時設備可能會獲得一個不是來自其路由器的 IP 地址,這會帶來所有隨之而來的後果。 由於某種原因,其中一間公寓中的路由器沒有時間及時響應 DHCPDISCOVER,設備收到了錯誤的地址。 我意識到我需要在每個路由器的 tap0 中過濾此類請求,但事實證明,如果設備是網橋的一部分,則 iptables 無法與該設備一起使用,而 ebtables 應該來拯救我。 遺憾的是,它不在我的固件中,我不得不為每台設備重建映像。 通過這樣做並將這些行添加到每個路由器的 /etc/rc.local 中,問題就解決了:

ebtables -A INPUT --in-interface tap0 --protocol ipv4 --ip-protocol udp --ip-destination-port 67:68 -j DROP
ebtables -A INPUT --in-interface tap0 --protocol ipv4 --ip-protocol udp --ip-source-port 67:68 -j DROP
ebtables -A FORWARD --out-interface tap0 --protocol ipv4 --ip-protocol udp --ip-destination-port 67:68 -j DROP
ebtables -A FORWARD --out-interface tap0 --protocol ipv4 --ip-protocol udp --ip-source-port 67:68 -j DROP

這種配置持續了三年。

第 2 部分:介紹 WireGuard

最近,互聯網上越來越多地談論 WireGuard,讚賞其配置簡單、傳輸速度快、ping 低且具有相當的安全性。 搜索有關它的更多信息後發現它既不支持橋接成員工作也不支持 TCP 協議工作,這讓我覺得我仍然沒有 OpenVPN 的替代品。 所以我推遲了解 WireGuard。

幾天前,消息通過與 IT 相關的各種方式傳播,WireGuard 最終將包含在 Linux 內核中,從 5.6 版開始。 新聞文章一如既往地讚揚 WireGuard。 我再次投入到尋找替代舊的 OpenVPN 的方法中。 這次我遇到了 本文. 它談到了使用 GRE 在 L3 上創建以太網隧道。 這篇文章給了我希望。 目前還不清楚如何處理 UDP 協議。 通過搜索,我找到了有關將 socat 與 SSH 隧道結合使用以轉發 UDP 端口的文章,但是,他們指出這種方法僅適用於單連接模式,這意味著多個 VPN 客戶端是不可能的。 我想到了在 VPS 上架設 VPN 服務器,並為客戶端配置 GRE,但事實證明,GRE 不支持加密,這將導致如果第三方獲得服務器訪問權限,我網絡之間的所有流量都在他們手中,這根本不適合我。

同樣,通過根據以下方案使用 VPN over VPN,決定支持冗餘加密:

第一層 VPN:
VPS服務器 內部地址為 192.168.30.1
MS客戶 內部地址為 192.168.30.2 的 VPS
MK2客戶 內部地址為 192.168.30.3 的 VPS
MK3客戶 內部地址為 192.168.30.4 的 VPS

第 XNUMX 層 VPN:
MS服務器 外部地址 192.168.30.2 和內部地址 192.168.31.1
MK2客戶 MS 地址為 192.168.30.2,內部 IP 為 192.168.31.2
MK3客戶 MS 地址為 192.168.30.2,內部 IP 為 192.168.31.3

* MS - 公寓 1 中的路由器服務器, MK2 - 公寓 2 中的路由器, MK3 - 公寓 3 中的路由器
* 設備配置發佈在文末劇透中。

因此,在網絡 192.168.31.0/24 的節點之間執行 ping 操作,是時候繼續設置 GRE 隧道了。 在此之前,為了不失去對路由器的訪問權限,值得設置 SSH 隧道以將端口 22 轉發到 VPS,例如,來自公寓 10022 的路由器將在 VPS 的端口 2 上可用,並且來自公寓 11122 的路由器將在 VPS 的端口 3 上可用。來自公寓 XNUMX 的路由器。最好使用相同的 sshtunnel 配置轉發,因為它會在隧道掉線時恢復隧道。

隧道已配置,您可以通過轉發端口連接到 SSH:

ssh root@МОЙ_VPS -p 10022

接下來,禁用 OpenVPN:

/etc/init.d/openvpn stop

現在讓我們在公寓 2 的路由器上設置 GRE 隧道:

ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.2
ip link set grelan0 up

並將創建的接口添加到橋中:

brctl addif br-lan grelan0

讓我們在服務器路由器上執行類似的過程:

ip link add grelan0 type gretap remote 192.168.31.2 local 192.168.31.1
ip link set grelan0 up

並且,還將創建的接口添加到橋中:

brctl addif br-lan grelan0

從這一刻開始,ping 開始成功進入新網絡,我滿意地去喝咖啡。 然後,為了查看線路另一端的網絡如何工作,我嘗試通過 SSH 連接到公寓 2 中的一台計算機,但 ssh 客戶端沒有提示我輸入密碼就死機了。 我嘗試通過端口 22 上的 telnet 連接到這台計算機,看到一行,您可以從中了解到正在建立連接,SSH 服務器正在響應,但由於某種原因,它沒有讓我進入。

$ telnet 192.168.10.110 22
SSH-2.0-OpenSSH_8.1

我正在嘗試通過 VNC 連接到它,但我看到黑屏。 我說服自己問題出在遠程計算機上,因為我可以使用內部地址從這間公寓輕鬆連接到路由器。 但是,我決定通過路由器 SSH 連接到這台計算機,並且驚訝地發現連接成功並且遠程計算機工作正常但也無法連接到我的計算機。

我將 grelan0 設備從網橋中取出並在公寓 2 的路由器上啟動 OpenVPN,並確保網絡再次正常工作並且連接沒有斷開。 搜索我遇到了人們抱怨同樣問題的論壇,建議他們提高 MTU。 說到做到。 但是,在為 gretap 設備將 MTU 設置為足夠大的值 7000 之前,觀察到 TCP 連接丟失或傳輸緩慢。 由於 gretap 的 MTU 較高,一級和二級 WireGuard 連接的 MTU 分別設置為 8000 和 7500。

我在公寓 3 的路由器上做了類似的設置,唯一的區別是第二個名為 grelan1 的 gretap 接口被添加到服務器路由器,它也被添加到 br-lan 網橋。

一切正常。 現在您可以將 gretap 程序集放入自動加載。 為了這:

將這些行放在公寓 2 路由器上的 /etc/rc.local 中:

ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.2
ip link set dev grelan0 mtu 7000
ip link set grelan0 up
brctl addif br-lan grelan0

將此添加到公寓 3 中路由器上的 /etc/rc.local:

ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.3
ip link set dev grelan0 mtu 7000
ip link set grelan0 up
brctl addif br-lan grelan0

在服務器路由器上:

ip link add grelan0 type gretap remote 192.168.31.2 local 192.168.31.1
ip link set dev grelan0 mtu 7000
ip link set grelan0 up
brctl addif br-lan grelan0

ip link add grelan1 type gretap remote 192.168.31.3 local 192.168.31.1
ip link set dev grelan1 mtu 7000
ip link set grelan1 up
brctl addif br-lan grelan1

重新啟動客戶端路由器後,我發現由於某種原因它們沒有連接到服務器。 連接到他們的 SSH(幸運的是,我之前為此配置了 sshtunnel),發現 WireGuard 出於某種原因為端點創建了一個路由,但不正確。 所以,對於192.168.30.2,在路由表中通過pppoe-wan接口指定了路由表,也就是通過Internet,雖然到它的路由應該是通過wg0接口定向的。 刪除此路由後,連接恢復。 我無法在任何地方找到有關如何強制 WireGuard 不創建這些路由的說明。 此外,我什至不明白這是 OpenWRT 的特性,還是 WireGuard 本身的特性。 不必長時間處理這個問題,我只是在一個由計時器循環的腳本中添加到兩個路由器,刪除這條路由的行:

route del 192.168.30.2

總結

我還沒有完全拒絕 OpenVPN,因為我有時需要從筆記本電腦或手機連接到新網絡,並且通常不可能在它們上設置 gretap 設備,但儘管如此,我在數據傳輸方面還是有優勢的公寓之間的速度,例如,使用 VNC 不再不方便。 Ping 略有下降,但變得更加穩定:

使用 OpenVPN 時:

[r0ck3r@desktop ~]$ ping -c 20 192.168.10.110
PING 192.168.10.110 (192.168.10.110) 56(84) bytes of data.
64 bytes from 192.168.10.110: icmp_seq=1 ttl=64 time=133 ms
...
64 bytes from 192.168.10.110: icmp_seq=20 ttl=64 time=125 ms

--- 192.168.10.110 ping statistics ---
20 packets transmitted, 20 received, 0% packet loss, time 19006ms
rtt min/avg/max/mdev = 124.722/126.152/136.907/3.065 ms

使用 WireGuard 時:

[r0ck3r@desktop ~]$ ping -c 20 192.168.10.110
PING 192.168.10.110 (192.168.10.110) 56(84) bytes of data.
64 bytes from 192.168.10.110: icmp_seq=1 ttl=64 time=124 ms
...
64 bytes from 192.168.10.110: icmp_seq=20 ttl=64 time=124 ms
--- 192.168.10.110 ping statistics ---
20 packets transmitted, 20 received, 0% packet loss, time 19003ms
rtt min/avg/max/mdev = 123.954/124.423/126.708/0.675 ms

它主要受高 ping 到 VPS 的影響,大約 61.5ms

但是,速度明顯提高了。 因此,在帶路由器服務器的公寓中,我的互聯網連接速度為 30 Mbps,而在其他公寓中為 5 Mbps。 同時,根據 iperf,在使用 OpenVPN 時,我無法在網絡之間實現超過 3,8 Mbps 的數據傳輸速率,而 WireGuard 將其“提升”到相同的 5 Mbps。

VPS 上的 WireGuard 配置[Interface] Address = 192.168.30.1/24
ListenPort = 51820
PrivateKey = <ЗАКРЫТЫЙ_КЛЮЧ_ДЛЯ_VPS>

[Peer] PublicKey = <ОТКРЫТЫЙ_КЛЮЧ_VPN_1_МС>
AllowedIPs = 192.168.30.2/32

[Peer] PublicKey = <ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МК2>
AllowedIPs = 192.168.30.3/32

[Peer] PublicKey = <ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МК3>
AllowedIPs = 192.168.30.4/32

MS 上的 WireGuard 配置(添加到 /etc/config/network)

#VPN первого уровня - клиент
config interface 'wg0'
        option proto 'wireguard'
        list addresses '192.168.30.2/24'
        option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_1_МС'
        option auto '1'
        option mtu '8000'

config wireguard_wg0
        option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_1_VPS'
        option endpoint_port '51820'
        option route_allowed_ips '1'
        option persistent_keepalive '25'
        list allowed_ips '192.168.30.0/24'
        option endpoint_host 'IP_АДРЕС_VPS'

#VPN второго уровня - сервер
config interface 'wg1'
        option proto 'wireguard'
        option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_2_МС'
        option listen_port '51821'
        list addresses '192.168.31.1/24'
        option auto '1'
        option mtu '7500'

config wireguard_wg1
        option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МК2'
        list allowed_ips '192.168.31.2'

config wireguard_wg1ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.3

        option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МК3'
        list allowed_ips '192.168.31.3'

MK2 上的 WireGuard 配置(添加到 /etc/config/network)

#VPN первого уровня - клиент
config interface 'wg0'
        option proto 'wireguard'
        list addresses '192.168.30.3/24'
        option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_1_МК2'
        option auto '1'
        option mtu '8000'

config wireguard_wg0
        option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_1_VPS'
        option endpoint_port '51820'
        option persistent_keepalive '25'
        list allowed_ips '192.168.30.0/24'
        option endpoint_host 'IP_АДРЕС_VPS'

#VPN второго уровня - клиент
config interface 'wg1'
        option proto 'wireguard'
        option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_2_МК2'
        list addresses '192.168.31.2/24'
        option auto '1'
        option listen_port '51821'
        option mtu '7500'

config wireguard_wg1
        option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МС'
        option endpoint_host '192.168.30.2'
        option endpoint_port '51821'
        option persistent_keepalive '25'
        list allowed_ips '192.168.31.0/24'

MK3 上的 WireGuard 配置(添加到 /etc/config/network)

#VPN первого уровня - клиент
config interface 'wg0'
        option proto 'wireguard'
        list addresses '192.168.30.4/24'
        option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_1_МК3'
        option auto '1'
        option mtu '8000'

config wireguard_wg0
        option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_1_VPS'
        option endpoint_port '51820'
        option persistent_keepalive '25'
        list allowed_ips '192.168.30.0/24'
        option endpoint_host 'IP_АДРЕС_VPS'

#VPN второго уровня - клиент
config interface 'wg1'
        option proto 'wireguard'
        option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_2_МК3'
        list addresses '192.168.31.3/24'
        option auto '1'
        option listen_port '51821'
        option mtu '7500'

config wireguard_wg1
        option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МС'
        option endpoint_host '192.168.30.2'
        option endpoint_port '51821'
        option persistent_keepalive '25'
        list allowed_ips '192.168.31.0/24'

在所描述的二級 VPN 配置中,我為 WireGuard 客戶端指定端口 51821。理論上,這不是必需的,因為客戶端將從任何空閒的非特權端口建立連接,但我這樣做是為了讓所有傳入連接可以在所有路由器的 wg0 接口上被拒絕,端口 51821 上的傳入 UDP 連接除外。

我希望這篇文章對某人有用。

聚苯乙烯 此外,我想分享我的腳本,當我的網絡上出現新設備時,該腳本會在 WirePusher 應用程序中向我的手機發送推送通知。 這是腳本的鏈接: github.com/r0ck3r/device_discover.

更新: OpenVPN 服務器和客戶端配置

OpenVPN 服務器

client-to-client

ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/vpn-server.crt
dh /etc/openvpn/server/dh.pem
key /etc/openvpn/server/vpn-server.key

dev tap
ifconfig-pool-persist /etc/openvpn/ipp.txt 0
keepalive 10 60
proto tcp4
server-bridge 192.168.10.1 255.255.255.0 192.168.10.80 192.168.10.254
status /var/log/openvpn-status.log
verb 3
comp-lzo

OpenVPN客戶端

client
tls-client
dev tap
proto tcp
remote VPS_IP 1194 # Change to your router's External IP
resolv-retry infinite
nobind

ca client/ca.crt
cert client/client.crt
key client/client.key
dh client/dh.pem

comp-lzo
persist-tun
persist-key
verb 3

我使用 easy-rsa 來生成證書。

來源: www.habr.com

添加評論