使用 EasyTier 构建个人 VPN
这篇直接写成轮椅版,不讲太多概念,目标是:复制命令,改几个变量,然后跑起来。
适合这几种需求:
- 外面访问家里的 NAS、开发机、路由器后台;
- 多台机器组成一个自己的虚拟内网;
- 不想给每个服务单独做公网暴露;
- 不想手写复杂的 WireGuard / OpenVPN 配置。
EasyTier 的核心就三个东西:
text网络名 + 网络密钥 + 自己的公网 peer 节点
这篇直接按“自建公网 peer”的方式来。流程是:先在云服务器上起一个稳定入口节点,然后家里服务器、笔记本、其他设备都连接到这台云服务器。
先决定你的部署方式
我建议按这个顺序选:
| 场景 | 推荐方式 |
|---|---|
| 服务器 / NAS 已经有 Docker | Docker Compose |
| VPS 很干净,不想装 Docker | systemd / systemctl |
| 只是临时测试 | 命令行直接跑 |
下面流程按这个顺序来:
- 先在云服务器上搭一个 自建公网 peer 节点;
- 再把家里服务器、笔记本等普通节点接进来;
- 如果要访问家里内网,再在家里节点发布内网网段。
需要先准备的几个值
后面的脚本只需要改这几个变量:
| 变量 | 示例 | 说明 |
|---|---|---|
ET_NETWORK_NAME |
my-home |
VPN 网络名,所有节点保持一致 |
ET_NETWORK_SECRET |
change-me-to-a-strong-password |
VPN 密钥,所有节点保持一致 |
ET_HOSTNAME |
home-server |
当前设备名称,每台机器建议不同 |
ET_PEER |
tcp://1.2.3.4:11010 |
你的云服务器 peer 地址 |
ET_PROXY_NETWORKS |
192.168.31.0/24 |
可选,把当前机器能访问的内网网段发布出去 |
ET_PEER 后面会在云服务器节点搭好之后得到,一般就是:
bashexport ET_PEER="tcp://<云服务器公网IP>:11010"如果你给云服务器配了域名,也可以写成:
bashexport ET_PEER="tcp://vpn.example.com:11010"最快测试命令
如果你已经下载好了 easytier-core,可以先用两条命令理解一下流程。
云服务器上先启动监听节点:
bashsudo ./easytier-core \
-d \
--network-name my-home \
--network-secret change-me-to-a-strong-password \
--hostname cloud-node \
-l 11010然后其他机器连接它:
bashsudo ./easytier-core \
-d \
--network-name my-home \
--network-secret change-me-to-a-strong-password \
--hostname home-server \
-p tcp://<云服务器公网IP>:11010默认情况下,EasyTier 会自动分配 10.126.126.0/24 里的虚拟 IP。
第一步:搭建自建公网 peer 节点
先在云服务器上搭一个固定入口。后面的所有节点都连接它。
云服务器需要放行:
textTCP 11010 UDP 11010
如果你不想折腾,至少先放行 TCP 11010,后面节点的 ET_PEER 就用 tcp://<云服务器公网IP>:11010。
Docker Compose 版本
在云服务器上运行下面这段:
bashexport ET_NETWORK_NAME="my-home"
export ET_NETWORK_SECRET="change-me-to-a-strong-password"
export ET_HOSTNAME="cloud-node"
mkdir -p ~/docker/app/easytier/conf
cd ~/docker/app/easytier
cat > docker-compose.yml <<'EOF'
services:
easytier:
image: easytier/easytier:latest
hostname: easytier
container_name: easytier
restart: unless-stopped
network_mode: host
cap_add:
- NET_ADMIN
- NET_RAW
environment:
- TZ=Asia/Shanghai
devices:
- /dev/net/tun:/dev/net/tun
volumes:
- /etc/machine-id:/etc/machine-id:ro
- ./conf:/config
command: >
-c /config/easytier.toml
EOF
cat > conf/easytier.toml <<EOF
network_name = "${ET_NETWORK_NAME}"
network_secret = "${ET_NETWORK_SECRET}"
hostname = "${ET_HOSTNAME}"
dhcp = true
listeners = [
"tcp://0.0.0.0:11010",
"udp://0.0.0.0:11010"
]
EOF
docker compose up -d
docker compose logs -f后面其他节点统一使用这个 peer:
bashexport ET_PEER="tcp://<云服务器公网IP>:11010"systemd 版本
如果云服务器不想装 Docker,就用 systemd。
前提:easytier-core 和 easytier-cli 已经放在:
text/opt/easytier/easytier-core /opt/easytier/easytier-cli
复制运行:
bashexport ET_NETWORK_NAME="my-home"
export ET_NETWORK_SECRET="change-me-to-a-strong-password"
export ET_HOSTNAME="cloud-node"
sudo mkdir -p /etc/easytier
sudo tee /etc/easytier/easytier.toml > /dev/null <<EOF
network_name = "${ET_NETWORK_NAME}"
network_secret = "${ET_NETWORK_SECRET}"
hostname = "${ET_HOSTNAME}"
dhcp = true
listeners = [
"tcp://0.0.0.0:11010",
"udp://0.0.0.0:11010"
]
EOF
cd /opt/easytier
sudo ./easytier-cli service install \
--description "EasyTier personal VPN" \
--display-name "EasyTier" \
--core-path /opt/easytier/easytier-core \
--service-work-dir /opt/easytier \
-- \
-c /etc/easytier/easytier.toml
sudo ./easytier-cli service start
sudo ./easytier-cli service status第二步:接入普通节点
普通节点就是家里的服务器、笔记本、其他 VPS 等。它们都连接第一步的云服务器 peer。
Docker Compose 一键运行
这是我最推荐的方式。直接复制下面这段,在普通节点上运行。
普通节点
这个版本适合笔记本、家里服务器、普通 VPS 加入 VPN,不发布家庭内网。
只需要改开头的四个变量:
bashexport ET_NETWORK_NAME="my-home"
export ET_NETWORK_SECRET="change-me-to-a-strong-password"
export ET_HOSTNAME="home-server"
export ET_PEER="tcp://<云服务器公网IP>:11010"
mkdir -p ~/docker/app/easytier/conf
cd ~/docker/app/easytier
cat > docker-compose.yml <<'EOF'
services:
easytier:
image: easytier/easytier:latest
hostname: easytier
container_name: easytier
restart: unless-stopped
network_mode: host
cap_add:
- NET_ADMIN
- NET_RAW
environment:
- TZ=Asia/Shanghai
devices:
- /dev/net/tun:/dev/net/tun
volumes:
- /etc/machine-id:/etc/machine-id:ro
- ./conf:/config
command: >
-c /config/easytier.toml
EOF
cat > conf/easytier.toml <<EOF
network_name = "${ET_NETWORK_NAME}"
network_secret = "${ET_NETWORK_SECRET}"
hostname = "${ET_HOSTNAME}"
dhcp = true
peers = [
"${ET_PEER}"
]
EOF
docker compose up -d
docker compose logs -f看到日志正常启动后,按 Ctrl + C 退出日志即可,容器会继续在后台运行。
常用命令:
bash# 查看状态
docker compose ps
# 查看日志
docker compose logs -f
# 重启
docker compose restart easytier
# 停止
docker compose stop
# 删除容器,不删除配置
docker compose down发布家庭内网的节点
如果这台机器在家里,并且你希望人在外面也能访问家里的整个网段,比如:
text192.168.31.0/24
那就用这个版本。多改一个 ET_PROXY_NETWORKS:
bashexport ET_NETWORK_NAME="my-home"
export ET_NETWORK_SECRET="change-me-to-a-strong-password"
export ET_HOSTNAME="home-server"
export ET_PEER="tcp://<云服务器公网IP>:11010"
export ET_PROXY_NETWORKS="192.168.31.0/24"
mkdir -p ~/docker/app/easytier/conf
cd ~/docker/app/easytier
cat > docker-compose.yml <<'EOF'
services:
easytier:
image: easytier/easytier:latest
hostname: easytier
container_name: easytier
restart: unless-stopped
network_mode: host
cap_add:
- NET_ADMIN
- NET_RAW
environment:
- TZ=Asia/Shanghai
devices:
- /dev/net/tun:/dev/net/tun
volumes:
- /etc/machine-id:/etc/machine-id:ro
- ./conf:/config
command: >
-c /config/easytier.toml
EOF
cat > conf/easytier.toml <<EOF
network_name = "${ET_NETWORK_NAME}"
network_secret = "${ET_NETWORK_SECRET}"
hostname = "${ET_HOSTNAME}"
dhcp = true
peers = [
"${ET_PEER}"
]
proxy_networks = [
"${ET_PROXY_NETWORKS}"
]
EOF
docker compose up -d
docker compose logs -f这个节点启动后,其他 VPN 节点就可以通过它访问 192.168.31.0/24。
例如:
text192.168.31.1 # 路由器后台 192.168.31.10 # NAS 192.168.31.20 # 开发机
注意,这台发布网段的机器自己必须能访问这些内网地址,否则其他节点也访问不了。
systemd 一键注册
如果普通节点不想用 Docker,就用这个方案。适合干净的 Linux 主机。
前提:easytier-core 和 easytier-cli 已经放在同一个目录,比如:
text/opt/easytier/easytier-core /opt/easytier/easytier-cli
普通节点
复制运行:
bashexport ET_NETWORK_NAME="my-home"
export ET_NETWORK_SECRET="change-me-to-a-strong-password"
export ET_HOSTNAME="home-server"
export ET_PEER="tcp://<云服务器公网IP>:11010"
sudo mkdir -p /etc/easytier
sudo tee /etc/easytier/easytier.toml > /dev/null <<EOF
network_name = "${ET_NETWORK_NAME}"
network_secret = "${ET_NETWORK_SECRET}"
hostname = "${ET_HOSTNAME}"
dhcp = true
peers = [
"${ET_PEER}"
]
EOF
cd /opt/easytier
sudo ./easytier-cli service install \
--description "EasyTier personal VPN" \
--display-name "EasyTier" \
--core-path /opt/easytier/easytier-core \
--service-work-dir /opt/easytier \
-- \
-c /etc/easytier/easytier.toml
sudo ./easytier-cli service start
sudo ./easytier-cli service status发布家庭内网的节点
如果这台 Linux 主机在家里,还要把家庭网段发布出去,用这个版本:
bashexport ET_NETWORK_NAME="my-home"
export ET_NETWORK_SECRET="change-me-to-a-strong-password"
export ET_HOSTNAME="home-server"
export ET_PEER="tcp://<云服务器公网IP>:11010"
export ET_PROXY_NETWORKS="192.168.31.0/24"
sudo mkdir -p /etc/easytier
sudo tee /etc/easytier/easytier.toml > /dev/null <<EOF
network_name = "${ET_NETWORK_NAME}"
network_secret = "${ET_NETWORK_SECRET}"
hostname = "${ET_HOSTNAME}"
dhcp = true
peers = [
"${ET_PEER}"
]
proxy_networks = [
"${ET_PROXY_NETWORKS}"
]
EOF
cd /opt/easytier
sudo ./easytier-cli service install \
--description "EasyTier personal VPN" \
--display-name "EasyTier" \
--core-path /opt/easytier/easytier-core \
--service-work-dir /opt/easytier \
-- \
-c /etc/easytier/easytier.toml
sudo ./easytier-cli service start
sudo ./easytier-cli service status常用管理命令:
bash# 启动
sudo systemctl start easytier
# 停止
sudo systemctl stop easytier
# 重启
sudo systemctl restart easytier
# 查看状态
sudo systemctl status easytier
# 查看日志
journalctl -u easytier -f
# 开机自启
sudo systemctl enable easytier
# 取消开机自启
sudo systemctl disable easytier如果服务名不是 easytier,先查一下:
bashsystemctl list-units --type=service | grep -i easytier如果要卸载服务:
bashcd /opt/easytier
sudo ./easytier-cli service stop
sudo ./easytier-cli service uninstall多节点怎么配置
多节点其实不用单独学,记住一句话:
text同一个 VPN 里的所有节点,network_name 和 network_secret 必须一样,hostname 不一样。
比如三台机器:
| 设备 | hostname | 用哪个脚本 |
|---|---|---|
| 家里服务器 | home-server |
发布家庭内网的节点 |
| 云服务器 | cloud-node |
第一步:自建公网 peer 节点 |
| 笔记本 | macbook |
普通节点 |
它们都用:
bashexport ET_NETWORK_NAME="my-home"
export ET_NETWORK_SECRET="change-me-to-a-strong-password"只把 ET_HOSTNAME 改成各自的名字就行。
发布家庭内网是什么意思
假设家里网段是:
text192.168.31.0/24
你在家里的服务器上用了“发布家庭内网的节点”那段脚本,并设置:
bashexport ET_PROXY_NETWORKS="192.168.31.0/24"那么人在外面,笔记本连上 EasyTier 后,就可以访问:
text192.168.31.1 # 路由器后台 192.168.31.10 # NAS 192.168.31.20 # 开发机
这里有几个注意点:
- 发布网段的那台机器自己必须能访问
192.168.31.0/24; - 目标设备的防火墙要允许访问;
- 路由器如果开了 AP 隔离 / 访客网络隔离,可能会访问失败;
- 不要随便发布
0.0.0.0/0,除非你明确要做全局出口。
可选:多个自建 peer 提高可用性
如果只配置一个云服务器 peer,这台云服务器挂了,新节点就不容易发现其他节点。
可以多准备几台自己的公网节点,然后把配置文件里的 peers 改成多个:
tomlpeers = [
"tcp://1.1.1.1:11010",
"udp://1.1.1.2:11010",
"tcp://vpn.example.com:11010"
]我一般会让所有节点使用同一份 peer 列表,这样网络结构更稳定,也更容易排查。
验证是否成功
Docker Compose 节点
进入部署目录:
bashcd ~/docker/app/easytier查看日志:
bashdocker compose logs -f
查看容器状态:
bashdocker compose ps
进入容器查看 EasyTier 状态:
bashdocker exec -it easytier easytier-cli node
docker exec -it easytier easytier-cli peer
docker exec -it easytier easytier-cli routesystemd 节点
查看服务:
bashsudo systemctl status easytier查看日志:
bashjournalctl -u easytier -f
查看 EasyTier 状态:
bash/opt/easytier/easytier-cli node /opt/easytier/easytier-cli peer /opt/easytier/easytier-cli route
如果能看到其他节点,就说明组网成功。
安全建议
个人 VPN 虽然只是自己用,但也不要太随意。
几个基本建议:
network-secret不要用弱密码;- 不要把配置文件随手传到公开仓库;
- 云服务器安全组只放行必要端口;
- 能绑定固定端口就绑定固定端口,方便审计;
proxy_networks只发布必要网段,不要一上来就全局代理;- 不需要公网访问的管理后台,不要额外暴露 HTTP 端口。
如果是长期使用,建议把 network-secret 当作密码管理,泄露后及时更换。
常见问题
容器启动失败
先看日志:
bashcd ~/docker/app/easytier
docker compose logs -f如果看到 TUN 或权限相关错误,检查宿主机有没有 /dev/net/tun:
bashls -l /dev/net/tun再确认 Compose 里有这些配置:
yamlnetwork_mode: host
cap_add:
- NET_ADMIN
- NET_RAW
devices:
- /dev/net/tun:/dev/net/tunsystemd 服务启动失败
先看服务状态:
bashsudo systemctl status easytier再看实时日志:
bashjournalctl -u easytier -f
常见原因:
/opt/easytier/easytier-core路径不对;/etc/easytier/easytier.toml路径不对;- 配置文件语法写错;
- 端口被占用;
- 没有权限创建 TUN 设备。
节点看不到彼此
检查这几项:
- 所有节点的
network_name是否一致; - 所有节点的
network_secret是否一致; peers是否能连通;- 云服务器安全组是否放行
11010; - 本机防火墙是否拦截 EasyTier。
能看到节点,但是 ping 不通
这种情况一般看防火墙和路由:
- 目标系统是否禁止 ICMP;
- EasyTier 虚拟网卡是否正常创建;
easytier-cli route中是否有目标路由;- 如果访问家庭内网,发布网段的节点是否配置了
proxy_networks。
能访问 VPN 虚拟 IP,但不能访问家庭内网
先确认家里的发布节点配置了:
tomlproxy_networks = [
"192.168.31.0/24"
]再确认这台节点自己能访问家庭内网目标设备:
bashping 192.168.31.1 ping 192.168.31.10
如果发布节点自己都访问不了,那其他 VPN 节点更访问不了。
总结
这篇的最短路径就是:
- 先在云服务器上搭自建公网 peer,并放行
11010; - 把其他节点的
ET_PEER指向这台云服务器; - 普通节点有 Docker 就用 Docker Compose 脚本;
- 不想用 Docker 就用 systemd 脚本;
- 家里节点需要访问整个内网,就用带
ET_PROXY_NETWORKS的版本; - 最后用
easytier-cli peer、route、node看状态。
这样搭完之后,人在外面也可以像在家里一样访问 NAS、开发机和内网服务,不需要把每个服务单独暴露到公网。