使用 AutoSSH 打造坚如磐石的内网穿透隧道

使用 AutoSSH 打造坚如磐石的内网穿透隧道

尽意
2026-07-26 / 0 评论 / 2 阅读 / 正在检测是否收录...
在远程运维和开发场景中,我们经常面临一个痛点:家里的电脑或公司的内网服务器没有公网 IP,想要从外部随时访问该怎么办?传统的 DDNS + 端口映射不仅配置繁琐,还会将内网端口直接暴露在公网,极易招致恶意扫描和攻击。

最安全、最优雅的方案,莫过于利用一台公网 VPS 作为跳板机,通过 SSH 反向隧道实现“隐形”的内网穿透。但普通的 SSH 隧道有一个致命弱点:一旦遇到网络波动,连接就会“假死”,进程还在但数据不通。

今天,我们就来聊聊如何使用 autossh 打造一个“打不死”的 SSH 隧道,实现稳定、安全的内网穿透。

架构拓扑:打造安全的“隐形通道”

我们的整体架构非常清晰:

[外部设备] --(SSH加密连接)--> [公网跳板机] --(本地回环转发)--> [内网目标主机]

这种架构有两个核心优势:

  1. 隐蔽性:公网跳板机对外只开放常规的 SSH 端口,不暴露任何额外的业务端口。
  2. 安全性:内网目标主机的服务只监听本地回环地址(127.0.0.1),对局域网内的其他设备完全不可见,所有流量都必须经过加密的 SSH 隧道。

第一步:环境准备与密钥生成

假设我们已经拥有一台公网跳板机(IP为 <公网跳板机IP>,SSH端口为 <跳板机SSH端口>),以及一台位于内网的目标主机(用户名为 <内网主机用户名>)。

首先,我们需要在内网目标主机上安装必要的软件,并生成一把专门用于建立隧道的 SSH 密钥(不要与日常登录的密钥混用):

# 更新软件源并安装 openssh-server 和 autossh
sudo apt update
sudo apt install openssh-server autossh

# 生成专用的隧道密钥(一路回车,不设置密码)
ssh-keygen -t ed25519 -f ~/.ssh/id_tunnel -N "" -C "autossh-tunnel"

接下来,将这把密钥的公钥上传到公网跳板机

ssh-copy-id -i ~/.ssh/id_tunnel.pub -p <跳板机SSH端口> <跳板机用户名>@<公网跳板机IP>

第二步:配置 Systemd 守护进程

为了让隧道在系统开机时自动启动,并在意外断开时自动重连,我们使用 systemd 来托管 autossh

内网目标主机上创建服务配置文件:

sudo nano /etc/systemd/system/autossh-tunnel.service

将以下内容写入文件中(注意替换对应的参数):

[Unit]
Description=AutoSSH Reverse Tunnel
After=network-online.target ssh.service
Wants=network-online.target

[Service]
User=<内网主机用户名>
Type=simple

# 核心参数解析:
# -M 0: 禁用 autossh 自身的监控端口,改用 SSH 原生的心跳保活机制
# -N: 不执行远程命令,仅建立隧道
# -R 127.0.0.1:<跳板机映射端口>:localhost:22: 
#    将跳板机的指定端口绑定在 127.0.0.1,确保公网无法直接扫描
Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh -M 0 -N \
    -o "ServerAliveInterval=30" \
    -o "ServerAliveCountMax=3" \
    -o "ExitOnForwardFailure=yes" \
    -o "StrictHostKeyChecking=no" \
    -p <跳板机SSH端口> \
    -i /home/<内网主机用户名>/.ssh/id_tunnel \
    <跳板机用户名>@<公网跳板机IP>

# 崩溃或断开后自动重启
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

第三步:启动服务与验证

配置完成后,启动服务并设置开机自启:

sudo systemctl enable --now autossh-tunnel.service

查看服务状态,确认是否正常运行:

systemctl status autossh-tunnel.service

如果看到 Active: active (running) 且没有 Permission denied 等报错,说明隧道已经成功建立。

此时,隧道已经将内网目标主机的 22 端口,安全地投射到了公网跳板机<跳板机映射端口> 上。

第四步:如何从外部连接?

现在,无论你身处何地(公司、咖啡厅或旅途中),只要先通过 SSH 登录到公网跳板机,就可以轻松跳转到内网主机:

# 1. 先登录跳板机
ssh -p <跳板机SSH端口> <跳板机用户名>@<公网跳板机IP>

# 2. 在跳板机内,通过本地回环地址跳转到内网主机
ssh -p <跳板机映射端口> <内网主机用户名>@127.0.0.1

总结

通过 autossh + systemd + 反向隧道的组合,我们不仅实现了无公网 IP 环境下的远程访问,还保证了连接的极高稳定性与安全性。这套方案配置一次,即可长期稳定运行,是家庭实验室和远程运维的绝佳选择。

0

评论 (0)

取消