公网暴露服务既安全又方便的方案似乎就是架个梯子
前两天发了个帖子,讲了目前因为一些服务暴露到公网的需求,一直在使用 https+basic auth 的方案 https://v2ex.com/t/1190381 ,有大佬介绍了 Next-Terminal ,顺便也了解了雷池的方案,以及参考这个帖子 https://v2ex.com/t/1190896 讨论的 authelia ,最后结合帖子回复中几位大佬提到了在家里架梯子、只暴露梯子端口、其它所有服务都使用梯子来代理,发现这个方案确实是技术难度最低、对用户体验影响最小、兼容性最强的方案。
这两天折腾了一下,完全迁移到了这个方案,下面简单说一下。
目前我需要在公网暴露的服务主要分两类:一是纯 web 类的,另外一种是类似 mtphoto 这种提供 app 但是依赖原生 http api 访问的。
对于前者,不管是我之前的 https + basic auth ,或者是 next-terminal, 雷池,authelia 其实都能解决安全性问题,体验也都差不多,无非就是多一层认证的步骤;但是对于第二类服务,据我所知目前 next-terminak ,authelia 应该都没有好的解决方案,反而搭 vpn 或者 tailscale 是体验和兼容性更好的方案。
不过现在发现搭 ss 的方式综合考虑下来最合适的。
我目前所有的服务都用 docker 部署在内网都有自己的端口号,使用 docker caddy 部署了 https 反代,绑定到一系列的域名比如 a.domain.com, b.domain.com 。
这些子域名在软路由上直接强制指定指向内网 caddy 的 ip 上,在 dns 服务商那边随便指定一个 ip 就行(得有一条记录不然 caddy 可能无法申请 ssl 证书)。这样在内网访问的时候即使是通过域名也是通过 caddy 直连 docker 各项服务上。
然后 docker 部署了 shadowsocks-rust ,ss-rust 的端口是唯一通过软路由暴露到公网的端口。 在手机/笔记本/外面电脑上的梯子客户端上,通过规则分流将.domian.com 的所有流量都走这个 ss-rust 的端口。这样在外网的时候,只有连上梯子才会路由这些子域名,ss-rust 收到请求后会解析到内网的 caddy https 服务。
这个方案有几个优势
- 内网和外网访问这些服务的时候,体验完全一致,不需要任何额外的密码输入和认证。唯一的区别就是在外网的时候需要连着梯子。
- 只在公网上暴露梯子的端口,其它所有服务都是走这个端口的加密流量,安全性应该是非常高的
- 完美解决 app 走自己的 api 导致无法过 authelia 认证的问题,只要连着梯子就可以使用 app
这套方案本质上和架设 vpn/tailscale 类似的,但是考虑到 v2 上各位的设备上肯定都有梯子客户端,再开个 vpn 总归有些多余,一个梯子客户端解决 fq 和内网服务完全的问题,我认为是相当完美的。
这个方案安全上唯一的弱点可能就是不要泄露自己 ss 的密码,不过改密码的成本很低,感觉问题也不大。
小白有个疑问,对于这种情况,搭 ss/wg 或者其他协议有什么区别吗,感觉目的都是为了连回内网