madsbacha/routeros-vpn
GitHub: madsbacha/routeros-vpn
一个 RouterOS 脚本,自动在 MikroTik 路由器上创建并维护 Private Internet Access 的 WireGuard VPN,支持断线自动重连。
Stars: 31 | Forks: 5
# 在 MikroTik 路由器上使用 Private Internet Access WireGuard VPN
该仓库包含一个 RouterOS 脚本,用于创建和维护一个 _[Private Internet Access](https://www.privateinternetaccess.com/)_ VPN,通过配置必要的 WireGuard 接口和对等端、地址,并处理因不活动导致连接断开时重新配置接口,从而重新建立连接,始终保持工作配置。
该脚本已在 RouterOS 7.22 版本上验证可正常工作。
### 功能
- 为 PIA VPN 设置 WireGuard 接口
- 向 WireGuard 接口添加 PIA 对等端
- 如果连接丢失,重新配置 WireGuard 接口
- 为 WireGuard 接口设置 PIA 分配的地址
- 自动为 VPN 接口上的出站流量设置源地址伪装(masquerade)
- 验证 PIA 服务器的 TLS 证书与其自签名 CA 证书
## 设计
脚本的设计确保指定的 WireGuard 接口存在,即如果接口不存在则创建,如果已存在则使用现有同名接口。
创建接口后不会修改它,仅提取公钥。
程序将确保接口上仅存在一个对等端,并且该对等端已正确配置以与 PIA 通信。
如果没有对等端,则创建一个,并移除连接不需要的任何多余对等端。
为 WireGuard 接口设置一个地址,该地址会在 PIA 为 WireGuard 对等端分配新地址时更新。
如果没有地址,则创建一个,并移除接口上任何多余的地址配置。
## 限制
- 程序当前不处理 PIA 接收到的 DNS 服务器。
你需要自行处理 DNS 设置。
- 用于与 PIA 通信的 API 基于 [pia-foss/manual-connections](https://github.com/pia-foss/manual-connections),
因为 PIA 没有官方支持自定义 WireGuard 配置。
## 快速开始
要开始使用,你需要在路由器中设置脚本 `vpn.rsc`,通过进入 *系统 > 脚本*,创建一个新脚本,并将 *源* 字段设置为 `vpn.rsc` 的内容。脚本只需要 `read`、`write` 和 `test` 策略,因此可以禁用其他策略。
插入后,编辑文件底部,通过填写你的 PIA 用户名和密码来更改参数,并可能相应调整 PIA 地区和接口名称。
如果你的密码包含字符 `?` 或 `$`,你需要用反斜杠转义它们:`\?` 和 `\$`。更多信息请参阅 [脚本 Wiki 页面](https://wiki.mikrotik.com/wiki/Manual:Scripting#:~:text=value%20is%20assigned%3B-,Constant%20Escape%20Sequences,-Following%20escape%20sequences)。此外,避免使用 `$[]` 和 `$()` 实例,因为它们用于 [在字符串中插入表达式](https://wiki.mikrotik.com/wiki/Manual:Scripting#:~:text=By%20using%20%24%5B%5D%20and%20%24()%20in%20string%20it%20is%20possible%20to%20add%20expressions%20inside%20strings)。
最后,设置一个计划任务,每 15 分钟运行一次该脚本。这样可确保每 15 分钟检查一次连接,如果连接断开则重新配置。将以下命令中的 `vpn-pia-berlin-1` 替换为你命名上述脚本的名称。
```
/system/scheduler/add name="vpn-pia-berlin-1" interval=15m start-time=startup on-event="/system/script/run vpn-pia-berlin-1;";
```
### 参数
- `interface`
脚本用于 WireGuard 接口的名称。如果接口不存在则创建。
示例:`vpn-pia-berlin-1`。
- `region`
要连接的 PIA 服务器区域。
示例:`de_berlin`。
- `pia-username`
你的 PIA 用户名。
- `pia-password`
你的 PIA 密码。
- `ping-address`
用于通过 VPN 连接检查连接性的地址。该地址会被 ping 一次以检查连接性。
默认值:`1.1.1.1`。
- `servers-file-path`
指定用于缓存 PIA 服务器列表的文件路径。
默认值:`pia-servers.txt`。
- `pia-servers-ttl`
指定 `servers-file-path` 在更新前的保留时间。如果遇到连接 PIA 服务器的问题,可以尝试将此值设置得更小。
默认值:`24h`。
- `masquerade`
指定是否自动在防火墙中创建源地址伪装规则。
默认值:`true`。
- `verify-pia-certificate`
指定是否验证 PIA 服务器的 TLS 证书。
默认值:`true`。
- `routing-table`
指定为此特定 VPN 接口及其流量自动创建的路由表名称。
默认值:`vpn-routing`
## 通过 VPN 接口路由流量
该脚本仅用于保持 WireGuard 接口正常运行。
因此,本节将指导你配置 RouterOS 以通过 WireGuard 接口路由流量。
有多种方法可以通过接口路由流量:
- [防火墙 mangle 规则](https://help.mikrotik.com/docs/spaces/ROS/pages/48660587/Mangle)
- [路由规则](https://help.mikrotik.com/docs/spaces/ROS/pages/59965508/Policy+Routing#PolicyRouting-RoutingRules)
### 使用防火墙 Mangle 路由
以下配置使用防火墙 mangle 规则将特定网站(本例中为 [myip.wtf](https://myip.wtf/))通过 VPN 接口路由。
配置步骤:
1. 创建一个名为 `vpn-routing` 的路由表,用于所有 VPN 流量。
2. 向 VPN 路由表添加一条默认路由和一个黑洞路由。
3. 为本地地址创建一个地址列表,使 mangle 规则不会影响发往局域网的连接。
4. 创建一个示例网站 `myip.wtf` 并将其添加到地址列表 `route-through-pia-vpn` 中。此列表中的网站将通过 VPN 路由。
5. 设置 mangle 规则,该规则:
1. 标记指向 `route-through-pia-vpn` 地址列表中网站的连接。
2. 将标记的连接移动到 `vpn-routing` 路由表。
如果使用以下配置,请将 `vpn-pia-berlin-1` 替换为你的 VPN 接口名称。
```
/routing table
add disabled=no fib name=vpn-routing
/ip route
add disabled=no distance=1 dst-address=0.0.0.0/0 gateway=vpn-pia-berlin-1 \
routing-table=vpn-routing scope=30 suppress-hw-offload=no target-scope=10
add blackhole comment="VPN blackhole" disabled=no distance=100 dst-address=\
0.0.0.0/0 gateway="" routing-table=vpn-routing suppress-hw-offload=no
/ip firewall address-list
add address=10.0.0.0/8 list=rfc1918
add address=172.16.0.0/12 list=rfc1918
add address=192.168.0.0/16 list=rfc1918
/ip firewall address-list
add address=myip.wtf list=route-through-pia-vpn
/ip firewall mangle
add action=mark-connection chain=prerouting comment=\
"Mark connections for VPN" dst-address-list=route-through-pia-vpn \
new-connection-mark=pia-vpn-connection
add action=mark-routing chain=prerouting comment="Move to vpn-routing" \
connection-mark=pia-vpn-connection dst-address-list=!rfc1918 \
new-routing-mark=vpn-routing
```
## 故障排除
本节介绍使用脚本时可能遇到的一些常见问题。
### 我无法访问路由到 PIA WireGuard 接口的站点
请确保你已允许设备通过接口路由流量,检查防火墙并调整它以允许通过接口的流量。你可以使用如下命令允许访问,但请记住防火墙规则的顺序:
```
/ip/firewall/filter/add chain=forward action=accept out-interface=vpn-pia-berlin-1
```
标签:IP地址分配, MikroTik, PIA VPN, RouterOS, TLS验证, VPN连接维护, WireGuard, 安全连接, 对等体管理, 数字取证, 源NAT, 网络自动化, 网络配置, 自动化脚本, 自动重连, 虚拟专用网络, 路由器脚本