Wireguard本身只是一个P2P tunnel,简单理解就是在设备之间拉了个网卡和网线,本身不定义网络拓扑。整个拓扑需要自行配置。相比openvpn那种复杂的配置server-side、client-side配置脚本下发。Wireguard则走了另外一个极端,配置极度简单,基于UDP,只提供有限、必要的选项。

在OpenWRT上配置门户

网上一堆文章相关配置文章,而且如果你用的是最新OpenWRT,LuCI基本能完成所有操作,旧版OpenWRT的LuCI可能无法生成Peer配置文件,这里不再详述。这里主要总结一下我碰到的问题和排查:

  1. 首先第一步,确认链接成功。是否链接成功要看上次handshake(握手)时间。如果一直没有收到握手,或者只有一方(路由或者客户端)收到握手表明网络不通,需要先排查这个问题。
  2. 握手成功后,表明网络已经搭起来,需要确定路由。如果你只是想访问内网设备,不需要所有流量都经过wg,在客户端AllowedIPs那部分只需要增加内网设备的网段192.168.0.0/16, ::/1, 8000::/1 类似这样,如果需要拦截其他流量,/1变成/0
  3. 局域网的设备如果默认路由不是走openwrt的,需要手动在该设备给wg网段添加静态路由。不然入站能收到,出站的路由没走openwrt设备依然是不通。
  4. Masquerading和DNAT并非必要。主要看你想要什么,如果你想访问的时候保留wg的地址信息,则不要勾选;wg访问内网设备要不需要经历一次nat;反之如果你想少点路由配置,打开Masquerading和DNAT,内网不再知道wg的ip段信息,所有的转换的都在路由完成。

其他常见问题

  • 如果你想主动连接到wg对端(Peer),PersistentKeepalive需要配置。否则在一段时间静默后,Peer所经过的路由NAT会话被销毁,无法再次主动连接到对端。具体的数值可以随意,单位秒,别太长,也别太短就行。另外有一个sideeffect,配置了这个之后,经过的路由可能会检测到这个特征流量。
  • EndpointIP改变的问题,由于是家宽,拨号会强制掉线,因此DDNS的IP肯定会改变。而wg本身不是connectionbase,而且也不会定期重新解析。因此需要外部机制定期更新,对于linux有一个脚本。Windows的话可以我自己也写了一个PS脚本