WireGuard 号称下一代 VPN,直接基于 Linux Kernel,速度比 IPsec 还要快不少,下图是 WireGuard 和 其他 VPN 的对比:

WireGuard

我很早就想试一下,今天刚好有机会,把整个搭建过程记录一下。搭建一共分为 3 个部分,分别如下:

  1. 在 Linux 上配置 WireGuard 服务端
  2. 在 Linux 上配置 Unbound DNS
  3. 在 Mac 上配置 WireGuard 客户端
  4. 在手机上配置 WireGuard 客户端

在 Linux 上配置 WireGuard 服务端

Linux 服务器是 Ubuntu 16.04,其他发行版可以参看 官方文档

  1. 安装 WireGuard

    sudo add-apt-repository ppa:wireguard/wireguard
    sudo apt-get update
    sudo apt-get install wireguard-dkms wireguard-tools linux-headers-$(uname -r)
    

    ``

  2. 生成服务端与客户端的密钥

    wg genkey | tee server_private_key | wg pubkey > server_public_key # Server Key
    wg genkey | tee client_private_key | wg pubkey > client_public_key # Client Key
    

    ``

  3. 生成服务端配置文件 /etc/wireguard/wg0.conf,其中 wg0.conf 代表启动的网口名为 wg0

    [Interface]
    Address = 10.200.200.1/24
    PrivateKey = <insert server_private_key>
    ListenPort = 51820
    PostUp   = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
       
    [Peer]
    PublicKey = <insert client_public_key>
    AllowedIPs = 10.200.200.2/32
    

    ``

  4. 启动 WireGuard

    sudo chown root:root /etc/wireguard/wg0.conf
    sudo chmod 600 /etc/wireguard/wg0.conf
    sudo wg-quick up wg0
    sudo systemctl enable wg-quick@wg0.service # 加入开机启动(可选)
    sudo ifconfig wg0
    

    ``

    此时,应该可以看到 wg0 端口已经起来了

  5. 配置 Linux 内核转发

    echo "net.ipv4.ip_forward=1" | sudo tee -a  /etc/sysctl.conf
    sudo sysctl -p
    sudo cat /proc/sys/net/ipv4/ip_forward
    

    ``

    检查返回值为 1,表示内核转发已经开启

在 Linux 上配置 Unbound DNS

只配置 WireGuard 的话,VPN 连接依然可能被 DNS 劫持,所以最好让 VPN 客户端的 DNS 查询也通过服务端完成。

  1. 安装 Unbound

    sudo apt-get install unbound unbound-host
    

    ``

  2. 配置 Unbound

    sudo curl -o /var/lib/unbound/root.hints https://www.internic.net/domain/named.cache
    

    ``

    并且修改 /etc/unbound/unbound.conf 如下:

    server:
       
      num-threads: 4
         
      # Enable logs
      verbosity: 1
    
      # List of Root DNS Server
      root-hints: "/var/lib/unbound/root.hints"
    
      # Use the root servers key for DNSSEC
      auto-trust-anchor-file: "/var/lib/unbound/root.key"
    
      # Respond to DNS requests on all interfaces
      interface: 0.0.0.0
      max-udp-size: 3072
    
      # Authorized IPs to access the DNS Server
      access-control: 0.0.0.0/0                 refuse
      access-control: 127.0.0.1                 allow
      access-control: 10.200.200.0/24         allow
    
      # Not allowed to be returned for public internet names
      private-address: 10.200.200.0/24
    
      # Hide DNS Server info
      hide-identity: yes
      hide-version: yes
    
      # Limit DNS Fraud and use DNSSEC
      harden-glue: yes
      harden-dnssec-stripped: yes
      harden-referral-path: yes
    
      # Add an unwanted reply threshold
      unwanted-reply-threshold: 10000000
    
      # Have the validator print validation failures to the log.
      val-log-level: 1
    
      # Minimum lifetime of cache entries in seconds
      cache-min-ttl: 1800
    
      # Maximum lifetime of cached entries
      cache-max-ttl: 14400
      prefetch: yes
      prefetch-key: yes
    
    remote-control:
       
      # Only enable ipv4 interface
      control-interface: 127.0.0.1
    

    ``

  3. 启动 Unbound 服务

    sudo chown -R unbound:unbound /var/lib/unbound
    sudo systemctl start unbound
    sudo systemctl enable unbound
    

    ``

  4. 验证 Unbound

    nslookup www.google.com. 10.200.200.1
    unbound-host -C /etc/unbound/unbound.conf -v ietf.org #Testing DNSSEC
    

    ``

    如果有问题,可以使用 sudo journalctl -f -u unbound 查看日志信息

在 Mac 上配置 WireGuard 客户端

  1. 安装 WireGuard 客户端

    brew install wireguard-tools
    

    ``

  2. 配置 WireGurad 客户端

    sudo mkdir /etc/wiregurad 
    sudo touch /etc/wireguard/wg0-client.conf
    sudo chown root:root /etc/wireguard/wg0-client.conf
    sudo chmod 600 /etc/wireguard/wg0-client.conf
    

    ``

    wg0-client.conf 文件如下:

    [Interface]
    Address = 10.200.200.2/32
    PrivateKey = <insert client_private_key>
    DNS = 10.200.200.1
       
    [Peer]
    PublicKey = <insert server_public_key>
    Endpoint = SERVER_IP:51820
    AllowedIPs = 0.0.0.0/0
    PersistentKeepalive = 21
    

    ``

  3. 启动 WireGuard

    sudo wg-quick up wg0-client
    sudo wg show
    

    ``

至此,就可以完全使用 WireGuard 了。虽然整个过程略微麻烦,但是用起来还是非常开心的。希望未来 OSX 能官方支持,那就更完美了。

在手机上配置 WireGuard 客户端

WireGuard 已经有官方 iOSAndroid 客户端了,免费好用,支持直接导入文本配置,也可以扫二维码导入。

简单介绍一下怎么生成二维码:

brew install qrencode # mac
sudo apt-get install qrencode # ubuntu & debian
sudo cat /etc/wireguard/wg1-client.conf | qrencode -t ansiutf8

在手机上用 WireGuard 扫一下,就可以愉快的抛弃小 🚀 了。

参考文档

  1. Offical Guide
  2. Wireguard VPN: Typical Setup
  3. Reddit Question
  4. Debian Wireguard