Ubuntu18.04 内网无端口映射,SSH反向隧道登录完整方案
## 核心原理
内网服务器主动**向外网中转机(公网VPS)建立SSH反向隧道**,你登录公网中转机,再通过隧道回连内网Ubuntu;全程不需要对内网路由器做端口映射。
### 环境要求
1. 一台**有公网IP的中转VPS**(任意Linux,开放22端口)
2. 内网Ubuntu18.04 能访问外网(能ping/ssh到中转VPS)
3. 中转VPS提前放行自定义隧道端口(如2222)
## 一、前置准备(公网中转VPS操作)
1. 安装openssh-server(大部分云主机自带)
```bash
sudo apt update && sudo apt install openssh-server
```
2. 编辑sshd配置,允许网关转发(关键,否则隧道无法回连)
```bash
sudo vim /etc/ssh/sshd_config
```
修改/新增两行:
```ini
GatewayPorts yes
AllowTcpForwarding yes
```
3. 重启ssh服务
```bash
sudo systemctl restart sshd
```
4. 防火墙放行隧道端口(示例用2222,自定义)
```bash
# ufw防火墙
sudo ufw allow 2222/tcp
# 阿里云/腾讯云安全组同步放行2222端口
```
## 二、内网Ubuntu18.04 创建反向隧道(核心命令)
### 基础反向隧道命令(临时生效,断网失效)
```bash
# 格式:ssh -fCNR 中转端口:127.0.0.1:内网ssh端口 中转用户名@公网IP
ssh -fCNR 2222:127.0.0.1:22 root@123.45.67.89
```
参数解释:
- `-f`:后台后台运行
- `-C`:压缩传输
- `-N`:不执行远程命令,只做端口转发
- `-R 2222:127.0.0.1:22`:把内网22端口反向映射到中转机的2222端口
### 免密登录(避免每次输中转机密码)
1. 内网Ubuntu生成ssh密钥
```bash
ssh-keygen -t ed25519 # 一路回车,无需密码
```
2. 推送公钥到公网中转VPS
```bash
ssh-copy-id root@123.45.67.89
```
之后执行隧道命令无需输密码。
## 三、你自己电脑如何登录内网Ubuntu
1. 先登录公网中转VPS
```bash
ssh root@123.45.67.89
```
2. 在中转机内,通过隧道回连内网Ubuntu18.04
```bash
# 内网Ubuntu默认ssh端口22
ssh ubuntu@127.0.0.1 -p 2222
```
## 四、解决隧道断连自动重连(生产必备:autossh)
临时ssh命令断网、重启内网机就失效,用`autossh`保活隧道,断线自动重连。
### 内网Ubuntu18.04 安装autossh
```bash
sudo apt update
sudo apt install autossh
```
### autossh后台保活命令
```bash
# M 监控端口随便填(如10999),用于心跳检测
autossh -M 10999 -fCNR 2222:127.0.0.1:22 root@123.45.67.89
```
### 设置开机自启(内网服务器重启自动重建隧道)
#### 方案1:Systemd服务(推荐Ubuntu18.04)
1. 创建服务文件
```bash
sudo vim /etc/systemd/system/autossh-tunnel.service
```
写入内容(替换你的中转账号、公网IP、隧道端口):
```ini
[Unit]
Description=SSH Reverse Tunnel to Public VPS
After=network.target
[Service]
User=ubuntu
# 替换参数:-M心跳端口,2222隧道端口,中转用户@公网IP
ExecStart=/usr/bin/autossh -M 10999 -CNR 2222:127.0.0.1:22 root@123.45.67.89
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
```
2. 加载并开机启动
```bash
sudo systemctl daemon-reload
sudo systemctl enable autossh-tunnel
sudo systemctl start autossh-tunnel
# 查看状态
systemctl status autossh-tunnel
```
#### 方案2:crontab兜底(备用)
```bash
crontab -e
# 每5分钟检测进程,不存在则重建隧道
*/5 * * * * pgrep autossh >/dev/null || autossh -M 10999 -fCNR 2222:127.0.0.1:22 root@123.45.67.89
```
## 五、常见问题排查
1. **中转机无法通过2222端口连接内网**
- 检查中转sshd_config `GatewayPorts yes` 并重启ssh
- 中转机防火墙/云安全组放行2222端口
- 内网Ubuntu ssh服务正常:`systemctl status sshd`
2. **隧道几分钟自动断开**
- 使用autossh替代原生ssh,增加保活
- 内网ssh开启心跳:`/etc/ssh/sshd_config` 添加
```ini
ClientAliveInterval 30
ClientAliveCountMax 3
```
`sudo systemctl restart sshd`
3. **多台内网服务器区分**
每台内网机器分配不同中转端口:机器A=2222、机器B=2223,互不冲突。
## 六、安全加固建议
1. 中转VPS、内网Ubuntu均禁用密码登录,仅使用密钥登录
2. 中转机ssh修改默认22端口,关闭root直接登录
3. 隧道端口不要用知名端口,避免扫描
4. 中转机设置IP白名单,仅你办公公网IP能登录中转VPS
5. 内网Ubuntu创建普通用户ssh登录,禁止root远程ssh
No Comments