WireGuard 是一款现代化的 VPN 协议,以其简洁、高效和安全性著称。相比传统的 IPsec 或 OpenVPN,WireGuard 代码量更少、配置更简单、性能更出色。本教程将详细介绍如何在 MikroTik RouterOS 上配置 WireGuard 的各种应用场景。
1. WireGuard 简介WireGuard 被设计为一种通用 VPN,既能在嵌入式设备上运行,也能在超级计算机上高效工作。它的核心特点包括: 极简配置:仅需几行命令即可完成 高性能:基于现代加密技术,速度快于 OpenVPN 安全性:使用先进加密算法(Curve25519、ChaCha20Poly1305 等) 跨平台:支持 Windows、macOS、Linux、Android、iOS
在 RouterOS 中,WireGuard 从 7.x 版本开始原生支持,无需额外安装包。 2. 基础概念:接口与对等端WireGuard 中没有传统的“服务端”和“客户端”概念,而是通过 接口(Interface) 和 对等端(Peer) 进行点对点连接。
概念 | 说明 | | WireGuard 接口 | 虚拟 VPN 接口,有自己的 IP 地址和监听端口。每个接口自动生成公钥/私钥对 | | 对等端(Peer) | 允许连接到本接口的远程设备,通过公钥识别。可以配置允许的 IP 地址和端点信息 |
3. 场景一:站点到站点(Site-to-Site)VPN两个办公室需要安全互联,各自有独立的内网网段。这是 WireGuard 最常见的应用场景之一。 3.1 网络拓扑
- Office 1 (10.1.202.0/24) <--- WireGuard 隧道 ---> Office 2 (10.1.101.0/24)
- │ │
- Router A Router B
- (MikroTik) (MikroTik)
复制代码
3.2 配置步骤步骤一:在 Router A(Office 1)创建 WireGuard 接口
- /interface wireguard
- add listen-port=13231 name=wireguard1
复制代码 创建后,接口会自动生成公钥和私钥。使用以下命令查看:
- <font color="#000000">/interface wireguard print
复制代码 输出示例:
- Flags: X - disabled; R - running
- 0 R name="wireguard1" mtu=1420 listen-port=13231
- private-key="yKt9NJ4e5qlaSgh48WnPCDCEkDmq+VsBTt/DDEBWfEo="
- public-key="u7gYAg5tkioJDcm3hyS7pm79eADKPs/ZUGON6/fF3iI="
复制代码 步骤二:在 Router A 添加对等端(指向 Router B)
- /interface wireguard peers
- add allowed-address=10.1.101.0/24 endpoint-address=192.168.80.1 \
- endpoint-port=13231 interface=wireguard1 \
- public-key="v/oIzPyFm1FPHrqhytZgsKjU7mUToQHLrW+Tb5e601M="
复制代码关键参数说明: allowed-address:对方内网网段,用于路由 endpoint-address/port:对方公网 IP 和 WireGuard 监听端口 public-key:对方 WireGuard 接口的公钥
步骤三:在 Router A 配置 IP 地址和路由
- # 为隧道接口配置 IP(点对点)
- /ip address
- add address=10.255.255.1/30 interface=wireguard1
- # 添加路由:访问对方内网走 WireGuard 接口
- /ip route
- add dst-address=10.1.101.0/24 gateway=wireguard1
复制代码 步骤四:在 Router B 进行对称配置
Router B 的配置与 Router A 类似,只是 IP 和公钥互换: - # 创建接口
- /interface wireguard
- add listen-port=13231 name=wireguard1
- # 添加对等端(指向 Router A)
- /interface wireguard peers
- add allowed-address=10.1.202.0/24 endpoint-address=192.168.90.1 \
- endpoint-port=13231 interface=wireguard1 \
- public-key="u7gYAg5tkioJDcm3hyS7pm79eADKPs/ZUGON6/fF3iI="
- # 配置 IP 和路由
- /ip address
- add address=10.255.255.2/30 interface=wireguard1
- /ip route
- add dst-address=10.1.202.0/24 gateway=wireguard1
复制代码 3.3 防火墙配置默认防火墙会阻止 WireGuard 流量,需要在 input 链中添加允许规则: - /ip firewall filter
- add chain=input protocol=udp dst-port=13231 action=accept \
- comment="Allow WireGuard"
复制代码 4. 场景二:远程访问 VPN(Road Warrior)移动设备(手机、笔记本)需要安全接入公司内网。WireGuard 的“服务端”需配置为 responder 模式,避免不必要的日志。 4.1 服务端(MikroTik)配置创建 WireGuard 接口- /interface wireguard
- add listen-port=51820 name=wg-server private-key="自动生成或手动指定"
复制代码查看生成的公钥: - /interface wireguard print
复制代码 为每个客户端添加对等端假设第一个客户端的隧道 IP 为 10.10.10.2/32: - /interface wireguard peers
- add allowed-address=10.10.10.2/32 interface=wg-server \
- public-key="客户端公钥" \
- is-responder=yes
复制代码 配置接口 IP 和 NAT
- # 为 WireGuard 接口分配 IP
- /ip address
- add address=10.10.10.1/24 interface=wg-server
- # 启用 NAT,让客户端通过 VPN 访问互联网
- /ip firewall nat
- add chain=srcnat out-interface=ether1 action=masquerade
- # 如果客户端需要访问内网,添加路由
- /ip route
- add dst-address=192.168.88.0/24 gateway=wg-server
复制代码 4.2 客户端配置Windows / macOS / Linux / 移动端- [Interface]
- PrivateKey = <客户端自动生成的私钥>
- Address = 10.10.10.2/24
- DNS = 10.10.10.1
- [Peer]
- PublicKey = <MikroTik 的公钥>
- AllowedIPs = 0.0.0.0/0 # 所有流量走 VPN
- Endpoint = <路由器公网IP>:51820
- PersistentKeepalive = 25 # NAT 穿透
复制代码 配置导出:QR 码方式RouterOS 支持直接生成客户端配置和二维码: - /interface wireguard peers
- show-client-config <peer-name>
复制代码此命令会显示配置文本和二维码,手机客户端扫码即可自动配置。 5. 场景三:MikroTik 作为 WireGuard 客户端你的 MikroTik 路由器需要作为 VPN 客户端,连接到第三方 VPN 服务商或自建服务端。 5.1 导入配置文件如果你已有标准的 WireGuard 配置文件(.conf 格式),可以使用导入命令: - /interface wireguard wg-import file=config.conf
复制代码注意:配置文件开头不能有 # 注释,否则会报错。 5.2 手动配置客户端创建 WireGuard 接口
- /interface wireguard
- add name=wg-client private-key="<客户端私钥>"
复制代码 添加对等端(服务端)
- /interface wireguard peers
- add interface=wg-client \
- public-key="<服务端公钥>" \
- endpoint-address="vpn.example.com" \
- endpoint-port=51820 \
- allowed-address=0.0.0.0/0 \
- persistent-keepalive=25s
复制代码 配置接口 IP
- /ip address
- add address=10.10.10.5/24 interface=wg-client
复制代码 5.3 策略路由:仅指定内网流量走 VPN如果不想所有流量都走 VPN,而是只让特定内网网段(如 192.168.100.0/24)通过 WireGuard 访问外网,需要使用策略路由: - # 创建独立路由表
- /routing table
- add name=via-wg fib
- # 在独立路由表中添加默认路由
- /ip route
- add dst-address=0.0.0.0/0 gateway=wg-client routing-table=via-wg
- # 配置 NAT
- /ip firewall nat
- add chain=srcnat out-interface=wg-client action=masquerade
- # 添加策略规则:指定源地址的流量使用 via-wg 路由表
- /routing rule
- add action=lookup-only-in-table src-address=192.168.100.0/24 table=via-wg
复制代码这样配置后,只有源 IP 为 192.168.100.0/24 的流量会走 WireGuard 隧道。 6. 场景四:多 WAN 环境下的 WireGuard当路由器有多个 WAN 出口时,WireGuard 隧道可能因回包路径错误而无法建立。这是因为两个方向的握手可能走了不同出口。 6.1 问题现象WireGuard 对等端双方都会主动发送握手包。如果服务端有两条 WAN 线路,客户端的握手从 WAN1 进入,服务端可能从 WAN2 回复,导致连接失败。 6.2 解决方案:策略路由标记使用 mangle 规则,确保回包走原路。 - # 1. 记录进入的 WireGuard 握手源 IP(以 WAN2 为例)
- /ip firewall mangle
- add action=add-src-to-address-list chain=prerouting \
- address-list=WAN2_WireGuard_clients address-list-timeout=1m \
- dst-port=13231 in-interface=ether2 protocol=udp \
- comment="记录从 WAN2 进入的 WireGuard 客户端 IP"
- # 2. 标记出站连接的标记
- /ip firewall mangle
- add action=mark-connection chain=output \
- dst-address-list=WAN2_WireGuard_clients dst-port=13231 \
- new-connection-mark=wan2 protocol=udp
- # 3. 标记路由,指定使用对应路由表
- /ip firewall mangle
- add action=mark-routing chain=output connection-mark=wan2 \
- dst-port=13231 new-routing-mark=wan2 protocol=udp
- # 4. 确保使用正确的源 IP 发出
- /ip firewall nat
- add action=masquerade chain=srcnat out-interface=ether2
复制代码 7. 高级特性:WireGuard + HotSpot 双因素认证RouterOS v7 支持将 HotSpot 绑定到 WireGuard 接口,实现“先 VPN 连接,再 Portal 认证”的双重安全机制。 7.1 配置步骤
- # 1. 确保 WireGuard 接口已配置
- /interface wireguard print
- # 2. 在 WireGuard 接口上配置 HotSpot
- /ip hotspot
- add interface=wg1
- # 或使用 setup 向导
- /ip hotspot setup
- # 选择接口时选 wg1
复制代码 7.2 配置 TOTP 用户
- /ip hotspot user
- add name=peer1 totp-secret=HVR4CFHAFOWFGGFAGSA5JVTIMMPG6GMT
复制代码 客户端连接 WireGuard 后,会弹出 HotSpot 登录页面,需要输入用户名和 6 位 TOTP 动态密码。
8. IPv6 与 WireGuardWireGuard 原生支持 IPv6。以下是一个纯 IPv6 隧道的配置示例: 8.1 服务端配置(Debian 示例)
- [Interface]
- Address = 2a14:9b80:0:1::1/64
- ListenPort = 51820
- PrivateKey = <私钥>
- [Peer]
- PublicKey = <MikroTik 公钥>
- AllowedIPs = 2a14:9b80:101::/48
- Endpoint = [2001:41f0:6f67::2]:51820
复制代码 8.2 MikroTik 客户端配置
- /interface wireguard
- add listen-port=51820 mtu=1420 name=wg-ipv6
- /interface wireguard peers
- add allowed-address=::/0 endpoint-address=2001:678:3a4:1::100 \
- endpoint-port=51820 interface=wg-ipv6 \
- public-key="服务端公钥" persistent-keepalive=30s
- /ipv6 address
- add address=2a14:9b80:101::1 interface=wg-ipv6
- /ipv6 route
- add dst-address=::/0 gateway=wg-ipv6 routing-table=via-wg6
复制代码 9. 故障排查指南9.1 检查接口状态
- /interface wireguard print
- /interface wireguard peers print
复制代码 查看 last-handshake 字段,如果一直为 0,说明握手未成功。
9.3 检查防火墙确认 WireGuard 端口(默认 13231 或 51820)已放行: - /ip firewall filter print where protocol=udp
复制代码 9.4 查看日志
- /log print where topics~"wireguard"
复制代码 9.5 常见问题速查
问题 | 可能原因 | 解决方案 | | 握手不成功 | 公钥配置错误 | 核对两端公钥 | | 握手不成功 | 防火墙阻止 | 添加 input 允许规则 | | 握手不成功 | NAT 穿透问题 | 配置 persistent-keepalive | | 能 ping 通但对端网络不通 | 路由缺失 | 检查 allowed-address 和路由表 | | 多 WAN 下不稳定 | 回包路径错误 | 配置 mangle 规则确保对称路由 | | 导入配置失败 | 配置文件有注释 | 移除 # 开头的行 |
10. 总结WireGuard 在 MikroTik RouterOS 上的配置非常灵活,适用场景涵盖: 站点到站点 VPN:企业分支互联 远程访问 VPN:移动办公接入 第三方 VPN 客户端:隐私保护 多 WAN 环境:需特殊处理对称路由
掌握 WireGuard 的关键在于理解 接口与对等端的关系 以及 路由与策略路由的配合。建议从简单场景开始,逐步扩展到复杂环境。
|