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

in #cn6 years ago (edited)

pexels-photo-257906.jpeg
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的开发者有过好一番争执。不过最近,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 [email protected] 
    
  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"


auto-trust-anchor-file: "/var/lib/unbound/root.key"#DNSSEC的根密钥文件

#允许查询任意网站的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


unwanted-reply-threshold: 10000000#Add an unwanted reply threshold to clean the cache and avoid when possible a DNS Poisoning

#验证地址,记录dns投毒事件(Have the validator print validation failures to the log.)
val-log-level: 1


cache-min-ttl: 1800#Minimum lifetime of cache entries in seconds


cache-max-ttl: 14400
prefetch: yes
prefetch-key: yes#Maximum lifetime of cached entries

配置服务。

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


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

有问题请留言。
Sort:  

博主辛苦了!谢谢分享!👍

谢谢分享,终于成了