让 ngrok, localtunnel 等见鬼去吧!(ngrok 不用的理由,localtunnel-server 搭建自己的服务,域名设置存在过多的坑)!
前奏
- 需求:内网服务接口暴露给外网调用(外网不能直接访问内网)
- 前提:拥有一台外网 VPS
- 思路:使用外网 VPS 做代理,外网访问该VPS,VPS再转发映射内网地址
- 技术:ssh, autossh, ssh-copy-id
实现
- 环境
- 目标A:内网服务器(开发服务器),服务器端口8080,映射端口8088
- 目标B:外网VPS,服务器端口8089,映射本地端口8088,公网IP:192.168.1.111(举例IP,替换成相应的地址即可)
- 访问者C : 可以访问VPS,不能访问A
- 目标B,启动服务(端口转发,实现方式SSH 正向代理 或 iptables 转发)
#会要求 VPS 服务器 root 登录密码
➜ ~ ssh -fCNL *:8089:localhost:8088 localhost
# or
- 目标A,启动服务(原理SSH 反向代理)
#192.168.1.111 为 VPS 服务器 IP,记得替换成你自己
➜ ~ ssh -fCNR 8088:localhost:8080 root@192.168.1.111
- 访问者C, 访问 http://192.168.1.111:8089, 完成访问
高级
- ssh 连接不稳定,一段时间可能断开的问题,使用autossh解决
#-M 6677为 autossh 维持访问的端口, 其他参数同ssh
➜ ~ autossh -M 6677 -fCNR 8088:localhost:8088 root@XXX
- 遇到坑了吧,多尝试吧,本人刚开始看阮一峰博客介绍SSH时候,完全没法成功呀。根据你自己的需求出发去找答案吧。Google在向你招手。
注意事项
- VPS 防火墙(iptables等),开放8088、8089端口
- VPS 如果是Aliyun ECS 注意服务器安全组设置
- ssh免密码登录,试试
ssh-copy-id
-
Warning: remote port forwarding failed for listen port 8088
kill 掉VPS 上sshd: root
相关进程重试吧 - 出现外网访问加载不出来,但又非失败的情况。同上
- macOS ssh 一段时间超时断开,客户端设置编辑
~/.ssh/config
加入ServerAliveInterval 60
参考
- http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html
- http://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.html
- http://blog.csdn.net/bwlab/article/details/54970700
- https://segmentfault.com/a/1190000002718360
- http://www.cnblogs.com/kwongtai/p/6903420.html
- https://bingozb.github.io/32.html
- http://lvii.github.io/system/2013/10/08/ssh-remote-port-forwarding/
- http://laoono.com/2014-03/resolved-under-mac-environment-ssh-timeout.html
- https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/