隧道组网¶
本文仍在编辑中
在网络中,隧道是一种将数据包从一个网络节点封装并传输到另一个网络节点的技术。它可以用于在两个不同的网络之间建立虚拟连接,也可以用于绕过防火墙或其他网络限制。
在隧道中,数据包会被封装在一个新的数据包中,并使用隧道协议进行传输。
在虚拟专用网络(VPN)中,隧道用于将用户设备与 VPN 服务器之间的通信加密并封装。这使得用户设备可以安全地连接到 VPN 服务器,并通过 VPN 服务器访问受限的网络资源,通常是内网环境(IntraNet)下的各种服务。
如今略显陈旧的 PPTP、SSTP、L2TP 协议下面不再提及。一些高校和企业使用的深信服 EasyConnect 由于服务端并未放出,且其仍在使用过时的 Java applet 实现 SSL VPN,因此略过。
IPsec¶
标准化程度高,支持广泛
GRE over IPsec¶
IKEv2¶
IKEv2 是一种安全性高、易于配置的 VPN 协议,由 IPsec 负责数据的传输安全,基于 UDP 协议。大部分系统都内建了对 IKEv2 协议的支持。
安装 strongSwan¶
在 Linux 上的开源 IKEv2/IPsec 实现有 strongSwan、Libreswan,和已经停止更新的 Openswan。本文使用 strongSwan。
大多数现代 Linux 发行版都可以直接从官方仓库中安装 strongSwan。例如,在基于 Debian 的系统(如 Ubuntu)上,你可以使用以下命令安装:
strongSwan 当前提供多种 daemon:
strongswan-starter.service
来自strongswan-starter
strongswan.service
来自charon-systemd
TODO
也可以使用如 yangzhaofengsteven/strongswan 等 docker 镜像。
配置证书和路由¶
AnyConnect¶
AnyConnect 是由思科开发的专用 VPN 协议,由 TLS 负责数据的传输安全。其客户端易于使用、并且跨平台,该协议较为流行。
然而 AnyConnect 作为 Cisco 专有协议,我们一般使用兼容 AnyConnect 协议的服务端 openconnect/ocserv。
安装 ocserv¶
yangzhaofengsteven/ocserv docker 镜像
OpenVPN¶
OpenVPN 是一款开源的 VPN 协议,使用 TLS 进行认证。相比其他协议,其服务端性能开销较大。
WireGuard¶
WireGuard 是一种现代的 VPN 协议,速度快、配置简单、安全性良好,基于 UDP 协议。
安装 WireGuard¶
大多数现代 Linux 发行版都可以直接从官方仓库中安装 WireGuard。例如,在基于 Debian 的系统(如 Ubuntu)上,你可以使用以下命令安装:
在 Red Hat 或 Fedora 系列的系统上,你可以使用 dnf
:
生成密钥对¶
每个 WireGuard 接口都需要一个私钥和公钥。wg genkey
生成一个私钥,wg pubkey
根据输入的私钥输出公钥。
使用下面的命令生成密钥对:
这将在当前目录下生成两个文件:privatekey
和 publickey
。
创建配置文件¶
这里以一个简单的场景为例,两台机器 A 和 B 进行组网。其中 A 有公网 IP,对应域名 example.com
。
A 的配置如下:
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <A 的私钥>
[Peer]
PublicKey = <B 的公钥>
AllowedIPs = 10.0.0.4/32
B 的配置如下:
[Interface]
Address = 10.0.0.4/24
PrivateKey = <B 的私钥>
[Peer]
PublicKey = <A 的公钥>
Endpoint = example.com:51820
AllowedIPs = 10.0.11.0/24
PersistentKeepalive = 25
上述配置文件中,密钥的替换成密钥的内容,而不是密钥文件的路径。
设备 A 的 VPN 内部 IP 地址设置为 10.0.0.1
,设备 B 的 VPN 内部 IP 地址设置为 10.0.0.4
,子网掩码为 24 位。
PersistentKeepalive = 25
代表每 25 秒发送一个无实质数据的心跳包,用于在 NAT 或防火墙环境中保持连接活跃。
AllowedIPs
指定了可以通过 VPN 发送到哪些 IP 地址的数据。例如 10.0.0.1/32
表示只有目标为 10.0.0.1
的数据包可以通过 VPN 发送给对方。
配置文件需要写在 /etc/wireguard/<配置名>.conf
中。例如:/etc/wireguard/wg0.conf
。
启动 WireGuard 接口¶
使用 wg-quick
工具启动 WireGuard 接口:
其中 wg0
是配置文件的名称,不包括 .conf
后缀。
检查接口状态¶
可以使用 wg
命令查看当前的 WireGuard 状态:
停止 WireGuard 接口¶
当不再需要时,可以使用以下命令停止接口:
Headscale¶
在部分场景下,单纯 Wireguard 不能很好满足需求,例如需要 peer-to-peer 之间的互联(不经过中心节点),或者在更复杂的网络环境下。Tailscale 便是一个解决方案,我们这里介绍 Headscale,一个开源的 Tailscale 服务端实现。
Headscale 仅是 Tailscale 的一个开源、可自行部署的实现,客户端仍需要使用 Tailscale。
安装 Headscale¶
截止编辑时,Headscale 尚不提供 apt repo,需要在 GitHub Release 选择 .deb
安装:
配置 Headscale¶
配置文件位于 /etc/headscale/config.yaml
,默认配置文件:https://github.com/juanfont/headscale/blob/main/config-example.yaml
启动 Headscale¶
安装 Headscale-ui¶
与 Tailscale 不同,Headscale 目前没有集成的 Admin Console,可以部署 headscale-ui 替代部分功能。这是一个纯静态的 Web 界面,可以在 GitHub Release 下载 headscale-ui.zip
。
配置反向代理¶
以 Caddy 为例,我们演示如何配置 Headscale & Headscale-ui:
headscale.****.**** {
handle_path /web* {
root * /var/www/headscale-ui
file_server
}
reverse_proxy * 127.0.0.1:8080
}
Nginx 配置文件可以参考:https://headscale.net/ref/integration/reverse-proxy/#nginx
设置 API Key¶
通过浏览器访问 /web
,在 Settings 界面中填写 API Key。
添加用户¶
客户端设置¶
与一般连接 Tailscale 方法不同,需要指定 --login-server
和 --auth-key
:
其中 authkey
可以在管理面板(headscale-ui)中获取,也可以使用下面的命令: