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 服务,以转发到本地的开发服务。 flowchart TB url[https://ssh-tunnel.example.org/]-->server subgraph server direction LR s1(nginx)-->|proxy|s2((8080)) end server--ssh tunnel-->local local[http://127.0.0.1:8001/] 参考链接 OpenSSH/Cookbook/Tunnelsssh - manualnginx - ngx_http_proxy_module
JavaScript全屏阅读