局域网内优雅的访问家庭内网服务

91 天前
 dhuzbb

局域网内优雅的访问家庭内网服务

前情提要

《低成本家庭万兆内网搭建指北》
《个人家庭网络布局分享》
《家庭内网服务分享》

缘起

自从有了 NAS ,烦恼似乎开始变得多了。

当家庭部署的内网服务多了之后,例如笔记、DNS 、影音、Wiki 等等各种各样的服务,记忆和管理这些内网服务就成了一个问题。

直接在浏览器中输入内网服务的 IP:端口号,又面临记忆的负担,似乎不是一个优雅的方案。

如何在局域网优雅的访问这些内网服务,减少心智负担成了一个不得不解决的问题。

2 者结合可以完美的解决上面的问题,下面开始详细描述如何实现上面的需求。

子域名规划

根据内网服务的实际用途规划子域名如下,大家可以根据自己的实际情况自由发挥。

域名 后端服务 说明
https://binhome.cn http://192.168.0.4:3002 极空间 Docker 部署的 Sun-Panel 导航页服务
https://note.binhome.cn http://192.168.0.4:28080 极空间 Docker 部署的笔记服务 Flatnotes
https://book.binhome.cn http://192.168.0.4:8083 极空间 Docker 部署的阅读服务 Calibre-Web
https://dns.binhome.cn http://192.168.0.10:80 PVE CT 容器部署的 DNS 服务 Adguard Home
https://git.binhome.cn http://192.168.0.88:80 PVE CT 容器部署的 GitLab 服务
以下省略 20 条 以下省略 20 条 以下省略 20 条

想要实现的需求是:在局域网内部浏览器中输入 https://note.binhome.cn 这样的子域名,就能访问到局域网内部部署的笔记服务 http://192.168.0.4:28080

反向代理

上面子域名规划中的不同子域名映射到不同的后端 IP:端口,其实就是反向代理 Nginx 等服务需要做的事情。

由于 Nginx 需要绑定 80 和 443 端口,推荐使用 PVE 的 CT 容器来部署 Nginx Proxy Manager 。

Nginx Proxy Manager 非常的简单易用。无需编写复杂的 Nginx 配置就可以设置域名到后端服务的映射关系,非常适合小白用户。

除了反向代理之外,NPM 还支持泛域名 SSL 证书的申请,简单易操作。前提是事先购买域名并设置好 DNS 解析到主路由的公网 IP ,如果不介意浏览器中的红色安全提醒,也可以忽略。

内网 DNS 重写

完成了反向代理之后,还需要做的一步操作就是将所有 *.binhome.cn 的请求都指向 Nginx Proxy Manager 的机器 IP (假如是 192.168.0.8 )。

修改主路由或旁路由的 Hosts 文件可以简单的达到目的:

192.168.0.8 binhome.cn
192.168.0.8 note.binhome.cn
192.168.0.8 book.binhome.cn
192.168.0.8 dns.binhome.cn
192.168.0.8 git.binhome.cn
以下省略 20 条...

上面的做法不是不行,但还是太繁琐了,需要 一条一条的添加,实现上不够优雅。能不能只需要 1 条记录就实现呢?类似下面这种:

192.168.0.8 *.binhome.cn

DNS 重写可以完美实现上面的诉求。

AdGuard Home 这款 DNS 服务支持泛域名重写功能。

如果使用的是 OpenWRT 内置的 DNS 服务 Dnsmasq ,也能非常简单的设置泛域名重写功能。

# 编辑 dnsmasq 的配置文件
vim /etc/dnsmasq.conf

# 在最后添加一行以下配置
address = /binhome.cn/192.168.0.8

# 重启 dnsmasq 服务
service dnsmasq restart

完成了以上设置,这样在局域网环境下,所有访问 *.binhome.cn 的请求都会解析到内网的 NPM 机器 192.168.0.8 上。

原理解析

下面针对上面所讲的内容进行原理解析:

https://note.binhome.cn -> 192.168.0.2(内网 DNS 服务器) -> 192.168.0.8(NPM) -> http://192.168.0.4:28080

局域网环境下整个访问流程如下:

由此,就完成了请求不同的子域名,实际请求的是不同后端服务的需求。

个人服务导航页

集中化管理个人内网服务就需要导航页服务来实现了,推荐使用 Sun-Panel 。

之前的文章有介绍过 Sun-Panel 是一个漂亮的服务器、NAS 导航面板、Homepage 、浏览器首页。

Github: https://github.com/hslr-s/sun-panel

部署效果如下:

类似比较出名的个人导航页还有 Heimdall 。( https://github.com/linuxserver/Heimdall)

Sun-Panel 支持局域网和互联网 2 种模式,UI 更加简洁美观,个人更加倾向于使用 Sun-Panel 。

后续

完成上述操作之后,在局域网环境下,既可以直接在浏览器中输入 https://note.binhome.cn 这样的子域名来访问家庭内网服务。也可以设置浏览器的主页为个人导航页服务https://binhome.cn,一键点击访问对应的内网服务。

解决完了内网环境下的访问之后,如何在外优雅安全的访问局域网内的服务呢?

详见后续系列文章:《在外优雅访问家庭内网服务的姿势》。

5914 次点击
所在节点    宽带症候群
47 条回复
vate32
91 天前
猜测一下,外网用 wireguard 等方式回家
ztm0929
91 天前
宽带运营商对 80/443 端口的封锁会导致外网无法直接访问域名,在内网的场景下,是否也会呢?
0x663
91 天前
@ztm0929 用 ipv6 没封锁 80/443 等端口
ztm0929
91 天前
@0x663 笑死😂无形中推广 IPV6 了 hhh 我研究一下
esee
91 天前
直接对外网暴露端口不就等于上街不穿衣服嘛.
dhuzbb
90 天前
@vate32 你猜的没错
coolcoffee
90 天前
DNS 配置太复杂了,我选择三级域名直接公网 DNS *.nas.xxx.com 解析到群晖局域网 ip ,群晖上再配置反向代理到其它的局域网服务。
dhuzbb
90 天前
@esee 没有对外暴露任何端口呀,上面讲的都是局域网内部的。
dhuzbb
90 天前
@coolcoffee DNS 配置泛域名解析还算简单吧。其实原理都差不多的。不过我觉得二级域名用起来还是比三级域名更爽一些。
BeautifulSoap
90 天前
这个方案两个比较麻烦点
如果通过 wireguard ,tailscale 之类组网的话

1. dns 是通过局域网 dns 解析的,在家庭局域网外无法正确解析。不如买个域名直接设定域名解析到 192.168.0.8
2. 每次新增服务都要配置 Nginx 反代。

所以我现在都是直接用 ip 加端口,然后搞个简单面板凑活用了,常用服务端口记得住,不常用的从面板进去。
LogicDX342
90 天前
这种方案好像没法处理需要开放多个端口的容器以及非 http 服务?
dhuzbb
90 天前
@BeautifulSoap 后续文章会讲到 wireguard 的用法,不存在在家庭局域网外无法正确解析的问题。域名直接解析到内网地址也是一个方案,但是这样就浪费了这个域名了。

每次新增服务确实需要配置 Nginx 方向代理,但是有了 NPM ,基本上 10 秒钟就配置好了,后续也不用管了。
nekomiao
90 天前
借楼问下光猫改了桥接,也拿到 240e 开头的公网 ip 了,外面还是 ping 不到要怎么排查
Dk2014
90 天前
@nekomiao 那就是路由器问题了,可能是默认开了 v6 的防火墙
Cheons
90 天前
佩服
好几台云服务器都在吃灰,懒得折腾。
unidentifiedme
90 天前
少了上一步,Monitoring
内网 DNS 我用的文中提到的另一种方法,专门的域名只解析到内网地址。Reverse Proxy 用的 Traefik 而不是 Nginx Proxy Manager 。
还有下一步,Identity Provider
PerFectTime
90 天前
直接 caddy 多好,这个 nginx proxy manager 自定义程度太低了,没必要
me221
90 天前
Nginx Proxy Manager 换成 traefik 可以更方便一些
FawkesV
90 天前
楼主 问一下题外话 暴露 ipv6 到公网有没有什么问题呀? 关了路由器的 ipv6 防火墙才能在外面直接
dhuzbb
90 天前
@FawkesV 防火墙就像是大门,大门敞开了,只要你的域名或 IP 对外暴露了,那谁都可以随意进,爆破下密码都是轻而易举的事情。百分之一万不建议关闭防火墙。别急,后续文章会详细讲解在外访问家庭内务服务的方法。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1074771

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX