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 权限。
-
安装 ``` add-apt-repository ppa:wireguard/wireguard apt-get update apt-get install wireguard-dkms wireguard-tools linux-headers-$(uname -r)
-
生成服务器和客户端密钥 ``` 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
-
创建服务器端配置文件
在 /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通讯。
-
客户端配置文件
如果客户端是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转发。 -
启动虚拟网卡wg0 ``` chown -v root:root /etc/wireguard/wg0.conf chmod -v 600 /etc/wireguard/wg0.conf wg-quick up wg0 systemctl enable [email protected]
-
允许ip转发
修改/etc/sysctl.conf,取消注释
net.ipv4.ip_forward=1
然后,重启系统或者直接用如下操作:
sysctl -pecho 1 > /proc/sys/net/ipv4/ip_forward
-
修改防火墙规则 ``` 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
-
配置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。