本文永久链接: https://www.xtplayer.cn/raspberry-pi-is-configured-as-an-openvpn-client-to-set-up-an-external-route/

将树莓派配置为旁路由并连接 OpenVPN,可以让家里所有设备(电视、游戏机等不支持安装VPN的终端)都通过树莓派走 VPN 流量。核心思路是:树莓派作为 VPN 客户端连接服务器,同时开启 IP 转发和 NAT 伪装,将自身变成一个 VPN 网关”

安装 OpenVPN 并准备配置文件

首先在树莓派上安装OpenVPN:

sudo apt update && sudo apt upgrade -y
sudo apt install openvpn -y

你需要从VPN服务商或公司网络管理员处获取配置文件(通常是.ovpn文件)以及证书文件。为了管理方便,可以把所有内容合并到一个文件中。

将你的VPN配置文件(比如叫client.conf)放到/etc/openvpn/client/目录下。文件通常包含以下关键内容:

client
dev tun # 使用TUN虚拟网卡
proto udp # 协议,通常为UDP
remote your-vpn-server.com 1194 # VPN服务器地址和端口
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server # 验证服务器证书
verb 3
# 证书和密钥嵌入在这里
<ca>
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
</ca>
<cert>
...
</cert>
<key>
...
</key>

连接测试与开机自启

sudo openvpn --config /etc/openvpn/client/client.conf

如果看到 Initialization Sequence Completed,说明连接成功。按 Ctrl+C 停止。

启用服务(将client替换为你的配置文件名,不含.conf扩展名):

sudo systemctl enable --now openvpn-client@client

开启 IP 转发(关键步骤)

要让局域网其他设备通过树莓派上网,必须开启IP转发功能。执行以下命令:

# 临时开启
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

# 永久开启:在 /etc/sysctl.d/ 下创建一个 .conf 文件(比如 98-ip-forwarding.conf):
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/98-ip-forwarding.conf

然后让配置生效:

# 新版本的生效方式
sudo systemctl restart systemd-sysctl

# 或者用下面这个命令也行
sudo sysctl --system

验证:执行 sysctl net.ipv4.ip_forward,如果返回 net.ipv4.ip_forward = 1 就说明配置成功了

配置 iptables NAT 规则

这是整个配置最核心的一步。通过 iptables 实现 NAT(网络地址转换),让局域网设备通过树莓派的VPN隧道上网。

# 假设tun0是VPN虚拟网卡,eth0是你的内网网卡(也可能是wlan0)
# 这条规则让从内网进来的数据包,出去时伪装成VPN网卡的IP
sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

# 允许转发:允许从VPN进来的流量转发到内网
sudo iptables -A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT

# 允许从内网到VPN的流量转发
sudo iptables -A FORWARD -i eth0 -o tun0 -j ACCEPT

为了让重启后规则不丢失,需要保存:

# 如果没有这个目录,先创建
sudo mkdir -p /etc/iptables

# 保存规则
sudo iptables-save | sudo tee /etc/iptables/rules.v4

然后创建开机自动恢复规则的服务或脚本。更简单的方法是用 iptables-persistent

sudo apt install iptables-persistent -y
sudo netfilter-persistent save

配置 iptables NAT 规则

Debian Trixie 上,系统已经默认从 iptables 迁移到了 nftables。虽然 iptables 命令还可以用(通过兼容层),但原生使用 nftables 会更高效、更符合新系统的设计方向。

创建或者更新 /etc/nftables.conf 规则文件

/etc/nftables.conf 文件可能存在,如果存在则先进行备份。如果不存在,则执行 vi /etc/nftables.conf 新建。以下为修改之后的配置示例(根据你的网卡名称调整 eth0tun0)。

#!/usr/sbin/nft -f

flush ruleset

table inet nat {
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
oifname "tun0" masquerade
}
}

table inet filter {
chain forward {
type filter hook forward priority filter; policy drop;

# 允许从内网到 VPN 的流量
iifname "eth0" oifname "tun0" accept

# 允许从 VPN 回到内网(已建立连接或相关)
iifname "tun0" oifname "eth0" ct state related,established accept
}

chain input {
type filter hook input priority filter; policy drop;

# 允许本地回环
iif lo accept

# 允许已建立的连接
ct state established,related accept

# 允许 SSH(防止把自己锁在外面)
tcp dport 22 accept

# 允许内网 ping(可选)
icmp type echo-request accept
}

chain output {
type filter hook output priority filter; policy accept;
}
}

说明

  • 如果你的树莓派通过 WiFi 连接主路由,把 eth0 换成 wlan0
  • VPN 虚拟网卡的名字通常是 tun0,可以通过 ip a 确认

测试规则是否加载成功

# 先加载并测试
sudo nft -f /etc/nftables.conf

# 检查规则是否生效
sudo nft list ruleset

务必保留 SSH 端口(上面已经加了 tcp dport 22 accept),否则重启后可能失联。

设置开机自动加载

在 Debian Trixie 上,可以直接启用 nftables 服务:

sudo systemctl enable nftables --now

配置静态路由

因为树莓派是作为旁路由,下游 PC 默认网关为主路由器。当下游 PC 需要访问 openvpn 下的某个网段时,通常需要在 PC 上添加一条静态路由。

互联网

主路由器 (192.168.1.1)
↓ ↓
树莓派旁路由 PC客户端
(192.168.1.100) (192.168.1.50)

OpenVPN 服务器
(对端私网:10.8.0.0/24)

Windows

# 以管理员身份运行
route add 10.8.0.0 mask 255.255.255.0 192.168.1.100

# 永久添加(重启不丢失)
route -p add 10.8.0.0 mask 255.255.255.0 192.168.1.100

Linux

操作系统 / 环境 配置方法 / 后端 核心要点
RHEL/CentOS 7 及更早版本 network 服务 + route-<接口> 文件 创建 /etc/sysconfig/network-scripts/route-eth0 内容格式:192.168.100.0/24 via 192.168.1.1 然后重启网络:systemctl restart network
RHEL/CentOS 8+ / Fedora NetworkManager 推荐使用 nmcli 命令行: nmcli connection modify <连接名> +ipv4.routes "192.168.100.0/24 192.168.1.1" 然后重新加载:nmcli connection reload
Debian/Ubuntu (传统) ifupdown 服务 编辑 /etc/network/interfaces 在网卡配置块内添加 up ip route add 192.168.100.0/24 via 192.168.1.1
Ubuntu 18.04+ 及现代 Debian Netplan 编辑 /etc/netplan/\*.yaml 在对应网卡下添加 routes: 条目,注意 YAML 语法缩进 然后应用:netplan apply
使用 systemd 的发行版 (如 Arch, CoreOS) systemd-networkd 编辑 /etc/systemd/network/10-<接口>.network[Route] 部分指定 Gateway=Destination= 然后重启服务:systemctl restart systemd-networkd

macOS

  1. 查询接口名称

    networksetup -listallnetworkservices

    An asterisk (*) denotes that a network service is disabled.
    Wi-Fi
    Thunderbolt Bridge
    USB 10/100/1000 LAN
    USB 10/100 LAN 2
    USB 10/100 LAN
    HERO12 Black
    iPhone USB
    Karing (system)
    SUSE-VPN
  2. 根据接口名称创建静态路由,以 WIFI 为例:

    • 目标网络:10.201.136.0

    • 子网掩码:255.255.255.0(即 10.201.136.0/24 网段)

    • 网关(下一跳):192.168.31.31

    sudo networksetup -setadditionalroutes "Wi-Fi" 10.201.136.0 255.255.255.0 192.168.31.31