在樹莓派上設定 VPN 伺服器

Jinku Hu 2022年5月18日
在樹莓派上設定 VPN 伺服器

本文將演示在 Raspberry Pi 裝置上設定 VPN 伺服器。

在 Raspberry Pi OS 上配置 WireGuard VPN 包

一般來說,VPN 伺服器有許多不同的協議和實現,但本文選擇 WireGuard 軟體作為當代流行的選擇。

該軟體包通常在預設儲存庫中可用,你應該能夠使用以下命令安裝它:

sudo apt install wireguard

一旦安裝了 wireguard 軟體包,你的 Raspberry Pi 系統上將可以使用幾個命令列工具來操作 WireGuard 配置和介面。

WireGuard 通常會為系統新增一個新的虛擬網路介面。WireGuard 實現了 CryptoKey Routing 概念,通過將公鑰/私鑰關聯到每個對等方來表示。

也就是說,對等點只是 VPN 隧道中的參與者,每個參與者都由唯一的公鑰標識。因此,我們需要生成這些金鑰並將它們包含在相應的配置檔案中。

由於配置檔案和私鑰應該被視為敏感資訊,我們在生成金鑰並將它們儲存在/etc/wireguard 目錄之前呼叫 umask 0700 命令。

因此,只有這些檔案的所有者才能在以後讀取/寫入內容。

umask 0700; wg genkey | sudo tee /etc/wireguard/private.key

樣本輸出:

2RzKFbGMx5g7fG0BrWCI7JIpGvcwGkqUaCoENYueJw4=

前面的命令會將金鑰儲存在 private.key 檔案中並列印出來以便輕鬆複製。

接下來,我們將在同一 /etc/wireguard 目錄中建立一個名為 wg0.conf 的配置檔案,並在其中包含以下內容:

[Interface]
PrivateKey = 2RzKFbGMx5g7fG0BrWCI7JIpGvcwGkqUaCoENYueJw4=
Address = 10.10.10.1/24
ListenPort = 51820

請注意,此配置檔案適用於 Raspberry Pi 對等體,你可以根據需要重新命名 wg0 部分。

你應該將 PrivateKey 值複製為使用上一個命令生成的金鑰。此外,你可以指定將接受傳入連線的埠和對等方的地址。

現在我們可以轉到另一個節點(節點 A),它應該連線到 Raspberry Pi。此時,我們假設另一臺機器是基於 Linux 的,並且你已相應地在其上安裝了 WireGuard 包。

Peer A 配置將遵循相同的步驟來重用命令來生成公鑰並執行它。請注意,金鑰可以在一臺機器上生成,但由於私鑰是保密的,我們正在相應的對等機器上開發它們。

生成私鑰後,在 /etc/wireguard 目錄中建立一個配置檔案(例如 wg0.conf)並插入以下行:

[Interface]
PrivateKey = 9jalV3EEBnVXahro0pRMQ+cHlmjE33Slo9tddzCVtCw=
Address = 10.10.10.2/32

請注意,此處的 PrivateKey 值是任意的,你必須將其替換為有效值。同時,如果你有特定的網路配置需求,IP 地址可能會修改。

在此之後,我們必須生成公鑰並將它們儲存在它們的配置檔案中。公鑰是從私鑰派生的,在我們的例子中,需要在兩個裝置上生成。

使用以下命令在 Raspberry Pi 上生成一個公鑰,在另一臺機器上生成第二個公鑰:

sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

現在,讓我們將 peer 部分插入到配置檔案中。以下行需要附加到 Raspberry Pi /etc/wireguard/wg0.conf 檔案中:

[Peer]
PublicKey = PRIVATE_KEY_OF_PEER_A
AllowedIPs = 10.10.10.2/32

請注意,AllowedIPs 值與 Peer A 配置檔案的 Address 值中指定的 IP 地址相同。

此外,將 PRIVATE_KEY_OF_PEER_A 替換為在 Peer A 上生成的私鑰。另一方面,將以下行附加到 Peer A 機器上的 wg0.conf 檔案中。

確保將私鑰值替換為對應的值,並將端點地址替換為 Raspberry Pi 裝置的地址。請注意,以下配置將使 VPN 連線單向連線,因為只有 Peer A 可以訪問 Raspberry Pi 網路。

[Peer]
PublicKey = PRIVATE_KEY_OF_RASPBERRY
AllowedIPs = 0.0.0.0/0
Endpoint = 172.16.0.134:51820

最後,你應該使用以下命令在樹莓派端啟動相應的服務:

sudo systemctl enable wg-quick@wg0.service

雖然 Peer A 每次想要建立隧道介面並連線到它時都會使用以下命令:

sudo wg-quick up wg0

你可以使用以下命令刪除介面並終止來自 Peer A 的現有連線:

sudo wg-quick down wg0

如何通過 Raspberry Pi 路由所有 Peer A 流量

此時,Peer A 將無法訪問 Internet,只能訪問 Raspberry Pi 網路。我們需要在配置檔案中新增額外的引數來實現這一點。

讓我們從 Peer A wg0.conf 檔案開始,並在 [Interface] 部分新增以下行:

DNS = DNS_ADDRESS_USED_BY_RASPBERRY

此 DNS 地址值取決於網路配置,因此你應該檢索當前活動的地址並在將來由於某種原因發生更改時對其進行更新。

另一方面,你應該將這些額外的行附加到 Raspberry Pi wg0.conf 檔案中:

PostUp = ufw route allow in on wg0 out on eth0
PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PreDown = ufw route delete allow in on wg0 out on eth0
PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

請注意,如果你為配置檔案建立不同的檔名,則需要在這些行中更改 wg0 名稱。

儲存 wg0.conf 更改後,開啟 /etc/sysctl.conf 檔案並取消註釋/修改行:

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

通常,只有在配置檔案中還包含 IPv6 地址時才需要 net.ipv6.conf.all.forwarding。在此之後,你必須執行以下命令才能使更改生效:

sudo sysctl -p

現在,你應該通過 Raspberry Pi 連線並轉發來自 Peer A 的所有 Internet 流量。不過,如果你在樹莓派上執行防火牆,請務必為 Peer A 設定相應的規則,否則它將無法訪問網路。

作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - Raspberry Pi