摘要:本文记录了如何使用 Teleport 搭建一套安全的家庭堡垒机,并将位于学校/公司内网的服务器通过“反向隧道”纳管到统一平台。告别繁琐的 VPN 和不稳定的内网穿透,实现浏览器一键 SSH。文中包含详细的二进制部署流程及我在部署过程中踩过的所有“深坑”。
🌟 (碎碎念)为什么要折腾 Teleport?—— 给我的服务器买份“双重保险”
熟悉我的朋友都知道,我手里维系着一堆环境复杂的机器。为了管理它们,我之前一直采用最原始但也最暴力的办法:手动编写 SSH 隧道脚本。
大概逻辑就是通过一台固定 IP 的公网服务器,把内网机器的 22 端口反向映射出来。这方案平时用着没问题,但“常在河边走,哪有不湿鞋”。这种纯脚本维护的隧道有两个致命痛点:
连接“脆皮”:网络稍微抖动一下,或者运营商阻断一下,隧道就断了。虽然写了重连脚本,但总有进程僵死、端口被占用导致彻底失联的时候。
IP 变更的“死锁”困局:这是最让我焦虑的。万一我的公网跳板机到期了、IP 被封了或者需要迁移,我就必须去每一台内网机器上修改脚本里的目标 IP。但问题是,隧道断了我根本连不上这些机器,连不上就改不了配置,改不了配置就更连不上…… 这是一个完美的死循环。
所以我一直在找一个**“备用后门”**(Plan B)。我希望它能独立于 SSH 协议之外,有一套自己的保活机制,并且最好能通过域名自动寻址。这样万一 SSH 隧道全挂了,或者公网 IP 变了,我还能通过这个 Plan B 连进去救火,给自己留出从容迁移服务的时间。
于是,我盯上了 Teleport。
它不仅仅是一个远程工具,更像是一个现代化的基础设施访问网关。相比于我那简陋的 SSH 脚本或 frp,它是降维打击:
双重保险:把它作为 SSH 之外的第二条独立通道。当 SSH 隧道挂掉时,它就是我的“救生艇”。
Web 终端:急救时不需要掏出电脑配置 SSH config,借台电脑打开浏览器就能操作,简直是运维神器。
反向隧道:被控端(Node)完全不需要公网 IP,也不用我手动算端口映射,只要能联网,它就能自动找到回家的路。
安全合规:自带 MFA 两步验证(比单纯的 SSH Key 安全感爆棚),而且所有操作都有录像审计,谁干了什么一清二楚。
这篇博客,就是为了记录如何把这套“救命系统”搭建起来,从此告别“失联焦虑症”。
Linux 服务端部署 Teleport 堡垒机
🛠️ 环境准备
服务器:Ubuntu Linux(Home-Server)
安装目标目录:
/opt/teleport运行用户:
yanchang(非 root 运行,更安全)SSL 证书:已有 Nginx 证书,位于
/etc/nginx/ssl/(如果没有证书详情参考我的阿里云申请SSL证书的那一期)防火墙:UFW + 路由器端口映射
第一步:下载与安装 (净化版)
官方下载速度较慢,且为了方便管理,我们将程序统一安装在 /opt/teleport 目录下,而不是分散在系统各处。
Bash
# 1. 进入 /opt 目录
cd /opt
# 2. 创建并进入工作目录
sudo mkdir -p teleport
cd teleport
# 3. 下载 Teleport v18.6.7 二进制包
# (此处使用了官方 CDN,如果慢可替换为 GitHub 镜像源)
sudo curl -L -O https://cdn.teleport.dev/teleport-v18.6.7-linux-amd64-bin.tar.gz
# 4. 解压
sudo tar -xzf teleport-v18.6.7-linux-amd64-bin.tar.gz
# 5. 整理目录结构
# 解压后文件在子目录里,我们需要把核心二进制文件移动到当前目录
sudo mv teleport/* .
sudo rmdir teleport
sudo rm teleport-v18.6.7-linux-amd64-bin.tar.gz
# 6. 验证安装
./teleport version
# 输出应为:Teleport v18.6.7 git:v18.6.7...

第二步:权限与目录配置
为了遵循最小权限原则,我们不使用 root 运行,而是使用当前普通用户 yanchang,并创建专门的数据目录。
Bash
# 1. 创建数据存储目录
sudo mkdir -p /opt/teleport/data
# 2. 核心步骤:移交所有权
# 将程序目录和配置文件的所有权交给运行用户
sudo chown -R yanchang:yanchang /opt/teleport
# 3. 加固数据目录权限 (仅拥有者可读写)
sudo chmod 700 /opt/teleport/data
第三步:编写配置文件 (避坑精华)
这里有两个关键坑点:
版本兼容性:v18 版本中,
cluster_name必须移到auth_service下,否则报错。证书共用:由于是多个服务公用一个证书,为了方便管理因此使用固定位置证书这样就可以一次更新证书,可以刷新多个服务。
反向隧道:必须显式配置
tunnel_listen_addr: 0.0.0.0:3024,否则内网节点无法连接。
请直接使用这份修正后的配置:
Bash
# 写入 /etc/teleport.yaml
sudo bash -c 'cat > /etc/teleport.yaml <<EOF
version: v3
teleport:
nodename: Home-Server
# 指定我们自定义的数据目录
data_dir: /opt/teleport/data
log:
output: stderr
severity: INFO
auth_service:
enabled: "yes"
# [注意] v18 版本 cluster_name 必须在这里,不能在全局
cluster_name: yanchang.cc
listen_addr: 0.0.0.0:3025
public_addr: yanchang.cc:3025
ssh_service:
enabled: "yes"
commands:
- name: hostname
command: [hostname]
period: 1m0s
proxy_service:
enabled: "yes"
# Web 界面监听
web_listen_addr: 0.0.0.0:3080
public_addr: yanchang.cc:3080
# SSH 协议监听
listen_addr: 0.0.0.0:3023
ssh_public_addr: yanchang.cc:3023
# 🔴 [关键配置] 强制监听反向隧道端口 (3024)
# 缺少这一行会导致被控端报 "connection refused"
tunnel_listen_addr: 0.0.0.0:3024
tunnel_public_addr: yanchang.cc:3024
# SSL 证书 (确保 yanchang 用户有读取权限)
https_keypairs:
- key_file: /etc/nginx/ssl/www.yanchang.key
cert_file: /etc/nginx/ssl/www.yanchang.pem
EOF'
# 再次确保配置文件权限正确
sudo chown yanchang:yanchang /etc/teleport.yaml
第四步:配置 Systemd 服务
因为是手动安装到 /opt,我们需要手写服务文件,并指定正确的 User 和 ExecStart 路径。
编辑 /lib/systemd/system/teleport.service:
Ini, TOML
[Unit]
Description=Teleport SSH Service
After=network.target
[Service]
Type=simple
Restart=on-failure
# 🔴 必须指定为你的普通用户
User=yanchang
Group=yanchang
# 🔴 路径指向 /opt/teleport/teleport
ExecStart=/opt/teleport/teleport start --config=/etc/teleport.yaml --pid-file=/run/teleport/teleport.pid
ExecReload=/bin/kill -HUP $MAINPID
PIDFile=/run/teleport/teleport.pid
LimitNOFILE=8192
# 自动管理 PID 目录权限
RuntimeDirectory=teleport
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
第五步:防火墙设置 (UFW & Router)
这是最容易被忽视的一步。除了 Web 端口,必须放行 SSH 和隧道端口。
Bash
# 1. 放行 Web 界面
sudo ufw allow 3080/tcp
# 2. 放行 SSH 代理工具端口
sudo ufw allow 3023/tcp
# 3. 放行 Auth 服务 (节点认证)
sudo ufw allow 3025/tcp
# 4. 🔴 [极易遗漏] 放行反向隧道端口 (节点心跳)
sudo ufw allow 3024/tcp
# 检查状态
sudo ufw status
注意:如果你是家庭宽带,别忘了在路由器上也做这 4 个端口的端口映射(Port Forwarding)。
第六步:启动与初始化
一切就绪,启动服务!
Bash
# 1. 重载配置并启动
sudo systemctl daemon-reload
sudo systemctl enable teleport
sudo systemctl start teleport
# 2. 验证端口监听 (确认 3024 在列)
sudo ss -tulpn | grep teleport
# 输出应包含 *:3080, *:3023, *:3025, *:3024
创建管理员账号:
# 使用 tctl 工具创建账号 (需要 sudo 读配置)
sudo /opt/teleport/tctl users add admin --roles=editor,access --logins=root,ubuntu,yanchang
复制生成的 URL(如 https://yanchang.cc:3080/web/invite/...)在浏览器打开,设置密码并绑定 MFA 即可。

🛑 踩坑总结 (Troubleshooting)
在本次部署中,我主要解决了以下几个关键问题,希望能帮到后来者:
配置文件报错
field cluster_name not found:原因:Teleport v18 变更了配置结构。
解决:将
cluster_name从全局移动到auth_service字段下。
被控端连接报错
connection refused:现象:学校服务器日志提示连接
yanchang.cc:3024失败。原因:Teleport 默认配置有时不会自动监听 3024 隧道端口。
解决:在
proxy_service中显式添加tunnel_listen_addr: 0.0.0.0:3024并重启服务。
权限问题:
现象:服务启动失败,日志提示
permission denied。原因:使用了普通用户运行,但配置文件或 SSL 证书归属权是 root。
解决:确保
chown yanchang:yanchang覆盖了程序目录和配置文件,且 SSL 证书通过 ACL 或用户组允许读取。
🎉 最终效果: 服务启动后,通过浏览器访问 https://yanchang.cc:3080,你可以生成 Token (sudo /opt/teleport/tctl tokens add --type=node) 并开始纳管你的内网服务器了!
Linux 被控端接入 Teleport 堡垒机
摘要:在文章上半部分中,我们成功部署了 Teleport 服务端。本篇将讲解如何将位于学校/公司深层内网、无公网 IP 的 Linux 服务器(Node)接入到我们的家庭堡垒机中。本文包含二进制安装流程及 中文标签报错、反向隧道连接失败 等常见问题的解决方案。
🛠️ 环境准备
被控端:学校实验室服务器 (School-Server)
网络环境:纯内网,无公网 IP,但可以访问外网。
安装方式:二进制包 (Binary) 安装到
/usr/local/bin。服务端信息:
地址:
yanchang.ccWeb 端口:
3080隧道端口:
3024(至关重要)
第一步:获取入网令牌 (Token)
在开始部署被控端之前,必须先由管理员在服务端 (Home-Server) 签发一张“邀请函”。
在服务端终端执行:
Bash
# 生成一个有效期 24 小时的节点加入令牌
sudo /opt/teleport/tctl tokens add --type=node --ttl=24h
# 输出示例:
# The invite token: 1374b165c2fd************
记下这串 Token,稍后在被控端会用到。
第二步:下载与安装
在被控端 (School-Server) 上执行。为了通用性,我们依然选择二进制安装,并将程序放入标准的系统路径。
Bash
# 1. 下载安装包 (推荐使用 GitHub 镜像加速)
curl -L -O https://cdn.teleport.dev/teleport-v18.6.7-linux-amd64-bin.tar.gz
# 2. 解压
tar -xzf teleport-v18.6.7-linux-amd64-bin.tar.gz
# 3. 安装到 /usr/local/bin
# 这样我们可以直接在终端输入 teleport 命令,无需配置环境变量
cd teleport
sudo ./install
# 4. 验证安装
teleport version
# 输出应包含 v18.6.7当然下载部分可能会遇到一些问题,比如说是网络问题无法下载,那么可以用自己电脑下载好后scp上传到被控端的服务器
在你的电脑上下载文件: 点击下载 v18.6.7 (Linux AMD64) (电脑有梯子的话,几秒钟就下完了)
通过 SCP 传给服务器: 打开电脑的终端(Windows 下用 CMD 或 PowerShell),执行:
Bash
# 假设你在学校服务器的 IP是有办法在公网直接访问的 scp teleport-v18.6.7-linux-amd64-bin.tar.gz yanchang@你的服务器IP:/home/yanchang/
第三步:生成配置文件 (避坑点:命令行换行)
手动编写配置文件容易出错,我们使用命令行自动生成 /etc/teleport.yaml。
⚠️ 注意:请将下方命令复制为一行执行,不要分行,否则可能导致参数丢失。
Bash
# 请替换 --token 和 --proxy 的值
sudo teleport configure -o file \
--roles=node \
--token=d42d31c976db8**************** \
--proxy=yanchang.cc:3080 \
--node-name=School-Linux \
--labels=env=school,os=linux #如果报错这一行可以删除
执行成功后,会提示配置文件已创建在 /etc/teleport.yaml。
当然也有可能会报错,所以可以删除labels,后续在手动添加配置文件
第四步:优化配置 (避坑点:中文标签)
为了在后台一眼识别出这台机器,我们需要修改主机名和标签。这里有一个导致服务崩溃的严重坑点。
编辑配置文件:
Bash
sudo nano /etc/teleport.yaml
修改建议如下:
YAML
version: v3
teleport:
# 1. 修改主机名 (Node Name)
# 这里可以使用中文,显示在 Web 列表的第一列
nodename: 实验室-深度学习机
data_dir: /var/lib/teleport
# ... 其他保持默认 ...
ssh_service:
enabled: "yes"
# 2. 自定义标签 (Labels)
labels:
# 🔴 [严重避坑] 冒号左边的 Key 必须是英文!
# ❌ 错误写法: 环境: 实验室
# ✅ 正确写法: env: 实验室
env: school-lab
gpu: RTX3090
owner: yanchang
hostname: yanchang-Home-Server
location: 水图四楼机房
role: 深度学习
ip: 8.137.122.123
原理:Teleport 的 Label Key 必须符合正则
^[a-zA-Z0-9.\-_]+$。如果使用了中文 Key,启动时会报错invalid label key并直接退出。
第五步:配置 Systemd 服务
安装脚本不会自动创建后台服务,我们需要手动创建一个,确保它开机自启且在后台静默运行。
直接执行以下命令生成服务文件:
Bash
sudo bash -c 'cat > /etc/systemd/system/teleport.service <<EOF
[Unit]
Description=Teleport SSH Service
After=network.target
[Service]
Type=simple
Restart=on-failure
# 指定安装路径 /usr/local/bin/teleport
ExecStart=/usr/local/bin/teleport start --config=/etc/teleport.yaml --pid-file=/run/teleport.pid
ExecReload=/bin/kill -HUP \$MAINPID
PIDFile=/run/teleport.pid
LimitNOFILE=8192
[Install]
WantedBy=multi-user.target
EOF'
第六步:启动与连接
Bash
# 1. 刷新服务配置
sudo systemctl daemon-reload
# 2. 开启自启并立即启动
sudo systemctl enable teleport
sudo systemctl start teleport
# 3. 查看状态 (关键一步)
sudo systemctl status teleport
✅ 成功标志:
状态显示绿色
active (running)。日志中出现
Service is starting in tunnel mode。日志中出现
Successfully registered instance client。


🛑 故障排查 (Troubleshooting)
如果你发现状态是绿色的,但在网页端看不到机器,请查看详细日志: sudo journalctl -u teleport -f
以下是我遇到的三个经典错误:
1. 报错 dial tcp ...:3024: i/o timeout
含义:连接超时。
原因:被控端发出的数据包被防火墙拦截了,无法到达服务端。
解决:检查家庭宽带路由器的 端口映射,确保
3024端口已转发到服务器。
2. 报错 dial tcp ...:3024: connect: connection refused
含义:连接被拒绝。网络通了,但服务端没开门。
原因:服务端的 Teleport 配置文件中没有监听隧道端口。
解决:在服务端配置文件的
proxy_service下添加tunnel_listen_addr: 0.0.0.0:3024并重启服务端。
3. 服务启动失败 invalid label key
含义:配置文件格式错误。
原因:在
/etc/teleport.yaml的labels中使用了中文作为键名(Key)。解决:将 Key 改为英文,Value 可以保留中文。
🎉 结语
至此,被控端部署完成!
现在,无论你在哪里,只要打开浏览器访问家里的 Teleport 域名,点击 Connect,就能瞬间通过 Web 终端控制学校的服务器。你甚至可以把 ssh_service 下的 commands 配置起来,让它每分钟自动上报显卡温度或 CPU 负载,直接在服务器列表页展示监控信息!