如何通过SSH实现公网访问内网笔记本的指定端口?
如何通过SSH实现公网访问内网笔记本的指定端口?
嗨,刚好我之前也碰到过类似的需求,你想要的这个转发逻辑用SSH反向隧道就能实现,只是你之前可能没注意到默认配置的限制!
你之前试的-L是正向隧道,方向刚好反过来了——正向是把本地端口转发到远程,而你需要的是反向隧道(也就是-R选项),但默认情况下-R只会让RemoteServer的端口绑定在127.0.0.1上,只有服务器自己能访问,公网根本连不上。下面给你一步步解决:
第一步:在LocalLaptop上建立反向隧道
直接在你的笔记本上执行这条命令:
ssh -R 0.0.0.0:8888:localhost:80 your-remote-user@remote-server-ip
解释一下参数:
-R:表示创建反向隧道,把RemoteServer的端口流量转发到LocalLaptop0.0.0.0:8888:让RemoteServer在所有网卡上监听8888端口(默认是127.0.0.1,仅限本地访问)localhost:80:把RemoteServer 8888端口的流量转发到LocalLaptop的80端口
第二步:修改RemoteServer的SSH配置(关键!)
默认SSH服务不允许反向隧道绑定到非127.0.0.1的地址,所以你需要登录到RemoteServer,修改SSH配置文件:
- 编辑配置文件:
sudo nano /etc/ssh/sshd_config
- 找到
GatewayPorts这一行(如果被注释了就去掉#),把值改成yes:
GatewayPorts yes
- 重启SSH服务让配置生效:
# 用systemd的系统(比如Ubuntu 16.04+、CentOS 7+) sudo systemctl restart sshd # 旧系统用service命令 sudo service ssh restart
第三步:验证和测试
现在你从公网的任意机器访问remote-server-ip:8888,流量就会通过SSH隧道转发到你的LocalLaptop的80端口了!
一些额外提醒
- 别忘了检查RemoteServer的防火墙(比如ufw、iptables),要允许8888端口的入站流量,不然公网请求会被挡住。
- 如果需要隧道长时间稳定运行,可以用
autossh工具代替ssh,它会在连接断开时自动重连。 - 测试完成后记得关掉隧道,最好把
GatewayPorts改回默认的no,避免不必要的安全风险。
备注:内容来源于stack exchange,提问作者Bart Friederichs
相关产品推荐
相关产品推荐

