
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, 安装虚拟网卡。运行界面如下:

点击 `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
```
好了,启动服务器。
然后联通客户端。如果配置不错,应该可以上网了。
有问题请留言。