mafik/gatekeeper
GitHub: mafik/gatekeeper
Gatekeeper 是一款专为家庭网络设计的 DHCP 与 DNS 服务器,帮助用户替换 ISP 路由器并获得更高的网络可见性和控制力。
Stars: 90 | Forks: 3
# [](https://github.com/mafik/gatekeeper) Gatekeeper
专为家庭网络优化的 DHCP & DNS 服务器。
[](https://github.com/mafik/gatekeeper/actions/workflows/test.yml)
## 什么是 Gatekeeper?
在你和互联网之间,有一个路由器——一台将你的家庭网络连接到互联网的小型计算机。它负责为你的设备分配 IP 地址,在你的私有网络和互联网之间进行转换等等。每一个进出你家庭的网络数据包都要经过路由器。通常,这些路由器是由你的互联网服务提供商(ISP)提供的,你对它们的控制权非常有限。
**Gatekeeper 是一款软件,它允许你替换(或隔离)ISP 提供的路由器。借助 Gatekeeper,你可以获得对家庭网络更高的可见性和控制力。**
还有其他一些软件项目可以管理路由器,但它们通常针对专业用途和最大的灵活性进行了优化。这使得它们相当复杂。与其他软件不同,Gatekeeper 是专门为家庭网络设计的。
由于它是为家庭使用而设计的,因此更加简单,具有更好的默认设置,可以自动进行配置,并且能够告诉你那些普通(商用)路由器无法提供的关于 IoT 设备的信息。
### 截图
[2023-10-21 Gatekeeper 录屏.webm](https://github.com/mafik/gatekeeper/assets/309914/52696ba2-1d2e-4846-b2db-c3e2e8f8d657)
| 亮色模式 | 暗色模式 |
| ------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- |
|  |  |
### 功能
展开下面的每个部分以查看更多详细信息:
## 运行 Gatekeeper
运行 Gatekeeper 非常简单。如果你是 Linux 新手,可能会花费较长的时间,但别担心——本节将逐步指导你完成整个过程。一旦你熟悉了该过程并拥有合适的硬件,你将能够使用单个命令来设置 Gatekeeper!
设置过程大致可以分为以下四个步骤:
将要运行 Gatekeeper 的机器至少需要两个以太网端口。一个用于广域网(WAN)端,一个用于局域网(LAN)端。可能还需要更多——这取决于你想直接连接多少个局域网客户端。如果你的机器只有一个以太网端口(几乎都是这种情况),你随时可以购买一个 USB 以太网适配器来添加第二个端口。购买一个以太网交换机也可能是个好主意(在 Amazon 上购买新的交换机花费不到 20 美元),因为它们比一堆 USB 以太网适配器更具成本效益。
还有无线连接的问题。目前为止,Gatekeeper 还不能配置无线局域网,但如果你对 Linux 比较有经验,可以使用 wpa_supplicant 来设置网络。一旦无线设置到位,Gatekeeper 将很乐意对其进行管理。你也可以花点钱购买无线接入点(确保它是一个“傻瓜式”接入点——而不是“路由器”),并将任何常规的以太网端口转换为无线端口。
*好的,那么在满足所有这些要求的情况下,我们在硬件方面有哪些选择?*
第一种也是最明显的一种是**你手边闲置的任何笔记本电脑**(或 PC)。借助简单的 USB 以太网适配器,你可以将其连接在 ISP 路由器和你的局域网之间。你也可以**在网上寻找二手笔记本电脑**。计算机硬件的价值下降得非常快,因此你可能会在网上找到非常划算的交易。不过要小心功耗——一台廉价的 PC 在电费上的花费实际上可能比硬件本身还要高。一般来说,笔记本电脑不是问题——它们的功耗很少超过 20 W——但在购买新设备时,最好还是算一笔账并考虑到电费因素。
第二种选择是购买一台**单板 x86 计算机**。单板计算机通常被称为 SBC,是通用计算机中最紧凑的外形。它们看起来类似于小型设备,并且没有普通 PC 或笔记本电脑那么大的升级潜力,但在其他方面并没有太大区别。对于一台需要全天候运行的机器来说,紧凑和节能是非常好的。“x86”部分指示了 Gatekeeper 可以运行的计算机类型。一些 SBC 标记为“ARM”。不过,Gatekeeper 正在增加对 ARM 的支持——因此目前最好避开它们,去寻找一款 x86 架构的 SBC。要寻找它们,你可以谷歌搜索“x86 sbc”。我个人的选择是 https://eu.protectli.com/。它们价格偏高,而且从技术上讲它们不是 SBC,但它们除了运行 Gatekeeper 外还能处理更多任务。我对我的 4 端口 VP2420 非常满意,我同时也用它来托管我的网站。
总的来说,如果你是初学者,我建议你尝试使用笔记本电脑的方案。SBC 没有屏幕或键盘,这使得它们在设置过程中稍微麻烦一些。如果出现任何问题,当你只需要翻开一台笔记本电脑,而不是搬着显示器和笔记本电脑去查看为什么 SBC 在网络上无法访问时,调查起来会容易得多。
好的,硬件准备好了,我们可以开始设置操作系统了!
` 清除其 IP,或者通过在运行 Gatekeeper 时带上 `LAN=` 环境变量来告诉 Gatekeeper 直接使用它。
你也可以在 `LAN` 变量中传入多个以空格分隔的接口名称。Gatekeeper 会将它们连接到一个单一的局域网中。如果你正在使用多个 USB 以太网适配器,或者你足够幸运拥有一台带有多个以太网端口的机器,这将会非常方便。
```
LAN="eth0 eth1 wlan0" ./gatekeeper # connect eth0, eth1 & wlan0 into a single LAN network
```
如果 Gatekeeper 已经安装完毕(你完成了下一步),最简单的方法是运行 `sudo systemctl edit gatekeeper` 并添加以下几行:
```
[Service]
Environment="LAN="
```
## 限制
Gatekeeper 不会配置 WAN 接口。大多数 Linux 发行版会在启动期间通过 DHCP 自动执行此操作,但情况并非总是如此。未来 Gatekeeper 会处理此问题。
Gatekeeper 仅在 x86_64 架构的 Linux 上运行。未来我希望也能将其移植到 ARM(32 位和 64 位)及 MIPS(适用于那些极其廉价的 OpenWRT 路由器)上。
如果有你希望看到的功能,请毫不犹豫地深入研究代码。Gatekeeper 使用可读性强且现代的 C++ 编写,使得任何具备 C++ 基础的人都能轻松扩展它。
## 从源码构建
可以使用包含的 Python 脚本来构建和测试 Gatekeeper:
```
./run -h # show help about available options
```
运行 Gatekeeper 的本地实例,并在其源代码发生更改时重新编译和加载。
```
LAN= ./run gatekeeper --live
```
Gatekeeper 有三种构建变体:`gatekeeper`、`debug_gatekeeper` 和 `release_gatekeeper`。请使用默认的(`gatekeeper`)进行常规开发,因为它的构建速度最快。当你需要调试崩溃或内存泄漏时,`debug_gatekeeper` 将为你提供更多的调试信息。最后,`release_gatekeeper` 是几乎没有调试信息的优化构建——GitHub 发布版使用的就是这种构建。
在 [src/dev_commands.py](src/dev_commands.py) 中有一些特殊的构建目标,比如 `./run gdb` 或 `./run test_e2e`。在以 `test_` 开头的函数中有一大堆测试,你可能会觉得很有趣。该文件中的一些目标(`dogfood`、`net_reset`)是我的环境所特有的但它们应该相当清晰并且易于定制化。
运行端到端测试。它会设置一个虚拟局域网,并检查其是否被 Gatekeeper 正确管理。
```
./run test_e2e
```
与上述相同,但所有内容均从头开始(不重用缓存的构建结果)。
```
./run test_e2e --fresh
```
## 报告漏洞
请参见 [SECURITY.md](SECURITY.md)。
## 鸣谢
- Logo 来自 [aamatniekss.itch.io](https://aamatniekss.itch.io/fantasy-knight-free-pixelart-animated-character)([Twitter](https://twitter.com/Namatnieks))
- 白天的云彩来自 [anokolisa.itch.io](https://anokolisa.itch.io/sidescroller-pixelart-sprites-asset-pack-forest-16x16/devlog/398014/high-forest-new-update)([Patreon](https://img.itch.zone/aW1nLzkzMTE1NzAucG5n/original/lXKJcR.png)、[Twitter](https://img.itch.zone/aW1nLzkzMTE1NzEucG5n/original/ph%2BgkH.png)、[Instagram](https://img.itch.zone/aW1nLzEwNDYzNDQ5LnBuZw==/original/Di01oS.png))
- 白天的山脉来自 [vnitti.itch.io](https://vnitti.itch.io/grassy-mountains-parallax-background)([DeviantArt](http://www.deviantart.com/vnitti)、[Twitter](https://twitter.com/vnitti_art))
- 夜晚主题来自 [brullov.itch.io](https://brullov.itch.io/2d-platformer-asset-pack-castle-of-despair)([Twitter](https://twitter.com/brullov_art))
- 标题图标来自 [cainos.itch.io](https://cainos.itch.io/pixel-art-platformer-village-props)([Twitter](https://twitter.com/cainos_chen))
- 字体来自 [github.com/Omnibus-Type/Texturina](https://github.com/Omnibus-Type/Texturina)
- 剪贴画
- 地球与人物由 callmetak 提供,来自 Freepik
隐私
### 隐私 Gatekeeper 故意将经过路由器的流量(DNS 查询和实时流量统计)暴露给所有局域网成员。虽然这听起来可能有点令人毛骨悚然,但同样的数据也可能被以下方式拦截: * 连接到你家庭网络的恶意 IoT 设备、智能手机应用程序和 [PC](https://cylab.be/blog/73/man-in-the-middle-mitm-with-arpspoof) * [ISP](https://notes.valdikss.org.ru/jabber.ru-mitm/) * IXP(互联网交换中心) * VPN * TOR 出口节点 这是一个系统性问题,其严重程度随着公众意识的缺乏而增加。Gatekeeper 旨在解决这个问题。它赋予普通用户去做那些目前由公共机构和不良企业秘密进行的操作的能力。示例
可见性
### 可见性 Gatekeeper 的最初目的是为了了解哪些 IoT 设备连接到了网络以及它们在做什么。Gatekeeper 为你提供了所有连接到网络的设备及其网络实时活动的概览: - 网络中到底存在哪些设备?(MAC、IP、主机名) - 它们在做什么?(DNS 查询、每个域名的流量摘要和实时流量图表)简单易用
### 简单易用 Gatekeeper 是一个单一的可执行文件,它会自动进行配置,每周自动更新,并在出现挂起或崩溃时自动重启。一旦安装完成,它应该永远不需要任何手动干预。 因为 Gatekeeper 可以假定它被用作家庭网关,所以它可以避免任何形式的手动配置。 Gatekeeper 也是*无状态*的——这意味着它不会在磁盘上存储任何数据。如果出现任何问题,只需简单的重启(这也是完全自动化的)就能始终解决。Full Cone NAT(网络地址转换)
### Full Cone NAT(网络地址转换) 得益于执行 Full Cone NAT 的能力,Gatekeeper 为局域网客户端提供了同类最佳的连接性。这意味着你的 PC 将很容易与互联网上的其他 PC 建立直接连接。这对于视频通话、文件共享或游戏等点对点应用非常有用。 有人可能会说它将你的设备暴露在了互联网上,但事实并非如此——只有你的设备用于传出连接的特定端口才会被重定向回设备。监听端口将保持关闭。选择路由器硬件
一般来说,Gatekeeper 需要位于你的局域网和互联网之间。它既可以完全替换 ISP 提供的路由器,也可以位于 ISP 路由器和你的局域网之间。虽然替换 ISP 路由器可以减少计算机数量和总功耗,但这可能更加复杂。一些 ISP 会执行 MAC 过滤来限制对其网络的访问。通常可以通过克隆 ISP 路由器的 MAC 地址来绕过它,但这超出了本指南的范围。不过,你可以随意将其作为练习进行尝试!在这里,我们将介绍 Gatekeeper 用于将 ISP 路由器与你的局域网“隔离”的情况。安装 Linux
Gatekeeper 可以在任何 64 位的 Linux 上流畅运行。如果你的机器已经安装了 Linux,请随意跳过本节。 Linux 有很多分支,具体取决于你想用计算机做什么。大多数人会选择 Ubuntu,因为它具有完善的体验和极高的普及度。对于服务器机器,我实际上会推荐 Debian。在底层,它与 Ubuntu 非常相似,因此大多数针对 Ubuntu 的指南也能在 Debian 上运行。Debian 也因其“无聊”而闻名,但对于服务器来说,“无聊”是一件好事。安全问题非常罕见,而且各个版本之间通常不会有太大变化。 事不宜迟,让我将你引导至另一篇指南,它将解释如何安装 Debian:https://www.debian.org/releases/bookworm/amd64/。 如果你是 Linux 新手,这一步可能会花费相当多的时间。一旦你熟悉了流程,这大约只需要 5 分钟的手动操作和 15 分钟等待安装完成的时间。 完成安装后,我们就可以通过测试和安装 Gatekeeper 来完成整个过程了!下载并运行 Gatekeeper
好的,我们已经在这个设置上浪费了足够多的时间,所以让我们快点把这一步解决掉。 复制此命令并在终端中运行它: ``` curl -L https://github.com/mafik/gatekeeper/releases/latest/download/gatekeeper.x86_64 -o gatekeeper \ && chmod +x gatekeeper \ && sudo ./gatekeeper ``` 就是这样。命令的第一部分将从 GitHub 获取最新版本的 Gatekeeper,第二部分将使其具有可执行权限,最后一部分将以管理员权限运行它。 在启动期间,Gatekeeper 将搜索任何未配置的网络接口,并将它们转变为局域网。你可以随时通过在终端窗口中按 Ctrl+C 来停止它。 你可以打开命令行中打印的 URL(通常是 http://10.0.0.1:1337/)来查看 Web 界面。也可以从局域网中的任何计算机上访问它。 #### LAN 接口选择 你遇到了这样的错误吗? ``` Couldn't find any candidate interface (src/gatekeeper.cc:###). ``` 默认情况下,Gatekeeper 将仅管理没有 IP 地址的接口。如果你的局域网接口已经配置完毕,你可以使用 `sudo ip addr flush dev开机自启 Gatekeeper
要永久安装 Gatekeeper,请按 Web 界面中的 `Install` 按钮。 要了解底层发生了什么,你应该了解一款名为 **systemd** 的软件。它是一个在现代 Linux 机器上管理后台任务的程序。在安装过程中,Gatekeeper 会将自己复制到 `/opt/gatekeeper/`,并将自己注册为一个 systemd 服务。得益于 systemd,Gatekeeper 不仅会在每次开机时自动启动,而且还会在崩溃或挂起时自动重启。 安装后,你可以使用 `rm gatekeeper` 删除下载的二进制文件。Gatekeeper 已经将自身复制到了 `/opt/gatekeeper/`,因此不再需要它了。 如果你看到了带有安装日志的页面,那就意味着该过程已成功完成。🎉🎉 恭喜! #### 卸载 要移除 Gatekeeper,请运行 `sudo systemctl disable --now gatekeeper`(这将停止 Gatekeeper 并防止其在下次重启时再次启动)。同时运行 `sudo rm -rf /opt/gatekeeper` 以删除任何已安装的文件。
## 从源码构建
前置条件
使用以下命令安装最新的 LLVM 及开发工具: ``` sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" sudo apt install -y inotify-tools ```标签:DHCP服务器, DNS服务器, 家庭网络, 网络网关, 路由器软件