可通过SSH隧道安全访问内网宝塔面板:一、反向隧道(内网服务器主动连跳板机,端口映射至公网);二、正向隧道(本地连服务器,绑定本地端口);三、配置免密登录与脚本固化;四、用autossh实现断线自动重连。

如果您想从公网安全访问部署在内网或无公网IP服务器上的宝塔面板,但又不愿直接暴露面板端口(如8888)至互联网,则很可能是由于面板未配置安全隧道导致访问受限。以下是利用SSH隧道实现安全访问的具体操作步骤:
一、本地建立反向SSH隧道(适用于无公网IP的内网服务器)
该方法通过内网服务器主动连接一台具有公网IP的跳板机,在跳板机上创建一个可被公网访问的端口,该端口将流量加密转发至内网服务器的宝塔面板端口。原理是绕过内网NAT和防火墙限制,且全程流量加密。
1、在内网服务器上执行以下命令,将本地宝塔面板端口(假设为8888)映射到跳板机的公网端口(如18888):
ssh -R 18888:127.0.0.1:8888 user@jump_server_ip -N -f
2、确保跳板机的SSH服务已开启GatewayPorts yes选项:编辑/etc/ssh/sshd_config,添加或修改为GatewayPorts clientspecified,然后重启SSH服务:systemctl restart sshd
3、在跳板机的防火墙中放行目标端口(如18888):
firewall-cmd --permanent --add-port=18888/tcp
firewall-cmd --reload
4、从任意公网设备访问跳板机IP加映射端口,例如:https://jump_server_ip:18888,即可进入内网服务器的宝塔面板登录页。
二、本地建立正向SSH隧道(适用于有公网IP但需隐藏面板端口的场景)
该方法在本地计算机发起隧道连接,将远程服务器的宝塔面板端口绑定至本机指定端口,所有访问均经由加密通道完成,避免面板端口直接暴露于公网,也规避了DNS污染或中间人监听风险。
1、在本地终端(Windows使用Git Bash或WSL,macOS/Linux使用Terminal)执行以下命令:
ssh -L 9999:127.0.0.1:8888 user@server_ip -N -f
2、确认隧道进程持续运行,不关闭该终端窗口或终止后台进程。
3、在本地浏览器地址栏输入:https://127.0.0.1:9999,回车后即加载远程宝塔面板登录界面。
4、若提示证书错误,因隧道使用本地回环地址导致SSL证书域名不匹配,可点击“高级”→“继续前往127.0.0.1(不安全)”,此为正常现象,不影响传输加密安全性。
三、配置免密登录并固化隧道脚本
为避免每次手动输入密码及重复执行命令,需提前配置SSH密钥认证,并将隧道命令封装为可后台自启的服务,确保隧道长期稳定运行。
1、在本地生成RSA密钥对(如尚未配置):
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
2、将公钥上传至目标服务器:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@server_ip
3、创建本地隧道启动脚本start_bt_tunnel.sh,内容如下:
#!/bin/bash
ssh -L 9999:127.0.0.1:8888 -N -f -o ExitOnForwardFailure=yes -o ServerAliveInterval=30 user@server_ip
4、赋予脚本执行权限并运行:
chmod +x start_bt_tunnel.sh && ./start_bt_tunnel.sh
5、验证隧道是否生效:
lsof -i :9999 | grep LISTEN
四、使用autossh实现隧道断线自动重连
标准SSH隧道在网络波动时会中断且无法自恢复,autossh可监控连接状态并在失效时自动重建隧道,保障访问连续性。
1、在本地安装autossh(Ubuntu/Debian):
sudo apt update && sudo apt install autossh
2、替换原SSH隧道命令为autossh命令:
autossh -M 0 -L 9999:127.0.0.1:8888 -N -f -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" user@server_ip
3、其中-M 0表示禁用监控端口,改用SSH内置保活机制;ServerAliveInterval 30表示每30秒发送一次保活探测。
4、查看autossh进程状态:
ps aux | grep autossh










