最近沉迷网络,日渐憔悴(大误)。遂发现一神器,正是我梦寐以求的 XXX to UDP 方案。

虽然早有 L2TP 驰骋于世间,可是:

  • IPSec 握手如此麻烦,还常常受到众所周知的原因干扰,让人无比心痛
  • 又曰 L2TP 的服务器啊,配置起来真太麻烦了(虽然有脚本也不能说麻烦了)
  • 更让人心痛的是,L2TP 的客户端也不走心啊,随便搞一个什么强壮的天鹅( StrongSwan ),想想都觉得疼

简单说,Wireguard 基本就是盯着我的痛点的一个项目:

  • 一个 RTT 就可以完成握手(白皮书提到防范 DDOS 可能要两个)
  • 安装配置都好简单,客户端、服务端其实是对称的
  • 底层用 UDP,根本没有 TCP over TCP 的问题了(TCP fast open 是什么?能吃嘛?)
  • 内核态效率还真的很高(不过这个也有更严重的安全问题,不过作者说得也不错,4000 行代码的实现,没有动态内存分配的问题,安全问题还是很好审计的。嗯…不过目前我也没仔细看代码。新东西,期待早日官方软件源收录。)

OK,安装(其实可以参考官方文档):

$ sudo add-apt-repository ppa:wireguard/wireguard
$ sudo apt-get update
$ sudo apt-get install wireguard

在装一个内核的头:

$ uname -a # check the kernel version
$ sudo apt search linux-headers-XXXXX # XXX is your version
$ sudo apt install linux-headers-YYYYY

搞一个 Key:

$ wg genkey
<Private_Key>

配置 /etc/wireguard/wg0.conf

[Interface]
ListenPort = 4321
PrivateKey = <Private_Key>
Address = 192.168.0.1/24
PostUp = iptables --wait 120 -t nat -A POSTROUTING -s 192.168.0.0/24 -o ens3 -j MASQUERADE && iptables --wait 120 -A FORWARD -s 192.168.0.0/24 -j ACCEPT
PreDown = iptables --wait 120 -t nat -D POSTROUTING -s 192.168.0.0/24 -o ens3 -j MASQUERADE && iptables --wait 120 -D FORWARD -s 192.168.0.0/24 -j ACCEPT
Table = off

[Peer]
PublicKey = <Client_Public_Key>
AllowedIPs = 192.168.0.2/32

启用(命令放到 /etc/rc.local 每次启动就都没问题了):

$ sudo sysctl -w net.ipv4.ip_forward=1
$ sudo wg-quick up wg0

(如果没有 wg-quick 可以按照官方文档一步步来。)

跑一下看看情况:

$ wg
interface: wg0
  public key: <Public_Key>
  private key: (hidden)
  listening port: 4321

Public_Key 填到另外一个电脑就 OK 啦!

本文配合 Open WRT / Wireguard / IPSet / Route 食用效果更佳。