好的,这是一个更完善和清晰的教程,包含如何关闭 VPN 功能以及与 FRP 内网穿透可能冲突的说明。
教程目标: 利用一台 Linux 服务器作为 OpenVPN 中转网关,使你的局域网电脑 (如 192.168.5.9
) 无需直接连接 VPN 即可访问 VPN 网络资源 (如 10.8.0.4
)。
你的网络信息:
- 客户端电脑 IP:
192.168.5.9
- 客户端子网:
192.168.5.0/24
- 客户端默认网关:
192.168.5.254
- 目标 VPN IP:
10.8.0.4
- 你的 OpenVPN 配置文件路径 (示例):
/home/yuuu/data/vpna40/callisto_zhangyu.ovpn
前提条件:
- 中转服务器: 准备一台 Linux 机器 (推荐 Debian/Ubuntu 稳定版),拥有
sudo
权限。 - 网络连接: 该 Linux 机器已连接到你的
192.168.5.0/24
网络。 - 接口名称: 知道该 Linux 机器的局域网接口名称 (用
ip a
查看, 如eth0
,ens18
等)。 - 配置文件: 拥有
.ovpn
文件及可能需要的证书/密钥/用户名密码。 - 基本 Linux 操作能力: 熟悉命令行、编辑文件等。
- 当前时间 (供参考): 2025年5月6日 星期二 下午4:24:21 CST
详细步骤
第 1 步:准备中转网关服务器
-
选择并设置静态 IP 地址:
-
为中转服务器选择一个未被使用 的 IP,例如
192.168.5.200
。 -
查看当前网络接口:
baship a
记下你要配置静态 IP 的那个接口的名称 (例如
eth0
)。 -
配置静态 IP (使用 netplan):
-
编辑 Netplan 配置文件 (
/etc/netplan/
目录下的.yaml
文件)。bash# 用你的实际配置文件名替换 01-netcfg.yaml sudo nano /etc/netplan/01-netcfg.yaml
-
修改或创建如下内容:
yamlnetwork: version: 2 ethernets: eth0: # <---- 替换为你的网卡接口名! dhcp4: no # 关闭DHCP addresses: [192.168.5.200/24] # <---- 设置你选择的静态IP和子网掩码(/24 = 255.255.255.0) gateway4: 192.168.5.254 # <---- 设置你的局域网默认网关 (通常是你的主路由器IP) nameservers: addresses: [114.114.114.114, 8.8.8.8] # <---- 设置 DNS 服务器 (公共DNS或你的路由器)
-
应用配置并验证:
bashsudo netplan apply ip addr show eth0 # 替换为你的接口名,检查 IP 是否正确 ping -c 3 192.168.5.254 # 测试能否 ping 通网关 ping -c 3 baidu.com # 测试能否访问互联网
-
-
-
更新系统并安装必要软件:
bashsudo apt update && sudo apt upgrade -y # 安装 OpenVPN 客户端 和 iptables 规则持久化工具 sudo apt install openvpn iptables-persistent -y # 安装过程中会询问是否保存当前的 IPv4 和 IPv6 规则,选择 <Yes>。
-
检查现有防火墙:
-
有些系统默认启用
ufw
或firewalld
。如果启用,它们可能会干扰iptables
规则。bashsudo ufw status sudo systemctl status firewalld
-
如果它们是 active (running) 状态,你需要配置它们以允许转发(较复杂),或者禁用它们 以完全依赖
iptables
(更简单,但在安全性上需自行评估):bash# 如果决定禁用 ufw (示例) # sudo ufw disable # sudo systemctl stop ufw # sudo systemctl disable ufw
-
第 2 步:配置 OpenVPN 客户端
-
复制并准备 OpenVPN 配置文件:
-
将你的
.ovpn
文件 (callisto_zhangyu.ovpn
) 传输到中转服务器 (例如用scp
或 U 盘)。假设它现在位于中转服务器的~/
目录下。 -
创建 OpenVPN 标准配置目录并将文件复制进去,重命名为
.conf
:bashsudo mkdir -p /etc/openvpn/client sudo cp ~/callisto_zhangyu.ovpn /etc/openvpn/client/callisto_zhangyu.conf
-
处理依赖文件:
-
证书/密钥: 如果
.ovpn
文件内使用ca
,cert
,key
,tls-auth
等指令引用了外部文件 (.crt
,.key
,ta.key
等),请将这些文件也复制到/etc/openvpn/client/
目录下。确保.conf
文件中引用这些文件时没有路径 ,只有文件名(因为它们在同一目录)。bash# 示例: 如果需要 ca.crt 和 user.key # sudo cp ~/ca.crt /etc/openvpn/client/ # sudo cp ~/user.key /etc/openvpn/client/
-
用户名/密码: 如果 VPN 需要认证,编辑
.conf
文件:bashsudo nano /etc/openvpn/client/callisto_zhangyu.conf
找到
auth-user-pass
这一行 (如果存在)。如果它后面没有指定文件名,将其改为auth-user-pass auth.txt
。然后,在/etc/openvpn/client/
目录下创建一个auth.txt
文件:bashsudo nano /etc/openvpn/client/auth.txt
文件内容为两行:第一行是你的 VPN 用户名,第二行是你的 VPN 密码。保存并退出。
设置严格权限:bashsudo chmod 600 /etc/openvpn/client/auth.txt
-
-
-
启动并验证 OpenVPN 连接:
bash# 设置服务开机自启 sudo systemctl enable openvpn-client@callisto_zhangyu # 立即启动服务 sudo systemctl start openvpn-client@callisto_zhangyu # 详细检查服务状态 sudo systemctl status openvpn-client@callisto_zhangyu --no-pager -l # 按 'q' 退出。留意是否有错误信息。 # 查看最新的日志 sudo journalctl -u openvpn-client@callisto_zhangyu -n 50 --no-pager # 检查 VPN 网络接口 (通常是 tun0) 是否出现并获得 IP ip a | grep tun # 应该能看到类似 tun0 的接口和 10.8.x.x 的 IP 地址。记下这个接口名。 # ***关键测试***: 在中转服务器本机 ping 目标 VPN IP ping -c 4 10.8.0.4 # 必须能 ping 通!否则后续步骤无效。按 Ctrl+C 停止。
第 3 步:启用 IP 转发
-
编辑 sysctl 配置文件:
bashsudo nano /etc/sysctl.conf
-
取消注释或添加: 找到
#net.ipv4.ip_forward=1
,删除#
。若没有则在末尾添加net.ipv4.ip_forward=1
。 -
保存并退出。
-
立即应用:
bashsudo sysctl -p
-
验证:
cat /proc/sys/net/ipv4/ip_forward
应输出1
。
第 4 步:配置防火墙 (iptables) 和 NAT
-
再次确认接口名称:
- 局域网接口 (如
eth0
) - VPN 接口 (如
tun0
)
- 局域网接口 (如
-
设置 iptables 规则 (请将下面命令中的
eth0
和tun0
替换为你的实际接口名):bash# 规则 1: NAT - 伪装源地址 # 让从局域网(192.168.5.0/24)来,经VPN接口(tun0)出去的流量,源IP变成tun0的IP sudo iptables -t nat -A POSTROUTING -s 192.168.5.0/24 -o tun0 -j MASQUERADE # 解释: -t nat 指定操作nat表; -A POSTROUTING 添加到POSTROUTING链(在路由之后修改); # -s 源地址范围; -o 出口接口; -j MASQUERADE 进行源地址伪装 # 规则 2: FORWARD - 允许转发特定流量 # 允许从局域网接口(eth0)进,源于192.168.5.0/24,去往VPN接口(tun0),目标是10.8.0.4的数据包通过 sudo iptables -A FORWARD -i eth0 -s 192.168.5.0/24 -o tun0 -d 10.8.0.4 -j ACCEPT # 解释: -A FORWARD 添加到FORWARD链(控制转发); -i 入口接口; -s 源地址; -o 出口接口; -d 目标地址; -j ACCEPT 允许通过 # 规则 3: FORWARD - 允许返回流量 # 允许已经建立的连接(RELATED)或属于现有连接(ESTABLISHED)的返回数据包(从VPN接口进,去往局域网接口)通过 sudo iptables -A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT # 解释: -m state 使用连接状态匹配; --state RELATED,ESTABLISHED 匹配相关或已建立状态; -j ACCEPT 允许 # (可选,更安全): 如果只想允许你的特定电脑(192.168.5.9)访问,将规则2替换为: # sudo iptables -A FORWARD -i eth0 -s 192.168.5.9 -o tun0 -d 10.8.0.4 -j ACCEPT
-
保存 iptables 规则使其持久化:
bashsudo netfilter-persistent save
第 5 步:配置你的客户端电脑 (192.168.5.9
)
-
以管理员身份打开 命令提示符(CMD) 或 PowerShell。
-
删除旧路由 (如果存在):
powershellroute delete 10.8.0.4
-
添加指向新中转网关的静态路由:
powershell# 将 192.168.5.200 替换为你给中转服务器设置的实际静态 IP route add 10.8.0.4 mask 255.255.255.255 192.168.5.200 -p
-
验证路由是否添加成功:
route print -4
(查找目标为10.8.0.4
的条目)。
第 6 步:测试
- 确保中转服务器 (
192.168.5.200
) 运行正常,OpenVPN 已连接。 - 在客户端电脑 (
192.168.5.9
) 上,确保没有运行 OpenVPN 客户端。 - 尝试
ping 10.8.0.4
。 - 尝试访问依赖
10.8.0.4
的网络服务。
第 7 步:如何停止/禁用 VPN 网关功能
当你不再需要这个中转功能时,可以按以下步骤操作:
-
在客户端电脑 (
192.168.5.9
) 上:-
以管理员身份打开 CMD 或 PowerShell。
-
删除静态路由:
powershellroute delete 10.8.0.4
-
-
在中转网关服务器 (
192.168.5.200
) 上:-
停止 OpenVPN 服务:
bashsudo systemctl stop openvpn-client@callisto_zhangyu
-
(可选) 禁止 OpenVPN 服务开机自启:
bashsudo systemctl disable openvpn-client@callisto_zhangyu
-
(可选) 禁用 IP 转发:
bash# 临时禁用 sudo sysctl -w net.ipv4.ip_forward=0 # 永久禁用 (编辑 /etc/sysctl.conf, 将 net.ipv4.ip_forward=1 改回 0 或注释掉) # sudo nano /etc/sysctl.conf # sudo sysctl -p
-
(可选) 清除添加的 iptables 规则:
-
最简单的方法是重启服务器(如果规则没有完全持久化或者你想恢复到默认状态)。
-
或者手动删除规则 (用
iptables -D
加上规则内容,例如sudo iptables -t nat -D POSTROUTING -s 192.168.5.0/24 -o tun0 -j MASQUERADE
)。 -
或者清除所有规则并保存空规则集(慎用!会清除所有规则 ):
bash# sudo iptables -F # 清空 filter 表规则 # sudo iptables -t nat -F # 清空 nat 表规则 # sudo iptables -X # 删除自定义链 # sudo netfilter-persistent save # 保存空规则
-
-
第 8 步:与 FRP 内网穿透的潜在冲突说明
如果你计划在同一台 中转网关服务器 (192.168.5.200
) 上同时运行 OpenVPN 客户端 (作为网关) 和 FRP 客户端 (frpc
) (或其他类似内网穿透工具,如 ngrok、cloudflared tunnel),可能会遇到冲突,主要是路由冲突。
- 冲突原因:
- 默认路由 (
redirect-gateway
): 如果你的 OpenVPN 配置文件中包含redirect-gateway def1
或类似选项,它会强制服务器的所有出站流量(包括frpc
连接frps
服务器的流量)都通过 VPN 隧道。如果frps
服务器位于公共互联网,而 VPN 提供商阻止某些连接或 VPN 连接不稳定,frpc
可能无法连接或连接缓慢。 - 路由表影响: 即使没有
redirect-gateway
,OpenVPN 也会添加特定的路由。这可能影响frpc
选择哪个网络接口和哪个源 IP 地址去连接frps
服务器。例如,frpc
可能错误地尝试使用 VPN 的tun0
接口 IP 作为源 IP 去连接公网的frps
,导致连接失败。
- 默认路由 (
- 如何避免或缓解:
- 检查 OpenVPN 配置: 确保你的
callisto_zhangyu.conf
文件中没有redirect-gateway def1
指令,除非你明确需要所有流量都走 VPN。只让 OpenVPN 推送必要的私有网络路由(例如route 10.8.0.0 255.255.255.0
)通常是更好的选择。 - 策略路由 (高级): 在 Linux 上使用
ip rule
和ip route
为frpc
进程或目标frps
服务器的流量指定一个不同的路由表,强制它使用物理网卡 (eth0
) 和你的主路由器 (192.168.5.254
) 出去。这配置较为复杂。 - FRP 绑定源 IP (若支持): 检查
frpc
的配置文件 (frpc.ini
) 是否支持bind_addr
或类似选项,尝试将其绑定到服务器的物理 IP (192.168.5.200
)。 - 分离服务 (最简单可靠): 将 OpenVPN 网关功能和 FRP 内网穿透功能部署在两台不同的机器(或虚拟机)上。这是避免潜在冲突的最简单方法。
- 检查 OpenVPN 配置: 确保你的
第 9 步:故障排除提示
- 客户端 ping 不通
10.8.0.4
: 逐步检查:客户端路由是否正确?中转服务器防火墙/NAT/转发是否配置正确?中转服务器自身 VPN 是否连接且能 ping 通10.8.0.4
? - 中转服务器 VPN 连不上: 检查 OpenVPN 日志 (
journalctl
),确认配置文件、证书/密钥、用户名/密码是否正确,网络连接是否正常。 - 中转服务器无法上网: 如果配置了
redirect-gateway
或者路由/DNS 设置错误,可能导致中转服务器自身无法访问互联网。检查/etc/resolv.conf
和ip route show
。
这个更详细的教程应该能更好地指导你完成设置。祝你成功!