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