WireGuard_2和3台OpenWRT测试_LAN-LAN连接测试_Debian11_CentOS8
转载注明来源: 本文链接 来自osnosn的博客,写于 2023-07-29.
参考文档
- 【彻底理解 WireGuard 的路由策略】
- 【Linux下的Wireguard路由配置理解】
- 【Wireguard 全互联模式(full mesh)配置指南】
- 【Wireguard 全互联模式(full mesh)配置指南】
- 【WireGuard 官网 installation】
- 【openwrt 官网关于wireguard的文档】
- 【lan-to-lan子网穿透和多网段并存】
- 【How To Set Up WireGuard on Debian 11】
OpenWRT
安装,配置
- op-21.02, op-22.03, 安装
opkg install luci-app-wireguard
或opkg install luci-proto-wireguard
,
相关依赖都会装齐。重启整个op系统,才生效。- 在 Network -> Interface -> "Add new interface" 创建一个新接口。 (2023-07测)
点击"创建"。* Name: 写 "wg0",大小写都可以。建议小写。无需用大写。 * Protocol: 选择 WireGuard.
- "General Setting" 中,
* Protocol: 选择 WireGuard. * Bring up on boot: 勾上。 * Private key: 生成一个。 * IP Addresses: 设置一个自定义IP (和LAN,WAN,不冲突的网段),如"192.168.23.3/24"。 如果填写 "192.168.23.3/32",也行。访问时, 表现的有些不同。见下文的 "其他" 部分。 也可以写多个不同网段的IP,比如: "192.168.23.3/24"和"192.168.25.3/24"。 * No Host Routes(不创建到peer主机的路由): 不勾。
- "Advanced Settings" 中,
* Use default gateway: 不勾。 * Use DNS servers advertised: 随意。勾上(默认),可以不勾。
- "Firewall Settings" 中,创建一个叫 WG 的 zone。
- "DHCP Server" 中,不设置DHCP服务。
- "Peers" 中,先不动。后面再添加。
- "General Setting" 中,
- 点击创建/保存。
- 在 Network -> Firewall 中,检查新创建的zone "WG" 的默认策略设置为,
* Input: accept; * Output: accept; * Forward: accept; # 如果是 reject,则这个点不能作为"中继"转发其他节点之间的数据。 * Masquerading: 不勾。
- 点击 "Zones" -> "WG" 的 "编辑","General Settings" 中,
* Masquerading: 不勾。 * MSS clamping: 不勾。 * Allow forward to destination zones: 留空 * Allow forward from source zones: 留空
- 点击 "Zones" -> "WG" 的 "编辑","General Settings" 中,
- 在 Network -> Interface -> "Add new interface" 创建一个新接口。 (2023-07测)
添加 peer 互连
-
设置 peer,需要对方 服务端的pubkey,以及preshared key。
- "wg genpsk > psk_txt" 生成一个新的 预共享密钥。
- 对方服务器公钥,如果gui的网页上有,则可以在网页上copy。如果没有,要用命令行生成。
- 去对方服务器上,执行 "wg show" 可以看到当前系统的 服务端公钥,和 已经配置的peer公钥。
- 找到对方服务端的私钥,"echo '私钥' | wg pubkey" 获取私钥对应的 公钥。
-
以下两个命令,用于更换 服务端私钥。配置 peer时,用不到。
- "wg genkey > prikey" 生成一个新的 私钥。
- "wg pubkey < prikey > pubkey" 获取私钥对应的 公钥。
-
两台机器用wireguard连接,需要双方 互相添加peer。
-
op-21.02 添加 peer: (2023-07测)
- 在 Network -> Interface 中,"Edit" 编辑刚才创建的 "wg0"接口。
在 peer 选项卡中,"Add peer" 添加一个peer。* Description: 自定义名称。 * Public Key: 对方的 服务器公钥,可以在对方机器中,用 "wg show"查看。 * Preshared Key: 预共享密钥,可以用 "wg genpsk" 生成一个。双方填同一个。 * Allowed IPs: 一定要填, 至少填对方wg的IP。如 "192.168.23.5/32"。# 用"/32" 这个是定义wireguard内部,是否允许访问。如果不写,连接后,就算手工添加route也不能ping通。 * Route Allowed IPs: 应该**勾上**。当AllowedIPs中有wg网段以外的IP,一定要勾上。否则可以不勾。 如果ping不到对方,可能是缺少路由规则,需手工添加route。 - 如果同一个wg的Address包含多个网段,所有peer配置都**不要勾上**。或者拆成两个wg配置。(见下面的说明) * Endpoint Host: 对方的IP。如果对方在 NAT后面,连接不上,则留空。 * Endpoint Port: 对方的UDP监听口。如果"对方的IP"留空,则留空。 * Persistent Keep Alive: 要填一个**非零值**, 如 "40", "135", "150"。否则不会主动连接。如果"对方的IP"留空,则留空。 通常PersistentKeepalive乘以2 的时间,会更新handshake。 如果本机是在 NAT后面,主动连接对方,则建议用 "25"。 如果填 "0/留空", 不知道要等多久,或者等什么触发条件 连接才建立,没具体测试过。
- 在 Network -> Interface 中,"Edit" 编辑刚才创建的 "wg0"接口。
-
op-22.03 添加 peer: (2023-07测)
- 在 Network -> Interface 中,"Edit" 编辑刚才创建的 "wg0"接口。
在 peer 选项卡中,"Add peer" 添加一个peer。
需要配置的选项 和 op-21.02 一样。 另外,还多了两个选项:* Private Key: 是用来生成peer配置文件,不用于连接。可以留空。 就是配置内容需要有个prikey,写这里,用于抄到配置文件"[interface]"中的。 * Configuration Export: 如果填了 "private key" 就可以点击它,生成peer的配置文件。
- 在 Network -> Interface 中,"Edit" 编辑刚才创建的 "wg0"接口。
-
注意,如果改动了 wireguard 的配置,或者是添加/修改了 peer的配置。
保存/apply后,没效果。可以尝试 restart 这个 wg0 的接口。 -
修改wireguard的配置,在web页面上点来点去,好麻烦。
不如直接修改/etc/config/network
文件中,wireguard 的部分。然后用ifup wg0
重启 wg0 接口。
不确定接口名称,可以用ifstatus wg0
,ifstatus WG0
来测试 接口名称。所以当初创建接口时,用"小写字母"会方便点。 -
opwnWRt-22.03的测试。
同一个wg网口,比如wg0中,Address有两个IP(不同网段,23.3/25.3),并添加了两个peer,分别连接到不同网段的节点。
比如: 两peer分别是 "AllowedIPs=192.168.23.0/24" , "AllowedIPs=192.168.25.0/24"。
有时会发现,两个连接握手都正常,但只能ping通一个网段,另一个ping不通。
去掉所有peer配置中 route_allowed_ips 的勾,就OK了。
如果有某个peer勾了,对应这个peer的网段就有可能ping不通。
用ip route
查看。发现有区别,也许这就是原因。- 勾上 route_allowed_ips 显示
192.168.23.0/24 dev wg0 scope link
- 不勾 route_allowed_ips 显示
192.168.23.0/24 dev wg0 scope link src 192.168.23.3
debian没有这个配置项,也没这个问题。它的路由都有src,和openwrt不勾route_allowed_ips一样。
如果这两个peer的AllowIPs中,还有对方后续的其他网段。openwrt就只能自己手工添加route规则了。debian没测试,也许用PostUp,PreDown的interface配置项,能解决。
或者,把两个网段,配置成两个独立的wg0,wg1。 - 勾上 route_allowed_ips 显示
互连测试
-
表格中的 IP 地址,省略了 "192.168."。
-
2台机测试。(2023-07测ok)
A ,op21 B ,op22 IP 192.168.23.6/24 23.7/24 公钥 A-pub B-pub Peer1 B-pub A-pub AllowedIPs 23.7/32
或 23.0/2423.6/32
或 23.0/24AllowedIPs, 用 "/32" 或 "/24" 都可以。
用 "/24",必须写 "192.168.23.0/24",掩码之外的部分必须是 "0"。
不能写 "192.168.23.12/24",这会导致本地路由规则添加失败。 -
3台机测试,A机做 中继。(2023-07测ok)
A ,op22 B ,op22 C ,op21 IP 192.168.23.6/24 23.7/24 23.8/24 公钥 A-pub B-pub C-pub Peer1 B-pub A-pub - AllowedIPs 23.7/32 23.6/32, 23.8/32
或 23.0/24- Peer2 C-pub - A-pub AllowedIPs 23.8/32 - 23.6/32, 23.7/32
或 23.0/24中继 A机 wg0接口 对应的防火墙 Zone,检查 forward=accept。如果是Linux,设置 "net.ipv4.ip_forward=1"。
防火墙中 没有阻止转发的规则。
B机连接 中继 peer的 AllowedIPs 中, 要加上 C机的 IP。
C机连接 中继 peer的 AllowedIPs 中, 要加上 B机的 IP。 -
3台机测试,全部互联。即:全互连模式 (full mesh)。(2023-07测ok)
A ,op22 B ,op22 C ,op21 IP 192.168.23.6/24 23.7/24 23.8/24 公钥 A-pub B-pub C-pub Peer1 B-pub A-pub - AllowedIPs 23.7/32 23.6/32 - Peer2 - C-pub B-pub AllowedIPs - 23.8/32 23.7/32 Peer3 C-pub - A-pub AllowedIPs 23.8/32 - 23.6/32 如果某个连接断了,对应的IP就会访问失败。访问不会绕行。
LAN-LAN_2机互连测试
wg0 接口 使用单独的防火墙 zone "WG"
-
表格中的 IP 地址,省略了 "192.168."。
-
2台机的 Network -> Firewall -> "Zones" -> "WG" 的默认策略设置为,
* Input: accept; * Output: accept; * Forward: accept; * Masquerading: 不勾。
-
2台机测试。(2023-07测ok)
A ,op21 B ,op22 IP 192.168.23.6/24 23.7/24 公钥 A-pub B-pub LAN口IP 192.168.11.1/24 44.1/24 内网机 IP:
192.168.11.2/24
路由:
23.0/24 via 11.1
44.0/24 via 11.1
或 缺省路由: 11.1IP:
44.2/24
路由:
23.0/24 via 44.1
11.0/24 via 44.1
或 缺省路由: 44.1Peer1 B-pub A-pub AllowedIPs 23.7/32, 44.0/24 23.6/32, 11.0/24 A机可以访问23.7,44.1,不能访问44.2。A内网机不能访问23.7,44.1,44.2。
B机可以访问23.6,11.1,不能访问11.2。B内网机不能访问23.6,11.1,11.2。 -
A机在 Network -> Firewall -> "Zones" -> "WG" 的 "编辑",
* Allow forward to destination zones: LAN * Allow forward from source zones: 留空
A机可以访问23.7,44.1,不能访问44.2。A内网机不能访问23.7,44.1,44.2。
B机可以访问23.6,11.1,11.2。B内网机不能访问23.6,11.1,11.2。 -
A, B机 都设置,Network -> Firewall -> "Zones" -> "WG" 的 "编辑",
* Allow forward to destination zones: LAN * Allow forward from source zones: 留空
A机可以访问23.7,44.1,44.2。A内网机不能访问23.7,44.1,44.2。
B机可以访问23.6,11.1,11.2。B内网机不能访问23.6,11.1,11.2。 -
A,B 机在 Network -> Firewall -> "Zones" -> "WG" 的 "编辑",
* Allow forward to destination zones: LAN * Allow forward from source zones: LAN
两边的网络是 互通的。(2023-07测ok)
A机可以访问23.7,44.1,44.2。A内网机可以访问23.7,44.1,44.2。
B机可以访问23.6,11.1,11.2。B内网机可以访问23.6,11.1,11.2。- 保持 A, B两机 "WG" 转发to "LAN" 和 "WG" 转发from "LAN",
改 A机 的peer,AllowedIPs: 23.7/32。去掉 44.0/24。(2023-08测ok)
A机可以访问23.7,不能访问44.1,44.2。A内网机可以访问23.7,不能访问44.1,44.2。
B机可以访问23.6,11.1,11.2。B内网机不能访问23.6,11.1,11.2。
- 保持 A, B两机 "WG" 转发to "LAN" 和 "WG" 转发from "LAN",
-
A,B 机在 Network -> Firewall -> "Zones" -> "WG" 的 "编辑",
* Allow forward to destination zones: 留空 * Allow forward from source zones: LAN
A机可以访问23.7,44.1,不能访问44.2。A内网机可以访问23.7,44.1,不能访问44.2。
B机可以访问23.6,11.1,不能访问11.2。B内网机可以访问23.6,11.1,不能访问11.2。 -
A 机在 Network -> Firewall -> "Zones" -> "WG" 的 "编辑",
* Allow forward to destination zones: 留空 * Allow forward from source zones: LAN
B 机在 Network -> Firewall -> "Zones" -> "WG" 的 "编辑",
* Allow forward to destination zones: LAN * Allow forward from source zones: 留空
网络是 单向的。(2023-08测ok)
A机可以访问23.7,44.1,44.2。A内网机可以访问23.7,44.1,44.2。
B机可以访问23.6,11.1,不能访问11.2。B内网机不能访问23.6,11.1,11.2。 -
以上的测试,都是使用 保留地址段,基于直接的路由转发。
被访问的机,可以获得对方的真实IP。(2023-07测ok) -
以上的测试,条件不变。如果 A, B 的防火墙 zone "LAN" 都打开 Masq (勾上 Masquerading),就是基于NAT转发。
双向也是 互通的。只是 被访问的机,不能获得对方的真实IP,看到的来源 IP是A 或 B的LAN口 IP地址。 -
如果,A机还有一个接口WAN,连接了公网 IP。(2023-08测试ok)
B机需要使用 A机的 WAN接口 去访问公网主机。
这个场景的本质问题是,公网主机中,不可能有 你需要的路由规则 (指向A的)。
A机在 Network -> Firewall -> "Zones" -> "WG" 的 "编辑",* Allow forward to destination zones: LAN + WAN * Allow forward from source zones: LAN #这个"from"不需要 WAN
B机的 peer中 AllowedIPs中,增加某个公网 IP段 202.0.0.0/8。或者干脆加上 0.0.0.0/0。
这样 B机 LAN网段的主机就可以通过 A机的 WAN口访问公网。同时不影响 A, B两边 LAN网段的互访。
A, B机 wg 接口的 zone无需设置 Masq,因为 A机的 WAN口已经有 Masq设置了。
公网上,被访问的机器,看到的来源 IP,是 A机 WAN口的 IP。(2023-08测试ok) -
如果,例子中 11.0/24 和 44.0/24 网段的内网机,它们的 路由规则 都没有指向 A 或 B。它们就不可能直接互访。
考虑在两边各装一个代理服务,使用代理链去实现吧。 -
如果,例子中 一边的内网机,如 11.0/24,它的 路由规则 没有指向 A。(这项未实际测试)
那就应该把这个内网网段,连接在 A的 WAN口上。参考 上面的做法 (A机还有一个接口WAN)。
B 这边的内网机,就可以访问 A那边的 11.0/24。单向访问。 -
如果,就是要隐藏 B机 LAN网段的主机IP,但不隐藏连接来自B机。(这项未实际测试)
这种情况,还是要求,A那边的内网机的路由要指向A;; B那边的内网机的路由要指向B。
B机就要做IP伪装。是另一个做法。见下文 (zone "WG",IP伪装)。
wg0 接口 使用防火墙 zone "LAN"
这是最简单的设置
- A,B机 都修改 wg0接口的防火墙 zone为 "LAN"。
在 Network -> Interfaces -> wg0接口,编辑 -> Firewall Settings,
A, B机 Network -> Firewall -> "Zones" -> "LAN" 的配置保持默认,无需改变:* Create / Assign firewall-zone: 改为 LAN
A, B 两边的内网机中,都有 对应的路由,* Allow forward to destination zones: WAN * Allow forward from source zones: 留空
两边的网络是 互通的。(2023-07测ok)A内网机: 23.0/24 via 11.1 和 44.0/24 via 11.1 B内网机: 23.0/24 via 44.1 和 11.0/24 via 44.1
A机可以访问23.7,44.1,44.2。A内网机可以访问23.7,44.1,44.2。
B机可以访问23.6,11.1,11.2。B内网机可以访问23.6,11.1,11.2。 - 这个测试,也是使用 保留地址段,基于直接的路由转发。
被访问的机,可以获得对方的真实IP。(2023-07测ok) - 如果,这时候 A, B 的防火墙 zone "LAN" 都打开 Masq (勾上 Masquerading),就是基于NAT转发。
双向也是 互通的。只是 被访问的机,不能获得对方的真实IP,看到的来源 IP是A 或 B的LAN口 IP地址。
有一侧还有WAN口
- 如果,A机还有一个接口WAN,连接了公网 IP。
B机需要使用 A机的 WAN接口 去访问公网主机。
这个场景的本质问题是,公网主机中,不可能有 你需要的路由规则 (指向A的)。
只需简单的在 B机的 peer中 AllowedIPs中,增加某个公网 IP段 202.0.0.0/8。或者干脆加上 0.0.0.0/0。
这样 B机 LAN网段的主机就可以通过 A机的 WAN口访问公网。同时不影响 A, B两边 LAN网段的互访。
因为 A机 的防火墙 Zone "LAN“ 中 已经有 Allow forward to destination zones: WAN 。
且 A机的 WAN口已经有 Masq设置了。
公网上,被访问的机器,看到的来源 IP,是 A机 WAN口的 IP。
反之,也是一样的。B机有 WAN口,A机 的 peer 中加 0.0.0.0/0 。A机 LAN网段主机 可以通过 B机 WAN口访问公网。 - 如果 A, B 都有 WAN口,也只能设置一边。
因为两边 WAN口连接的网段,是有冲突的,路由没办法写。
两边都设置 0.0.0.0/0 就属于多此一举,把网络搞崩了。 - 如果 A, B 都有 WAN口,想偶尔的交叉使用一下。
考虑在两边各装一个代理服务,使用代理链去实现吧。
wg0 接口 使用单独的防火墙 zone "WG",IP伪装
这项未测试。
- 在 Network -> Firewall 中,更改 zone "WG" 的设置为,
* Input: accept; * Output: accept; * Forward: reject 或 drop; * Masquerading: 勾上。
- 点击 "Zones" -> "WG" 的 "编辑","General Settings" 中,
* Masquerading: **勾上**。 * MSS clamping: 勾上; (MSS钳制, MSS=最大分段大小) 是否勾上,好像影响不大。通常 Masquerading 勾了,这个就勾上。 * Allow forward to destination zones: 留空 * Allow forward from source zones: LAN
- 被访问的机,不能获得对方的真实IP,只能看到是来自 A机 或 B机 的访问。因为是基于NAT转发。
- 理论上分析,如果两机互连,应该只设置一边 Masq,访问应该是单向的。就像WAN口一样。
比如,这样的场景,有 A机 和 B机。
A机的 wg 加入 zone "LAN"。
B机的 wg 使用 zone "WG",配置为 Masq=yes。
这时候,B机这边 LAN网段的主机,可以访问 A机那边 LAN网段的主机。
因为是基于NAT转发。A机那边被访问的机器,看到的来源 IP是 B机本身。
A机那边的LAN网段主机,无法主动访问B机这边LAN网段的IP。 - 理论上分析,如果 A机 和 B机 wg 的 zone,都设为 Masq=yes,是错误的设置。
结果是,只能 A和 B之间 自身的访问。应该无法互相访问 各自后面的 LAN网段。 - "WG"IP伪装,没有实际测试。所以不知道实际效果。也不知道 理论上的分析 对不对。
LAN-LAN_3机互连测试
- 表格中的 IP 地址,省略了 "192.168."。
- 3台机测试,A机做 中继。(2023-07测ok)
A ,op22 B ,op22 C ,op21 IP 192.168.23.6/24 23.7/24 23.8/24 公钥 A-pub B-pub C-pub LAN口IP 192.168.44.1/24 55.1/24 内网机 IP:
192.168.44.2/24
路由:
23.0/24 via 44.1
55.0/24 via 44.1
或 缺省路由: 44.1IP:
55.2/24
路由:
23.0/24 via 55.1
44.0/24 via 55.1
或 缺省路由: 55.1Peer1 B-pub A-pub - AllowedIPs 23.7/32, 44.0/24 23.6/32, 23.8/32, 55.0/24 - Peer2 C-pub - A-pub AllowedIPs 23.8/32, 55.0/24 - 23.6/32, 23.7/32, 44.0/24 - B, C 内网机都添加了对应的路由规则。
A, B, C 的 wg0 的防火墙 zone,都是 "LAN"。
A, B, C 的 zone "LAN" 上,没有激活 Masq。
被访问机器,可以获得对方的真实IP
44.2可以主动访问55.2。来源IP是 44.2。
55.2可以主动访问44.2。来源IP是 55.2。 - 其他的配置组合,没有测试。(比如: zone 是 "WG"; B 或 C 内网机没有添加路由,之类的配置组合)
DDNS
- OpenWrt 的 wireguard 中 peer 的 Endpoint Host: 如果使用了 DDNS动态域名。
域名的IP变化,wireguard 不会自己更新。 - 执行
ifup wg0
可刷新配置,重新解析ddns。
此命令,会重启 wg0,可能会影响 current peer sessions。 - 所以,可以编写一个脚本,监控连接是否正常,或者监控ddns是否更换了IP。
然后用ifup wg0
刷新。 - 或者使用 wireguard-tools软件包中的脚本。
/usr/bin/wireguard_watchdog
此命令不需要参数。不影响 current peer sessions。
脚本检查所有已经激活的wg连接,如果某个连接的 latest handshake > 150秒,则刷新此连接。
可考虑,此脚本每2分钟执行一次。
例,在crontab中,指定10分钟执行一次。*/10 * * * * /usr/bin/wireguard_watchdog
其他
- 注意。大概是 op-21 的防火墙脚本有bug。op22 似乎没这个问题。
有的时候,对防火墙的修改,"Save&Apply" 之后,并不生效。
比如,修改 "Create / Assign firewall-zone", 或者 修改 wg0接口的 "firewall zone",或者 修改 "Allow forward to destination zones" , "Allow forward from source zones"。
提交后,没效果。点击 Status -> Firewall -> "Restart Firewall"也没反应。/etc/init.d/firewall restart
会卡住。只能重启整个 op系统。
又搜到文章说,这种情况重启 rpcd 会好。在op21上试过,没用。还是只能重启整个 op系统。 - 本地的 [Interface] 中 "IP Addresses" 和 [Peer] 中 "Allowed IPs" 设置:
- 如 IPaddresses=192.168.23.3/24 , AllowedIPs=192.168.23.5/32。
ping 192.168.23.8 (不存在的IP) Destination Host Unreachable 并报错 sendmsg: Required key not available. traceroute 192.168.23.8 (不存在的IP) 报错 sendmsg: Required key not available.
- 如 IPaddresses=192.168.23.3/24 , AllowedIPs=192.168.23.5/24。
或 IPaddresses=192.168.23.3/32 , AllowedIPs=192.168.23.5/24。ping 192.168.23.8 (不存在的IP) Destination Host Unreachable 无报错。 traceroute 192.168.23.8 (不存在的IP) 返回 "!H" Host Unreachable。
- 如 IPaddresses=192.168.23.3/32 , AllowedIPs=192.168.23.5/32。
traceroute 192.168.23.8 (不存在的IP) 显示,数据包从缺省路由出去了,没走 wireguard 接口。
- 如 IPaddresses=192.168.23.3/24 , AllowedIPs=192.168.23.5/32。
- 如果大数据量的互访,不太稳定,或速度慢,可能是 mtu 太大的问题。
链路中的交换机丢弃了 大的数据包。- 在 Network -> Interface -> "wg0" 点击 "Edit" 编辑 "wg0"接口。
在 Advanced Settings 中,把 mtu 设置为 1420 试试。 - 如果还是不行,再试试,
在 Network -> Firewall -> "Zones" -> "WG"或"LAN" 的 "编辑","General Settings" 中,
"MSS clamping" (MSS钳制): 勾上。
注: Masquerading 不勾的情况下,MSS clamping 也是可以勾上的。
- 在 Network -> Interface -> "wg0" 点击 "Edit" 编辑 "wg0"接口。
Debain11
查找/尝试
- Debian11,
apt search wireguard
搜到4个相关。(2023-07测)- wireguard,依赖 wireguard-modules或wireguard-dkms, wireguard-tools
- wireguard-dkms (内核模块),依赖 dkms
- wireguard-tools (wg工具,包含 wg, wg-quick 两个命令),依赖 libc6
- wireguard-go (只包含一个 wireguard-go 的可执行文件,无需内核支持),依赖 libc6
- 只要安装 "wireguard",就会自动把需要的包装上。
如果内核已经支持,就只装 wireguard-tools
如果内核没有,但支持装内核模块,则装 wireguard-modules,找不到则装 wireguard-dkms。再装 wireguard-tools。 - 如果内核太旧,不支持,那就 不安装 wireguard包,要安装 wireguard-go。
- Armbian,如果内核是自编译的,安装 wireguard包 时,会要求安装 对应的官方内核 linux-image-xxx。
只要确定 自编译内核支持 wireguard,仅安装 wireguard-tools 即可,不用装 wireguard包。
Debian11 安装,配置 wireguard
- 安装 wireguard 用
apt install wireguard
。(2023-07测)
自动装上 wireguard-tools。因内核支持,无需 wireguard-modules。- 在目录 "/etc/wireguard/" 中创建 接口"wg0" 对应的配置文件 ”wg0.conf"
其中 PrivateKey 的内容,用[Interface] ListenPort = 54321 PrivateKey = abcdefghijklmnopqrst..... Address = 192.168.23.2/24 Address = fd24:609a:6c18::2/64 #SaveConfig = true #SaveConfig 建议不要设置这项,否则停止wg0时,配置文件会被修改。不方便手工修改配置文件。 # 除非,先停掉接口,再修改配置文件。
wg genkey
生成一个新的。 - "[Interface]" 中支持以下配置项。
- PrivateKey, ListenPort, FwMark 见
man wg
。 - Address, DNS, MTU, Table, PreUp, PostUp, PreDown, PostDown, SaveConfig 见
man wg-quick
。
- PrivateKey, ListenPort, FwMark 见
- 用
wg-quick up wg0
即可启动 wg0 接口。
如果修改了配置文件,修改了[interface]部分。
则用wg-quick down wg0; wg-quick up wg0
重启接口。
或者systemctl restart wg-quick@wg0
重启接口。
或者systemctl reload wg-quick@wg0
重启接口。
如果只修改了[peer],在不影响当前连接的情况下刷新配置wg syncconf wg0 <(wg-quick strip wg0)
。 - 如果需要开机时自动启动接口。则需要激活一个服务,"wg-quick@接口名"。
systemctl enable wg-quick@wg0; system start wg-quick@wg0
- 在目录 "/etc/wireguard/" 中创建 接口"wg0" 对应的配置文件 ”wg0.conf"
- 然后,做一些外围的设置。
- 打开内核转发,"net.ipv4.ip_forward=1" , "net.ipv6.conf.all.forwarding=1"
在文件/etc/sysctl.conf
加入两行net.ipv4.ip_forward=1
,net.ipv6.conf.all.forwarding=1
然后执行sysctl -p
激活。 - 防火墙,允许 udp/54321 端口的外部访问。
- 设置防火墙,允许转发的规则。保留地址/内网地址 之间的访问。
- 设置防火墙 (按需),ip伪装,MASQUERADE。内网地址 访问 公网地址。
- 参考【How To Set Up WireGuard on Debian 11】。
- 打开内核转发,"net.ipv4.ip_forward=1" , "net.ipv6.conf.all.forwarding=1"
添加 peer 互连
- 修改之前创建的 wg0 接口的配置文件 "/etc/wireguard/wg0.conf"
在后面添加,一个,或多个 peer 的配置。
用[Interface] ...省略 (之前的配置)... [Peer] PublicKey = abcdefghick1234567..... PresharedKey = abcd12346abcd..... AllowedIPs = 192.168.23.2/32, fd24:609a:6c18::2/128 Endpoint = 203.2.3.4:54321 PersistentKeepalive = 25 #或 135
wg-quick down wg0; wg-quick up wg0
重启接口。
或者systemctl reload wg-quick@wg0
重启接口。
或者在不影响当前连接的情况下刷新配置wg syncconf wg0 <(wg-quick strip wg0)
。 - "[Peer]" 中支持以下配置项。
- PublicKey, PresharedKey, AllowedIPs, Endpoint, PersistentKeepalive 见
man wg
。
- PublicKey, PresharedKey, AllowedIPs, Endpoint, PersistentKeepalive 见
两边子网互连
- 前提条件是,两边的子网网段不冲突(不相同)。
- 需要打开内核转发,"net.ipv4.ip_forward=1" , "net.ipv6.conf.all.forwarding=1"
子网机器 有路由规则
- 如果你有权限在子网机器中,添加路由规则。
加上两条 wg网段和对方子网,via "wg中继"(debian主机)的路由规则。 - 参考openwrt LAN-LAN互连的做法。
- 在debian机器中,有 允许双向的转发规则即可。
无需增加 MASQUERADE 防火墙规则。
被访问的机,可以获得对方的真实IP。 - 如果 wg 两头的 debian 都增加 MASQUERADE 防火墙规则。就是基于NAT转发。
假设 debian机连接子网的网卡为: eth0。
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
双向也是 互通的。只是 被访问的机,不能获得对方的真实IP,看到的来源 IP是同侧 debian 的 eth0口 IP地址。
子网机器 无路由规则
- 如果你没有权限在某一侧的子网机器中,添加路由规则。
- 参考openwrt LAN-LAN互连中,有一个 WAN口的做法。
即,需要在 无权限添加路由 那一侧 debian 的 eth0 网口上 增加 MASQUERADE 规则。
网络只能单向访问。 - 在debian机器中,增加 MASQUERADE 防火墙规则。
假设 debian机连接子网的网卡为: eth0。
wireguard 接口为: wg0。
IP伪装规则应该: 从 wg0 -> eth0 的包,在 eth0出口处 才需要 Masq。
或 nft# 添加 # 应该只需 单向转发 #iptables -A FORWARD -i eth0 -o wg0 -j ACCEPT iptables -A FORWARD -i wg0 -o eth0 -j ACCEPT iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # 删除 iptables -D FORWARD -i wg0 -o eth0 -j ACCEPT iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# 添加 # 应该只需 单向转发 #nft add rule inet fw forward iifname "eth0" oifname "wg0" accept nft add rule inet fw forward iifname "wg0" oifname "eth0" accept nft add rule inet fw postrouting oifname "eth0" meta nfproto ipv4 masquerade # 删除 # nft 删除规则要通过 handle ID 来删除,可能需要编写一个脚本,添加时记录handle值,才能删除。 # 或者 脚本通过 规则内容,寻找 handle ID,再删除。 # 需要先创建好以下的 nft 表: table inet fw { chain forward { type filter hook forward priority filter; } chain postrouting { type nat hook postrouting priority srcnat; } }
- iptables 规则,可以考虑写入 WireGuard 配置文件 "PostUp=", "PostDown=" 中。
配置文件中,支持 "%i" 变量,对应当前的 wg 连接的接口。即 "wg0"。 - 如果 在两侧的子网机器中,你都没有权限添加路由规则。那就不能直接访问了。
考虑在两台 wg 的机器上,各装一个代理服务。子网机器 使用代理链去访问对方网段的机器吧。
DDNS
- Linux (debian, armbian, Centos) 的 wireguard 中 peer 的 Endpoint Host: 如果使用了 DDNS动态域名。
域名的IP变化,wireguard 不会自己更新。 - 执行
wg syncconf wg0 <(wg-quick strip wg0)
可刷新配置,重新解析ddns。
需要等到 PersistentKeepAlive 超时才会重新连接,通常是PersistentKeepalive乘以2 的时间。
这个命令,在man wg-quick
中有介绍。
此命令,不会影响 current peer sessions。 - 或者执行
wg setconf wg0 <(wg-quick strip wg0)
可刷新配置,重新解析ddns。
这个命令会让 wg0 立即重新解析后,马上连接。
此命令,会重启 wg0,可能会影响 current peer sessions。 - 所以,可以编写一个脚本,监控连接是否正常,或者监控ddns是否更换了IP。
然后用wg setconf wg0 <(wg-quick strip wg0)
刷新。 - 或者使用 wireguard-tools软件包中的脚本。
/usr/share/doc/wireguard-tools/examples/reresolve-dns/reresolve-dns.sh
把这个脚本 copy 到你喜欢的位置,比如cp reresolve-dns.sh /root/
此脚本需要带一个参数。如/root/reresolve-dns.sh wg0
,不影响 current peer sessions。
脚本检查指定的wg连接(通过参数指定),如果这个连接的 latest handshake > 135秒,则刷新此连接。
可考虑,此脚本每2分钟执行一次。
例,在crontab中,指定10分钟执行一次。*/10 * * * * /root/reresolve-dns.sh wg0
其他
- 如果大数据量的互访,不太稳定,或速度慢,可能是 mtu 太大的问题。
链路中的交换机丢弃了 大的数据包。- 在 "[Interface]" 中,把 mtu 设置为 1420 试试。
- 如果还是不行,再考虑,
在 iptables 的 mangle 表中,针对物理网口 (如 eth0)添加-j TCPMSS --clamp-mss-to-pmtu
规则。
Centos8
- 内核是 4.18,还没有支持 wireguard。
- 参考【wireguard官方安装文档】
- 我使用了 方法3 (Method 3) 安装了 dkms 内核模块 和 wireguard-tools。(2023-07测)
如果使用 方法1 (Method 1) 应该更好。- 尝试用 方法2,失败,说找不到 kmod-wireguard 包。(2024-10测)
- 尝试用 方法1,成功。就是要 reboot整个系统才生效。(2024-10测)
- ddns 刷新脚本在
/usr/share/doc/wireguard-tools/contrib/reresolve-dns/reresolve-dns.sh
。
内容和 debian11的一样。
配置
- Centos8 和 Debian11 的配置,完全相同。配置文件位置,使用的命令都一样。
因为都是用 wireguard-tools 和 systemctl。(2023-07测)
----end----
转载注明来源: 本文链接 https://www.cnblogs.com/osnosn/p/17589669.html
来自 osnosn的博客 https://www.cnblogs.com/osnosn/ .