yanchang
yanchang
发布于 2026-02-11 / 44 阅读
0
0

🚀 穿透内网:从零构建 Teleport 家庭堡垒机实录(避坑指南)

摘要:本文记录了如何使用 Teleport 搭建一套安全的家庭堡垒机,并将位于学校/公司内网的服务器通过“反向隧道”纳管到统一平台。告别繁琐的 VPN 和不稳定的内网穿透,实现浏览器一键 SSH。文中包含详细的二进制部署流程及我在部署过程中踩过的所有“深坑”。


🌟 (碎碎念)为什么要折腾 Teleport?—— 给我的服务器买份“双重保险”

熟悉我的朋友都知道,我手里维系着一堆环境复杂的机器。为了管理它们,我之前一直采用最原始但也最暴力的办法:手动编写 SSH 隧道脚本

大概逻辑就是通过一台固定 IP 的公网服务器,把内网机器的 22 端口反向映射出来。这方案平时用着没问题,但“常在河边走,哪有不湿鞋”。这种纯脚本维护的隧道有两个致命痛点:

  1. 连接“脆皮”:网络稍微抖动一下,或者运营商阻断一下,隧道就断了。虽然写了重连脚本,但总有进程僵死、端口被占用导致彻底失联的时候。

  2. 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

第三步:编写配置文件 (避坑精华)

这里有两个关键坑点

  1. 版本兼容性:v18 版本中,cluster_name 必须移到 auth_service 下,否则报错。

  2. 证书共用:由于是多个服务公用一个证书,为了方便管理因此使用固定位置证书这样就可以一次更新证书,可以刷新多个服务。

  3. 反向隧道:必须显式配置 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,我们需要手写服务文件,并指定正确的 UserExecStart 路径。

编辑 /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)

在本次部署中,我主要解决了以下几个关键问题,希望能帮到后来者:

  1. 配置文件报错 field cluster_name not found

    • 原因:Teleport v18 变更了配置结构。

    • 解决:将 cluster_name 从全局移动到 auth_service 字段下。

  2. 被控端连接报错 connection refused

    • 现象:学校服务器日志提示连接 yanchang.cc:3024 失败。

    • 原因:Teleport 默认配置有时不会自动监听 3024 隧道端口。

    • 解决:在 proxy_service 中显式添加 tunnel_listen_addr: 0.0.0.0:3024 并重启服务。

  3. 权限问题

    • 现象:服务启动失败,日志提示 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.cc

    • Web 端口: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上传到被控端的服务器

  1. 在你的电脑上下载文件: 点击下载 v18.6.7 (Linux AMD64) (电脑有梯子的话,几秒钟就下完了)

  2. 通过 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.yamllabels 中使用了中文作为键名(Key)。

  • 解决:将 Key 改为英文,Value 可以保留中文。


🎉 结语

至此,被控端部署完成!

现在,无论你在哪里,只要打开浏览器访问家里的 Teleport 域名,点击 Connect,就能瞬间通过 Web 终端控制学校的服务器。你甚至可以把 ssh_service 下的 commands 配置起来,让它每分钟自动上报显卡温度或 CPU 负载,直接在服务器列表页展示监控信息!


评论