兩個 LAN 之間的 Wireguard 連接,在路由器後面帶有線保護盒
我有兩個家庭區域網路(相距 100 公里)通過網際網路提供商路由器連接到網際網路,並希望它們通過兩台單板電腦 (NanoPi R2S) 與wireguard VPN 連接。NanoPi R2S 板已經安裝了 armbian 和wireguard。
網際網路連接之一具有靜態和其他動態網際網路 IP。兩者都輸入了動態 DNS,現在我有機會在 nanopis 上安裝動態 DNS 客戶端,因為路由器上的客戶端不能很好地工作。我可以通過兩個 Internet 路由器上的 NAT 虛擬伺服器功能公開wireguard 電腦。
站點 A:
- 靜態公共 IP AAAA 和名稱 sitea
- LAN 192.168.0.0/24 與預設網關 192.168.0.1
- NanoPi eth0 與 DHCP 保留 192.168.0.250
站點 B:
- 動態公共 IP BBBB 和名稱 siteb
- LAN 192.168.1.0/24 與預設網關 192.168.1.1
- NanoPi eth0 與 DHCP 保留 192.168.1.250
我認為站點 B 會建立從動態 IP 站點到站點 B 暴露的伺服器埠的連接。
然後站點 A (192.168.0.0/24) 上的所有電腦應該有一個額外的路由,它將通過 192.168.0.250 引導站點 B (192.168.1.0/24) 的流量。同樣,站點 B (192.168.1.0/24) 上的所有電腦都應具有通過 192.168.1.250 引導站點 A (192.168.0.0/24) 流量的路由。那會奏效嗎?
我應該為 wg0 介面分配哪些 IP?10.0.0.0/24? 那麼路線會是什麼樣子?那我該如何路由 10.0.0.0/24 流量呢?我需要路由嗎?我應該如何配置wireguard?我認為我不需要用於wireguard的確切命令。我只需要指針,應該如何組織流量(IP、路由)。
使用 eth0 和 wg0,NanoPi R2S 需要 eth0 來處理兩種方式的流量。我可以輕鬆地在 NanoPi (lan0) 上使用另一個乙太網埠來增加吞吐量或將一個埠專用於線保護,另一個專用於 LAN?如何?
我從一個站點移動到另一個站點並連接到 WiFi/DHCP 的設備(電話、筆記型電腦)呢?我可能每次都必須輸入路線,因為站點 A 中的路線會在另一個站點 B 上弄得一團糟,反之亦然。我知道其中一個路由器允許輸入一些靜態路由,但我需要弄清楚它們的用途。
解決方案非常簡單,但是,我在網際網路上沒有找到任何關於如何製作這種站點到站點 VPN 的描述。因此,我決定在這裡發布一個適合我的解決方案。
**免責聲明:**此解決方案僅適用於 IPv4。由於我的一個 ISP 不提供任何 IPv6,因此我沒有配置 IPv6。這仍然是為了未來的改進。
IP轉發
首先需要啟用 IP 轉發,因此 nanopi 會將流量從一個介面轉發到另一個介面。一條線
net.ipv4.ip_forward=1
應該出現
/etc/sysctl.conf
在. 執行或(取決於 linux 發行版),或者只是重新啟動以使更改生效。.conf``/etc/sysctl.d/``sysctl -p``service procps reload
線衛
我不會詳細介紹如何配置wireguard。網際網路上有很多。我將只寫一些在我的案例中使用的網路細節,並指出我在
/etc/wireguard/wg0.conf
. 如問題中所述,有兩個站點:
192.168.0.0/24
使用 nanopi 作為wireguard 伺服器,介面10.0.0.1
上有wireguard 地址wg0
。192.168.1.0/24
使用 nanopi 作為wireguard 客戶端,介面10.0.0.2
上有wireguard 地址wg0
。變化
/etc/wireguard/wg0.conf
如下:首先,添加了一條指令以防止 wg-quick 設置其 ip 規則和路由。一行
Table = off
被添加到[Interface]
部分:Table = off
其次,添加路由以通過 VPN 連接引導流量。再次在
[Interface]
部分:PostUp = ip route add 192.168.1.0/24 via 10.0.0.2 dev wg0 PreDown = ip route del 192.168.1.0/24 via 10.0.0.2 dev wg0
上面的行來自第一個站點,並告訴核心將另一個網路()的所有流量路由到通過設備連接到 VPN()
192.168.1.0/24
另一端的 IP 。在另一個站點上,配置中的 IP 編號不同(和)。10.0.0.2``wg0``192.168.0.0/24``10.0.0.1
第三,作為wireguard客戶端的第二台wireguard電腦
Endpoint
在本節中有定義[Peer]
,而作為伺服器的第一台電腦沒有。該端點是公共 IP 和埠,可以訪問伺服器 nanopi。在路由器上,伺服器 nanopi 必須暴露在網際網路上才能允許傳入連接。在伺服器wireguard電腦所在的站點上,網際網路路由器應具有NAT
或Port forwarding
類似的東西。在wireguard連接的埠上應該有UDP,轉發到wireguard伺服器IP和埠的IP和埠。我不會在這裡展示,因為每個路由器都有不同的 GUI 來設置它。路由和 DHCP
現在,當wireguard 連接正常工作時,您應該能夠通過VPN 訪問另一個站點上的nano pi。登錄到
192.168.0.250
(10.0.0.1
onwg0
) 時,應該能夠 ping (或登錄到)10.0.0.2
,反之亦然。但是,兩個網路上的其他客戶端不知道如何通過 VPN 到達那裡。他們有一個預設網關,用於轉發所有不屬於本地網路的流量。由於來自其他站點的地址不是本地地址,所有應該通過 VPN 的流量都通過 ISP 路由器傳到網際網路。一種方法是在網路上的每個設備上添加自定義靜態路由。有些人允許這樣做,但許多人不允許。Windows 或 linux 電腦可以選擇添加路由。在 android 設備上這已經是一個問題。因此,應該找到其他解決方案,其中不需要在每台設備上設置靜態路由。
如果 ISP 路由器有添加自定義路由的選項,則可以添加這樣的路由。我無法在這裡展示這究竟是如何實現的。通常,來自另一個站點的所有地址(例如
192.168.0.0
,帶有網路遮罩24
或255.255.255.0
應重定向到192.168.1.250
)。如果這不可能,我建議在 nanopi 上設置 DHCP 伺服器並禁用 ISP 路由器上的 DHCP 功能。
isc-dhcp-server
幾乎可以安裝在所有 linux 發行版上,並且該伺服器可以向網路上的所有客戶端發送正確的路由資訊,只要它們使用 DHCP。我不會詳細介紹 DHCP 伺服器配置。這是一個例子/etc/dhcp/dhcpd.conf
:default-lease-time 600; max-lease-time 7200; option subnet-mask 255.255.255.0; option broadcast-address 192.168.0.255; option routers 192.168.0.1; option domain-name "localdomain"; option domain-name-servers 192.168.0.250; option rfc3442-classless-static-routes code 121 = array of integer 8; option ms-classless-static-routes code 249 = array of integer 8; option rfc3442-classless-static-routes 24, 192, 168, 1, 192, 168, 0, 250, 0, 192, 168, 0, 1; option ms-classless-static-routes 24, 192, 168, 1, 192, 168, 0, 250, 0, 192, 168, 0, 1; subnet 192.168.0.0 netmask 255.255.255.0 { range 192.168.0.150 192.168.0.229; default-lease-time 86400; max-lease-time 172800; } host staticip { default-lease-time 86400; max-lease-time 172800; hardware ethernet aa:bb:cc:dd:ee:ff; fixed-address 192.168.0.4; }
dhcp 配置中的所有內容都非常標準。DHCP 正在從
192.168.0.150
到分配地址192.168.0.229
。將其更改為您的偏好。我應該指出線條
option rfc3442...
和option ms-classless...
。它們定義了 DHCP 發送路由資訊的選項。一種適用於遵循 RFC 3442 的客戶端,另一種適用於使用另一種選項的 Microsoft 客戶端。這些數字24, 192, 168, 1, 192, 168, 0, 250, 0, 192, 168, 0, 1
具有以下含義:
- 第一條靜態路由:
24
- 網路遮罩大小192, 168, 1
- 上面定義的網路遮罩的前綴192, 168, 0, 250
- 上面定義的網路網關
- 第二條靜態路由:
0
- 網路遮罩大小(預設網關)- 沒有網路,因為上面的遮罩是
0
192, 168, 0, 1
- 上面定義的網路網關此處也必須提供預設路由,因為如果通過 DHCP 接收到此資訊,則客戶端應忽略預設路由。
在 dchp 配置文件的末尾有一個範例,如何為將具有靜態 IP 地址的客戶端進行 DHCP 保留。輸入您的硬體乙太網 (MAC) 地址和所需的 IP。
防火牆
現在來自一個網路的客戶端應該能夠通過wireguard VPN訪問另一個網路上的客戶端,前提是防火牆允許流量通過。
如果您的 VPN 電腦上有防火牆(例如 nanopi),它可能不允許流量進入。根據您的偏好和環境的安全要求制定防火牆規則。您可以在 VPN 電腦上打開需要通過的每個單獨埠,或者如果它位於受信任的環境中,則可以打開所有埠。一種方法是使用
firewall-cmd
命令。這是一個例子:# set "trusted" as a default zone firewall-cmd --set-default-zone=trusted # see in which zones the interfaces are firewall-cmd --get-active-zones # you may have to remove eth0 from the zone where it belongs to (public in this case) firewall-cmd --permanent --zone=public --remove-interface=eth0 # add eth0 to trusted zone firewall-cmd --permanent --zone=trusted --add-interface=eth0 # you may have to remove wg0 from the zone where it belongs to (public in this case) firewall-cmd --permanent --zone=public --remove-interface=wg0 # add wg0 to trusted zone firewall-cmd --permanent --zone=trusted --add-interface=wg0 # reload the new config firewall-cmd --reload
然後每個設備上都有防火牆,可以阻止傳入的流量。通常,Windows 防火牆只允許來自“本地網路”的一些連接。另一個站點不在本地網路上,因此伺服器將阻止通過 VPN 的連接。
192.168.1.0/24
您必須為阻止特定連接的每個規則添加另一個網路(例如)。例如,對於 Windows 共享,您必須更改電腦共享上埠 135-139 和 445 的所有傳入規則。同樣,您必須更改訪問共享的電腦上的傳出規則。我當然會推荐一些時間來微調防火牆,而不是僅僅關閉它們。
我希望說明足夠清楚,並有助於設置站點到站點的 VPN,或者至少給出一個想法。需要一些網路和管理方面的知識。