Networking

兩個 LAN 之間的 Wireguard 連接,在路由器後面帶有線保護盒

  • April 12, 2022

我有兩個家庭區域網路(相距 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. 如問題中所述,有兩個站點:

  1. 192.168.0.0/24使用 nanopi 作為wireguard 伺服器,介面10.0.0.1上有wireguard 地址wg0
  2. 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電腦所在的站點上,網際網路路由器應具有NATPort forwarding類似的東西。在wireguard連接的埠上應該有UDP,轉發到wireguard伺服器IP和埠的IP和埠。我不會在這裡展示,因為每個路由器都有不同的 GUI 來設置它。

路由和 DHCP

現在,當wireguard 連接正常工作時,您應該能夠通過VPN 訪問另一個站點上的nano pi。登錄到192.168.0.250( 10.0.0.1on wg0) 時,應該能夠 ping (或登錄到)10.0.0.2,反之亦然。但是,兩個網路上的其他客戶端不知道如何通過 VPN 到達那裡。他們有一個預設網關,用於轉發所有不屬於本地網路的流量。由於來自其他站點的地址不是本地地址,所有應該通過 VPN 的流量都通過 ISP 路由器傳到網際網路。

一種方法是在網路上的每個設備上添加自定義靜態路由。有些人允許這樣做,但許多人不允許。Windows 或 linux 電腦可以選擇添加路由。在 android 設備上這已經是一個問題。因此,應該找到其他解決方案,其中不需要在每台設備上設置靜態路由。

如果 ISP 路由器有添加自定義路由的選項,則可以添加這樣的路由。我無法在這裡展示這究竟是如何實現的。通常,來自另一個站點的所有地址(例如192.168.0.0,帶有網路遮罩24255.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具有以下含義:

  1. 第一條靜態路由:
  • 24- 網路遮罩大小
  • 192, 168, 1- 上面定義的網路遮罩的前綴
  • 192, 168, 0, 250- 上面定義的網路網關
  1. 第二條靜態路由:
  • 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,或者至少給出一個想法。需要一些網路和管理方面的知識。

引用自:https://unix.stackexchange.com/questions/602267