在远程运维和开发场景中,我们经常面临一个痛点:家里的电脑或公司的内网服务器没有公网 IP,想要从外部随时访问该怎么办?传统的 DDNS + 端口映射不仅配置繁琐,还会将内网端口直接暴露在公网,极易招致恶意扫描和攻击。
最安全、最优雅的方案,莫过于利用一台公网 VPS 作为跳板机,通过 SSH 反向隧道实现“隐形”的内网穿透。但普通的 SSH 隧道有一个致命弱点:一旦遇到网络波动,连接就会“假死”,进程还在但数据不通。
今天,我们就来聊聊如何使用 autossh 打造一个“打不死”的 SSH 隧道,实现稳定、安全的内网穿透。
架构拓扑:打造安全的“隐形通道”
我们的整体架构非常清晰:
[外部设备] --(SSH加密连接)--> [公网跳板机] --(本地回环转发)--> [内网目标主机]
这种架构有两个核心优势:
- 隐蔽性:公网跳板机对外只开放常规的 SSH 端口,不暴露任何额外的业务端口。
- 安全性:内网目标主机的服务只监听本地回环地址(
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)