10
10
2017
11

WireGuard: 简单好用的 VPN

本文来自依云's Blog,转载请注明。

家里和公司电脑连接,因为厌倦了一个个做端口映射,有些还因为安全原因得走 ssh,所以决定弄个 VPN。之前使用过 OpenVPN,然而现在懒得再去配置 OpenVPN 的证书了,所以决定尝试一下新东西。

首先,去 WireGuard 官网上转了一圈,结果还是没弄明白怎么配置。后来尝试了一下 demo,把服务端和客户端的脚本分别看了一下,才弄明白。其实在 WireGuard 里,客户端和服务端基本是平等的,差别只是谁主动连接谁而已。双方都会监听一个 UDP 端口。双方都需要一对密钥。双方都需要把对方的公钥加进来。最后一步,谁主动连接,谁就是客户端。因为家里路由器有公网 IP,我做了端口映射,所以我当然是从公司连家里方便了,用不着麻烦的打洞脚本。

首先 pacman -S wireguard-tools 安装。这也会安装上 WireGuard 的内核模块。然后使用熟悉的 ip 命令添加并配置 WireGuard 的网络接口:

# 生成密钥对
wg genkey | tee privatekey | wg pubkey > publickey

sudo ip link add dev wg0 type wireguard
sudo ip address add dev wg0 192.168.58.1/24
sudo wg set wg0 listen-port 60010 private-key privatekey
sudo ip link set wg0 up

这是我家里的配置。使用的是网段 192.168.58.0/24,因为 56 是 vbox 虚拟机用的,57 分配给 lxc 和我的网络命名空间了。指定了一下监听的端口号。我把之前给 mosh 配置了转发的端口号中最高的那个挪用了。

公司里也是同时的配置,只是不需要指定监听端口号,然后把家里那边设置成 peer,并且连过去(相同的命令我没写):

sudo wg set wg0 private-key privatekey peer 这里是公钥 endpoint 家里的IP:60010 allowed-ips 0.0.0.0/0 persistent-keepalive 180

allowed-ips 指定过来的 IP。这里没怎么限制。persistent-keepalive 是为 NAT 设置的。WireGuard 本来很安静,不需要说话的时候就不说话,但是要往 NAT 后边的主机发送信息,需要经常通信,让 NAT 记得对应的映射关系。

然后家里那边也需要添加一下公司这边的公钥:

sudo wg set wg0 peer YiyFylL+1Dr3j2Cyf0lwXQYz2qaNwm3XyV5YvMFp3Vs= allowed-ips 192.168.58.2/32

IP 限制加上也是没有问题的。这里就不用加上 endpoint 了,它连过来的时候自然就知道了。WireGuard 是支持漫游的,也就是说,双方不管谁的地址变动了,WireGuard 在看到对方从新地址说话的时候,就会记住它的新地址(跟 mosh 一样,不过是双向的)。所以双方要是一直保持在线,并且通信足够频繁的话(比如配置 persistent-keepalive),两边的 IP 都不固定也不影响的。

最后,用得不错,可以把这几条命令写到一个 systemd service 文件里,就可以不用每次敲一串命令了,也可以做到联网后自动启动。


刚刚找了一下,其实之前使用的证书什么的还在,而且还没过期。而且因为弄 nghttpx,用了一下 xca,比 easy-rsa 好用很多呢。不过 WireGuard 的双向漫游很棒啊~

Category: 网络 | Tags: linux 网络 UDP | Read Count: 2925
Matriks 说:
Oct 11, 2017 10:13:29 AM

哇,依云大大弄个VPN都这么复杂,小白如我一个ss就简单粗暴的解决了。
不过感觉这种支持漫游的想法和技术真的很厉害:
“WireGuard 是支持漫游的,也就是说,双方不管谁的地址变动了,WireGuard 在看到对方从新地址说话的时候,就会记住它的新地址(跟 mosh 一样,不过是双向的)。所以双方要是一直保持在线,并且通信足够频繁的话(比如配置 persistent-keepalive),两边的 IP 都不固定也不影响的。”

lyman 说:
Oct 11, 2017 10:33:39 AM

好东西,感谢分享。

Avatar_small
依云 说:
Oct 11, 2017 02:00:35 PM

ss 是代理不是 VPN 啊。其实 ssh 也可以弄 VPN 的,不过 TCP over TCP 不好。

Matriks 说:
Oct 11, 2017 02:25:49 PM

我觉得把本地所有流量都走ss就成了vpn(#・∀・),可能是我想的太简单了吧

Avatar_small
依云 说:
Oct 11, 2017 03:44:34 PM

我不要把所有流量都走过去啊。其实我只是想搞 nfs 而已……哦,X Window 和 fcitx-remote 也可以走这个 VPN,不需要走 ssh 了。

Oooo 说:
Oct 15, 2017 02:31:53 PM

那叫全局代理。

另外需要说明的是: ss 只转发 TCP/UDP 流量。

还有,ss 的全局转发应该需要其他工具支持吧,默认是 "系统默认SOCKS5",也就是说需要 应用程序主动从系统配置获取 SOCKS5 代理信息,并使用之。

Oooo 说:
Oct 15, 2017 02:33:26 PM

真正的简单易用的全局代理在这里:

https://github.com/LuoZijun/rust-netproxy

虽然还在开发当中 ....

Oooo 说:
Oct 15, 2017 02:34:35 PM

@依云 大神,来帮我点个赞: https://github.com/LuoZijun/rust-netproxy

GlacJAY 说:
Oct 18, 2017 09:47:43 AM

漫游的话,记得 OpenVPN 也是支持的?

Uranus Zhou 说:
Oct 30, 2017 02:37:36 PM

我现在用 tinc VPN 的,直接用现成的 tun/tap,基本可以自己控制,可以 UDP 打洞或者自己配置 TCP 中继;
为了省事也给同事装了 ZeroTier,这个默认连中继服务器都带了。

alienzj 说:
Nov 10, 2017 01:27:12 AM

依云,你好!
请教你一个问题,我们公司的VPN没有提供Linux客户端(之前有提供Dell的vpn,后来VPN升级换成了Globalprotect(好像是叫这个名字),就没有Linux版的了),而我在家中主要用archlinux,我该怎么样才能在家里ssh上公司的集群呢?可以用你文中的方法搞吗?
谢谢你!


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

部分静态文件存储由又拍云存储提供。 | Theme: Aeros 2.0 by TheBuckmaker.com