用 WireGuard 运行您自己的 VPN
WireGuard 是内置于 Linux 内核的 VPN 协议,几条命令就能搭好您自己的 VPN 服务器。自己的 VPN 会让您的流量从您可控的 IP 地址出去。但它不会让您匿名:您访问的网站看到的是您服务器的 IP 地址。
本文介绍自己的 VPN 适合做什么、不能解决什么,手动安装步骤,以及带网页界面的更简单做法。
自己的 VPN 适合做什么?
- 公共 Wi-Fi:在咖啡馆或酒店的网络中,您的流量会一路加密传输到您的服务器。
- 在国外使用土耳其 IP:因为服务器在伊斯坦布尔,您身在国外时也可以使用土耳其的 IP 地址上网。
- 访问私有网络:您可以访问接入同一个 VPN 的设备和服务器上的服务,就像大家都在同一个局域网中。
- 固定的出口地址:即使家里的 IP 变了,您的 VPN 出口也保持不变。
它不能解决什么?
- 它不会让您匿名。网站看到的是您服务器的 IP 地址,而该地址与您的账户相关联。
- 有些服务会屏蔽数据中心的 IP 地址。不要以为每项服务都能通过您的 VPN 打开。
- 它不提供多个国家的出口。您的服务器只在一个地方,在 Seturack 就是伊斯坦布尔。
- 它并不是为向他人提供上网服务而设计的。如果您通过自己的服务器向他人提供上网服务,根据服务协议,第 5651 号法律规定的义务由您承担。请主要把 VPN 用于您自己的设备,并在让其他人使用之前阅读服务协议。
人们为什么喜欢 WireGuard
- 它从 5.6 版本起进入 Linux 内核,所以在当前的发行版上,不需要另外安装驱动。
- 没有密码。每一端都由自己的私钥和公钥对来识别。
- 配置很简短,一个文件就够了。
- 它使用 UDP。示例和工具中最常见的端口是 51820。
手动安装(Ubuntu,以 root 身份)
- 安装软件包:
apt install wireguard - 生成服务器的密钥对:
umask 077 && wg genkey | tee privatekey | wg pubkey > publickey - 让每台客户端设备自己生成密钥。手机和电脑上的 WireGuard 应用会完成这一步,您只需要它的公钥。
- 按照下表编写
/etc/wireguard/wg0.conf。 - 开启 IP 转发:
echo 'net.ipv4.ip_forward=1' | tee /etc/sysctl.d/70-wireguard.conf,然后运行sysctl --system - 在防火墙中开放端口:
ufw allow 51820/udp - 启动:
systemctl enable --now wg-quick@wg0
| 段落 | 行 | 作用 |
|---|---|---|
| [Interface] | Address = 10.8.0.1/24 | 服务器在 VPN 网络内的地址 |
| [Interface] | ListenPort = 51820 | 监听的 UDP 端口 |
| [Interface] | PrivateKey = privatekey 文件的内容 | 服务器的私钥。绝不要分享 |
| [Interface] | PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE | 把客户端流量转发到互联网。请把 eth0 换成您服务器的网卡名称,可用 ip route show default 查看 |
| [Interface] | PostDown = 同样的三条规则,把 -A 换成 -D | VPN 停止时移除这些规则 |
| [Peer] | PublicKey = 客户端的公钥 | 用来识别这个客户端 |
| [Peer] | AllowedIPs = 10.8.0.2/32 | 分配给客户端的 VPN 地址 |
先把 [Interface] 的各行写入文件,再写 [Peer] 的各行。每个客户端有自己的 [Peer] 块。
连接客户端
在客户端的 [Interface] 段中,填入您自己的私钥、Address = 10.8.0.2/24 这一行和一个 DNS 地址。在 [Peer] 段中,填入服务器的公钥、Endpoint = SERVER_IP:51820 这一行和 AllowedIPs = 0.0.0.0/0 这一行。最后一个值会让所有 IPv4 流量都走隧道。如果只想访问 VPN 网络,请改写 10.8.0.0/24。对于位于 NAT 或防火墙之后的设备,官方文档建议使用 PersistentKeepalive = 25。
在服务器上运行 wg show。如果客户端已连接,您会看到一行“latest handshake”。
全部流量还是部分流量?
客户端上的 AllowedIPs 值决定哪些流量进入隧道。0.0.0.0/0 会让所有 IPv4 流量走隧道,但 IPv6 不会。如果您的设备有 IPv6,这部分流量可以绕过隧道。使用 0.0.0.0/0, ::/0 时,IPv6 也会进入隧道并在那里被丢弃,因为服务器不承载 IPv6,所以不会泄露。如果只想访问某些网络,例如 10.8.0.0/24,就只写这些。这称为分流隧道(split tunneling),其余流量走正常路径。对于远程访问某个网络,分流隧道往往就足够了。其余流量不经过隧道,所以不会被拖慢。
更简单的方式:wg-easy
wg-easy 是一个把 WireGuard 服务器和客户端管理与网页界面打包在一起的工具。它可以添加和删除客户端,并为手机显示二维码。它用 Docker Compose 安装,使用 51820/UDP。如果想安全地把管理界面开放到互联网,建议使用反向代理。
Seturack 现成的 WireGuard 服务器使用 wg-easy,大约 4 分钟即可就绪。在面板中您会看到管理地址和密码。隧道只承载 IPv4。请为每台设备创建单独的客户端,如果丢了设备,只需删除它对应的客户端。连接步骤见 WireGuard 帮助文章。
设置您的设备
WireGuard 提供适用于 Windows、macOS、Android 和 iOS 的官方应用。在 Linux 上,装软件包就够了。在手机上用二维码添加配置,在电脑上则导入配置文件。您可以在应用中开关隧道。隧道开启期间,您的上网流量会从您的服务器出去。
四条小小的安全规则
- 只让 root 能读取配置文件:
chmod 600 /etc/wireguard/wg0.conf - 绝不要把私钥发给任何人。您唯一要分享的是公钥。
- 删除您丢失的、或不想再允许的设备所对应的
[Peer]块。 - 保持服务器更新。安装完成后,操作系统和应用的更新由您负责。
因为您的 VPN 流量要经过服务器,流量大小也很重要。Seturack 的价格已包含不限流量。
如果连接不上
有些网络会拦截 UDP 流量。请换一个网络试试,例如手机的移动数据。同时检查防火墙中是否开放了 51820/UDP 端口。
如果想从现成的安装开始,请看 WireGuard VPN 页面。
评论0
暂无评论
成为第一个分享想法的人。
请登录或注册后发表评论。