首先说明当前的配置:
家里没有公网 IP ,因此使用了 1 台国内 VPS 作为 Wireguard 服务器
家里 1 台软路由搭建了 openwrt ( A ) 接入 wireguard 局域网
iOS ( B ) 使用也接入 wireguard 局域网
整体的网络结构和 peer 设置如下
目前 A 和 B 可以互相 ping 通,但是看了下 trace 发现是通过 server 做了中转,没有直接打洞成功,想请问各位大佬如何设置才能让 A 和 B 直接打洞成功呢。求大佬们指点迷津!
1
f165af34d4830eeb 2023-09-13 00:38:28 +08:00
如果不是有特别的需求,个人建议换 zerotier/tailscale ( vps 可以改造成自建 controller 辅助打洞/中继),不需要自己操心打洞的事情了。
|
2
superhack 2023-09-13 00:38:35 +08:00 via Android
wg set peer xxxxxx endpoint yyyy
|
3
cruisetian OP @superhack 请问这个命令是在 server 上执行吗
|
4
qsnow6 2023-09-13 00:56:42 +08:00
建议换 tailscale ,更新配置、打洞、配子网啥的非常方便
|
5
cruisetian OP @qsnow6 希望可以在手机上同时回家和出国,手机又不允许两个 vpn 同时开,只能用 wireguard 打洞把 wireguard 配到出国软件上了
|
6
qsnow6 2023-09-13 01:08:17 +08:00
@cruisetian #5 家里开个 socks5 代理,当访问子网 IP 时,通过小火箭设置使用代理连接。
|
7
qsnow6 2023-09-13 01:09:08 +08:00
这个 socks5 需要暴露在公网,设置好密码。
|
8
thsun 2023-09-13 02:29:44 +08:00 via iPhone
没公网不行,走 IPv6 就可以不走中转
|
9
SuzutsukiKaede 2023-09-13 02:40:27 +08:00
你的需求需要用到 Wireguard 的 full mesh 模式,建议使用现成的方案 Tailscale 。
|
10
SuzutsukiKaede 2023-09-13 02:45:08 +08:00
|
11
cruisetian OP @SuzutsukiKaede 好的,我去看下研究下,不行就 tailscale 了
|
12
server 2023-09-13 08:38:14 +08:00
不折腾 tailscale ,记得把 mtu 该下,TS_DEBUG_MTU="1420"
|
13
diskerjtr 2023-09-13 10:21:11 +08:00
你 2 边都是 nat 后面,如果 2 边都没有公网 IP ,只能靠中转。
|
14
chancat 2023-09-14 18:22:34 +08:00 via Android
推荐 tailscale
|
15
ysc3839 2023-09-14 23:34:46 +08:00 via Android
WireGuard 不支持打洞,要自动打洞的话可以考虑 ZeroTier 。
或者如果 A 或 B 其中之一有 fullcone NAT 的话,可以考虑使用 natmap 开端口,另一端连接,不过端口很可能是随机的。 https://github.com/heiher/natmap |
16
dangyuluo 2023-09-15 03:21:17 +08:00
你要理解 Wireguard 的原理,peer to peer
|
17
gps949 2023-09-15 12:20:43 +08:00
@cruisetian #5 你回家出国不就可以既回家又出国了?
|
18
mcsonger 2023-09-15 12:24:57 +08:00
至少有一台机器是公网
|
19
mantouboji 2023-09-15 22:42:29 +08:00
纯 IPv4 情况下,你目前的使用方式和现象是正常的。
如果你有强迫症,那么要打开 IPv6 ,B 那个设备去连 A 的 IPv6 地址。这个地址因为每三天要变一次,可以用 dynv6 的动态域名。这也是我目前用的方式。只不过我是移动的宽带,光猫拨号,你那个 A 我这里是一台 Mikrotik AX2 |
20
lovelylain 2023-09-16 09:05:18 +08:00 via Android
@cruisetian 目标是手机上打洞配合原生 wireguard 的话难搞,因为 nat 打洞工具要 root 权限。有公网 ip(包括 IPv6)的话可以给家里 ddns ,然后手机上设置 endpoint 为家里域名,对 wg 网段、家里网段、fakeip 网段连家里。没公网 ip 或者手机端只有 v4 访问不了家里的 v6 就很难搞了。
|
21
cnbatch 2023-09-17 03:48:00 +08:00
最佳方案是使用 IPv6 直连
如果仍然想用 IPv4 ,有个折衷的办法,套一层 udphop: /t/898299 虽然这个工具原本的用途是为了避开 QoS ,但其实对于 OP 这种情况也能用——首先在服务端打洞(已自带打洞选项),然后客户端连过去,只要隧道内能够一直保持有流量(哪怕 1KB/s 都可以)、两边的网络都不是同时换 IP 的话,那么这条连接就可以一直保持畅通 |
22
sunnysab 2023-09-19 18:53:30 +08:00
Wireguard 本身为了保证自身的简单性,没有 NAT, 需要自己写代码实现。
官方例子: https://github.com/WireGuard/wireguard-tools/tree/master/contrib/nat-hole-punching :D |
25
huaxie1988 2023-09-23 08:53:02 +08:00 via Android
ipv6 直连配合 ddns
|