Skip to content

科学上网指南(10)——wireguard

阅读本文大约需要: 5 分钟

wireguard 是一款新颖、简单、快速的vpn,所谓点对点通讯的vpn。

它的特点是:

  • 采用最新的加密技术
    • 对称加密采用 ChaCha20 ,身份认证采用 Poly1305, 采用 RFC7539 AEAD 头数据构造
    • 密钥交换协议采用 椭圆曲线 Curve25519
    • 哈希表采用 BLAKE2s (RFC7693)
    • 密钥签名采用 SipHash24
    • 密钥生成采用HKDF ( RFC5869)

总而言之,多年不做加密,我这个曾经入选国家保密专家委员会候选人的博士,已经成为“砖家”了。

  • 采用非对称加密方式交换数据。
  • 跨平台
  • 速度极快
  • 直接运行在linux内核,因此性能优于openVPN等应用层的vpn。
  • 采用点对点认证,udp无状态通讯。如果没有通讯,客户端和服务器都保持静默。如果客户端发出的数据不对,服务器直接丢弃,并不给予任何回应。

为了在linux上配置wireguard,需要独立服务器或者kvm虚拟机。openVS不行,因为wireguard要进入内核,而openVS共享内核,所以无法获得操作权限。

KVM略微贵一点,大概一年20美元可以搞定。考虑到我加一次油也不止20美元,所以这点钱还是值得的。当然,如果你有独立服务器,就可以随便折腾。声明一句,最好买哪种可以无限次数安装系统的vps,否则很容易把系统折腾死。


以下默认root 权限。

  1. 安装
    add-apt-repository ppa:wireguard/wireguard
    apt-get update
    apt-get install wireguard-dkms wireguard-tools linux-headers-$(uname -r)
    
  2. 生成服务器和客户端密钥
    cd /etc/wireguard/
    umask 077
    wg genkey | tee server_private_key | wg pubkey > server_public_key
    wg genkey | tee client_private_key | wg pubkey > client_public_key
    
  3. 创建服务器端配置文件
    在 /etc/wireguard/ 下创建wg0.conf文件。

    [Interface]
    Address = 10.200.200.1/24
    SaveConfig = true
    PrivateKey = 服务器的私钥
    ListenPort = 51820
    
    [Peer]
    PublicKey = 客户端的公钥
    AllowedIPs = 10.200.200.2/32
    

    wg0.conf对应一个叫wg0的虚拟网卡。
    AllowedIPs = 10.200.200.2/32 指定客户端用这个地址,附加公钥认证通过的客户才可以通讯。
    ListenPort = 51820 是服务器端的监听端口,可以修改为别的端口。有人甚至写了一个脚本,随机改变端口,避免端口扫描程序识别wireguard通讯。

  4. 客户端配置文件
    如果客户端是Linux,配置方式基本和服务器一样。

    采用windows客户的人,可以下载tunsafe客户端。这个客户端的作者是曾经开发μTorrent的ludde,为了tunsafe不开源的问题,他与wireguard的开发者jason有过好一番争执。不过最近,tunsafe已经开源了,在git上。

    Anyway,下载tunsafe, 安装虚拟网卡。运行界面如下:

    点击 edit config,配置客户端:

    [Interface]
    Address = 10.200.200.2/32
    PrivateKey = 客户端的私钥
    DNS = 10.200.200.1
    
    [Peer]
    PublicKey = 服务器的公钥
    Endpoint = 服务器的物理ip地址:51820
    AllowedIPs = 0.0.0.0/0
    PersistentKeepalive = 21
    

    说明,客户端和服务器端主要的差别在于,客户端的PrivateKey对应服务器端[peer]的PublicKey,服务器端的私钥则对应客户端的[peer]里的公钥。

    Endpoint = 服务器的物理ip:51820 要用vps实际的ip和端口替换。
    AllowedIPs = 0.0.0.0/0 表示所有通讯都通过vpn转发。

  5. 启动虚拟网卡wg0
    chown -v root:root /etc/wireguard/wg0.conf
    chmod -v 600 /etc/wireguard/wg0.conf
    wg-quick up wg0
    systemctl enable wg-quick@wg0.service 
    
  6. 允许ip转发
    修改/etc/sysctl.conf,取消注释
    net.ipv4.ip_forward=1
    然后,重启系统或者直接用如下操作:
    sysctl -p
    echo 1 > /proc/sys/net/ipv4/ip_forward
  7. 修改防火墙规则
    iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    iptables -A INPUT -p udp -m udp --dport 51820 -m conntrack --ctstate NEW -j ACCEPT
    iptables -A INPUT -s 10.200.200.0/24 -p tcp -m tcp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
    iptables -A INPUT -s 10.200.200.0/24 -p udp -m udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
    iptables -A FORWARD -i wg0 -o wg0 -m conntrack --ctstate NEW -j ACCEPT
    iptables -t nat -A POSTROUTING -s 10.200.200.0/24 -o eth0 -j MASQUERADE
    

    将规则保存起来:

    apt-get install iptables-persistent
    systemctl enable netfilter-persistent
    netfilter-persistent save
    
  8. 配置dns服务器。
    最近有研究指出,中国移动大概屏蔽了40%的dns请求。如果使用公共dns,显然面临投毒、插入广告、被指向钓鱼网站等风险。即使什么风险也没有,dns泄漏也会暴露你的ip,让你的匿名性受到损害。
    所以,最好在vps上配置dns服务器,让所有通过wireguard的dns查询请求,都隐藏在vps后面。

    下面是安装unbound服务器的简单方式:

    apt-get install unbound unbound-host
    curl -o /var/lib/unbound/root.hints https://www.internic.net/domain/named.cache
    

    安装unbound和根服务器缓存。

    配置/etc/unbound/unbound.conf

    server:
    
    num-threads: 4
    
    #允许日志
    verbosity: 1
    
    #根服务器列表
    root-hints: "/var/lib/unbound/root.hints"
    
    #DNSSEC的根密钥文件
    auto-trust-anchor-file: "/var/lib/unbound/root.key"
    
    #允许查询任意网站的dns
    interface: 0.0.0.0
    max-udp-size: 3072
    
    #仅允许本机和10.200.200.0/24段ip访问
    access-control: 0.0.0.0/0                 refuse
    access-control: 127.0.0.1                 allow
    access-control: 10.200.200.0/24         allow
    
    #不进入公共dns服务器列表
    private-address: 10.200.200.0/24
    
    #隐藏信息
    hide-identity: yes
    hide-version: yes
    
    #强制DNSSEC
    harden-glue: yes
    harden-dnssec-stripped: yes
    harden-referral-path: yes
    
    #Add an unwanted reply threshold to clean the cache and avoid when possible a DNS Poisoning
    unwanted-reply-threshold: 10000000
    
    #验证地址,记录dns投毒事件(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
    

    配置服务。

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

好了,启动服务器。
然后联通客户端。如果配置不错,应该可以上网了。

有问题请留言。

(update: 2018年圣诞节,wireguard ios 客户端上线了。)

关于centos安装wireguard的内核升级,参见 升级CentOS内核——Wireguard

%d bloggers like this: