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

dhuzbb · 2024-9-22 10:57:31 · 279 次点击
# 局域网内优雅的访问家庭内网服务


## 前情提要

[《低成本家庭万兆内网搭建指北》]( https://www.fshex.com/t/1057803)  
[《个人家庭网络布局分享》]( https://www.fshex.com/t/1074592)  
[《家庭内网服务分享》]( https://www.fshex.com/t/1074688)  

## 缘起

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

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

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

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

+ 恰好域名可以用来替代 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]( https://img.binhome.cn/access_local_service/npm.png)

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

![NPM SSL]( https://img.binhome.cn/home_service/npm_ssl.png)


## 内网 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 服务支持泛域名重写功能。

![DNS Rewrite]( https://img.binhome.cn/home_service/dns_rewrite.png)

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

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

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

# 重启 dnsmasq 服务
service dnsmasq restart
```

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


## 原理解析

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

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

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

+ 访问 `https://note.binhome.cn` 时,会先请求内网的 DNS 服务器 (192.168.0.2) 进行内网 DNS 解析
+ 内网 DNS 服务器会将所有 `*.binhome.cn` 的请求都指向 NPM 的机器 IP ( 192.168.0.8 )
+ NPM 相当于 Nginx ,会在内部将请求根据域名匹配到真正的后端服务 `http://192.168.0.4:28080`

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

## 个人服务导航页

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

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

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

部署效果如下:

![sunpanel]( https://img.binhome.cn/home_service/sunpanel.png)

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

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


## 后续

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

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

详见后续系列文章:《在外优雅访问家庭内网服务的姿势》。
举报· 279 次点击
登录 注册 站外分享
26 条回复  
isnullstring 小成 2024-9-23 15:12:15
都说 traefik 更方便些?看文档有点难上手
主要是折腾的服务到最后经常用的可能也就 5-6 个,其他都是闲着
习惯 NPM 配置,弄起来也快,鼠标点点完事
swordspoet 小成 2024-9-23 08:19:04
@nekomiao 防火墙设置一条放行 wan 到 lan 的策略,限制好端口
cdwyd 小成 2024-9-22 23:00:05
和你的方案差不多,少了一步内网 DNS 重写。完全可以直接把域名泛解析到 nginx proxy manager 所在的内网 IP ,然后配合你后面那篇用 wg 访问内网,既可以避免多服务直接暴露也减少中间步骤。
lcy630409 小成 2024-9-22 22:44:30
都内网了  还要这么长的域名干啥?
用域啊
或者直接 a.cn  b.cn 在内网 全世界的域名都是你的   https://i.fshex.co/23G3FdC9b.png
goodryb 初学 2024-9-22 21:12:53
说实话,要是局域网,一个书签 或者一个导航页就解决了,用不着这么复杂
standin000 小成 2024-9-22 20:43:38
@hefish 多大的 nas ?可以多站点同步吗
starrynight9 初学 2024-9-22 20:35:30
openwrt 内网访问直接 hostname 就可以了吧,比方说 hostname 是 debian ,那么可以使用 http://debian 或者 http://debian.lan 访问其 80 端口服务,openwrt 的 search domain 是 .lan ,属于局域网
fcbwalk 初学 2024-9-22 19:44:41
我的方案是域名全部配置解析局域网 ip,所有服务的访问都通过域名方式。然后外网借助 zerotier ,内网一台设备连接 zerotier ,配置为网关转发路由到局域网,然后 zerotier 官网配置路由。这样内外网就保持了一致。
hefish 小成 2024-9-22 19:31:38
我是扛着 nas 去上班的。到哪儿都是直接访问。
tunggt 小成 2024-9-22 19:28:50
其实你这都 nas 搭建了,干嘛不直接用 CF Tunnels 或者 frp ,让外网也直接可以访问
至于静态站点,例如导航类,真没必要部署在 nas 上。直接用 cf workers 或者 fercel 之类更方便
123下一页
返回顶部