# 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 &amp;&amp; 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 &gt;/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