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

in cn •  6 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"

#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


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

有问题请留言。
Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

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

谢谢分享,终于成了