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 服务,以转发到本地的开发服务。

参考链接

下一篇:CSR 手动申请 SSL 证书与 DNS 配置

上一篇:eMMC健康度查询

Ctrl + Enter