SSH Tunnel 转发本地端口到 HTTPS
未分类全屏阅读
SSH Tunnel 转发本地端口到 HTTPS
有时候本地运行的服务需要在公网访问,尝试了一下市面上 ngrok、localtunnel 等服务,又要注册又有个“防滥用”验证页,体验很不满意,内网穿透老大哥 frp 配置又绕又很烦。
了解到常用的 ssh 其实自带端口转发后,手上又正好有几台服务器,直接一行命令搞起。
前提条件
- 带公网 ip 的服务器
- 域名
- 有效的 ssl 证书
小儿科嘛,程序员花了钱都能有~
SSH 本地端口转发
第一步,简单的一行 ssh 命令,其余的都是服务器配置:
$ ssh -vNTR 8080:127.0.0.1:8001 user@serverIP
$
$ # 监听服务器 8080 端口并转发到本地 8001 服务
SSH Tunneling 实际上分两种,一种 -L
选项指定的正向转发,简单来说 ssh 会在本地监听一个端口,访问本地服务即访问公网服务器,貌似有点儿鸡肋,我直接公网 ip + 端口不就行了,要个毛线的转发。
言归正传,正向转发具备一定的安全性,比如不暴露端口到公网上给人扫,而且无视防火墙、安全组等规则,省事。
这篇文章主要用到另一种,反向 tunneling,与上面介绍的正好相反,有点儿 magic,本地服务可以在公网上访问,专业儿的名词叫内网穿透。
利用 -R
选项指定的反向 tunneling,把访问服务器上的流量转发到本地来,就是这一行 ssh 命令的精髓。
有用的一些选项
-R [bind_address:]bind_port:local_address:local_port
反向 tunneling-N
不执行远程命令,仅进行端口转发-T
不分配 shell-v
调试信息输出。不会一脸懵
sshd 配置
默认情况下 sshd 服务只会绑定到本地,不会绑 0.0.0.0
到公网,因此需要修改 /etc/ssh/sshd_config
:
GatewayPorts yes
一个关于反向 tunneling 的想法:代码发布到测试环境时,反手就是一个 tunneling 到本地,直接在 IDE 里调试,嘿嘿,让测试同学改一下访问端口就行。
HTTPS 反向代理
本地端口转发成功后,还想在公网通过 https 访问,那就需要域名和证书了,国内服务器可能蛋疼地还需要备案。
支持反向代理的 http 服务器有很多,这里用常见的 nginx 做示例。
server {
listen 443 ssl;
server_name ssh-tunnel.example.org;
ssl_certificate_key "/example/org.key";
ssl_certificate "/example/org.pem";
location / {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect off;
proxy_read_timeout 6;
}
}
有了这个 https 反代,上一步的 GatewayPorts 也无需要配置了。
结论
经过服务器端一通猛如虎的操作,和本地一行小命令,现在可以在公网上访问 https 服务,以转发到本地的开发服务。