create account

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

View this thread on: hive.blogpeakd.comecency.com
· @causenet · (edited)
科学上网指南(10)——wireguard
![pexels-photo-257906.jpeg](https://cdn.steemitimages.com/DQmbKd9z39GVhyWVcNda3DjZko73L3boS8gdu1reidCzrg8/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](https://tunsafe.com/)客户端。这个客户端是曾经开发μTorrent的ludde,为了tunsafe不开源的问题,他与wireguard的开发者有过好一番争执。不过最近,tunsafe已经开源了,在git上。

   Anyway,下载tunsafe, 安装虚拟网卡。运行界面如下:
   ![](https://cdn.steemitimages.com/DQmVATNiBXTo1jonit5E7aXtzdXcid7BFM56vCWAo5v64yX/image.png)

   点击 `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
```

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

有问题请留言。
👍  ,
properties (23)
authorcausenet
permlinkwireguard
categorycn
json_metadata{"tags":["cn","gfw","wireguard","vpn","dns"],"image":["https://cdn.steemitimages.com/DQmbKd9z39GVhyWVcNda3DjZko73L3boS8gdu1reidCzrg8/pexels-photo-257906.jpeg","https://cdn.steemitimages.com/DQmVATNiBXTo1jonit5E7aXtzdXcid7BFM56vCWAo5v64yX/image.png"],"links":["https://tunsafe.com/"],"app":"steemit/0.1","format":"markdown"}
created2018-08-26 04:26:36
last_update2018-08-26 04:33:27
depth0
children2
last_payout2018-09-02 04:26:36
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length4,927
author_reputation211,477,815,705
root_title科学上网指南(10)——wireguard
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id69,378,205
net_rshares6,791,907,181
author_curate_reward""
vote details (2)
@hcym ·
谢谢分享,终于成了
properties (22)
authorhcym
permlinkre-causenet-wireguard-20181031t130719824z
categorycn
json_metadata{"tags":["cn"],"app":"steemit/0.1"}
created2018-10-31 13:07:18
last_update2018-10-31 13:07:18
depth1
children0
last_payout2018-11-07 13:07:18
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length9
author_reputation0
root_title科学上网指南(10)——wireguard
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id74,407,509
net_rshares0
@sdream ·
博主辛苦了!谢谢分享!👍
properties (22)
authorsdream
permlinkre-causenet-wireguard-20180826t103613807z
categorycn
json_metadata{"tags":["cn"],"app":"steemit/0.1"}
created2018-08-26 10:36:15
last_update2018-08-26 10:36:15
depth1
children0
last_payout2018-09-02 10:36:15
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length12
author_reputation591,097,764,011
root_title科学上网指南(10)——wireguard
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd0
post_id69,398,757
net_rshares0