MitseaBlog/content/post/77af4e22a9e44f7f8c2803edc33ab33b/index.zh-cn.md
2024-03-20 21:00:27 +08:00

94 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

+++
author = "FlintyLemming"
title = "Netbird 子网路由设置 (处理不便安装的设备)"
slug = "77af4e22a9e44f7f8c2803edc33ab33b"
date = "2024-03-11"
description = ""
categories = ["HomeLab", "Network"]
tags = ["异地组网", "Tailscale", "Netbird"]
image = "https://img.mitsea.com/blog/posts/2024/03/Netbird%20%E5%AD%90%E7%BD%91%E8%B7%AF%E7%94%B1%E8%AE%BE%E7%BD%AE%20%EF%BC%88%E5%A4%84%E7%90%86%E4%B8%8D%E4%BE%BF%E5%AE%89%E8%A3%85%E7%9A%84%E8%AE%BE%E5%A4%87%EF%BC%89/martin-katler-eVk59Ks4k2U-unsplash.jpg?x-oss-process=style/ImageCompress"
+++
上一期简单介绍了 Netbird 的子网路由的配置,相比与 Tailscale 真的是简单很多。但是还遗留一个问题,就是如果设备不方便或者不想安装 Netbird 应该怎么办。其实不影响的,两个内网只要分别在一台设备上安装 Netbird这两个内网的所有设备其实都可以互访。比如在下图中让设备 A1 直接访问 B1红色箭头。当然也可以直接访问 Netbird 内网中的其他设备(橙色箭头)。
![](https://img.mitsea.com/blog/posts/2024/03/Netbird%20%E5%AD%90%E7%BD%91%E8%B7%AF%E7%94%B1%E8%AE%BE%E7%BD%AE%20%EF%BC%88%E5%A4%84%E7%90%86%E4%B8%8D%E4%BE%BF%E5%AE%89%E8%A3%85%E7%9A%84%E8%AE%BE%E5%A4%87%EF%BC%89/Netbird_%25E5%2586%2585%25E7%25BD%2591%25E8%25B7%25AF%25E7%2594%25B1.jpg?x-oss-process=style/ImageCompress)
这样在内网其他设备上即便不安装任何组网工具,也可以无缝访问多个内网
![](https://img.mitsea.com/blog/posts/2024/03/Netbird%20%E5%AD%90%E7%BD%91%E8%B7%AF%E7%94%B1%E8%AE%BE%E7%BD%AE%20%EF%BC%88%E5%A4%84%E7%90%86%E4%B8%8D%E4%BE%BF%E5%AE%89%E8%A3%85%E7%9A%84%E8%AE%BE%E5%A4%87%EF%BC%89/Untitled.png?x-oss-process=style/ImageCompress)
## 准备工作
在两个内网中分别选取一个设备安装 Netbird 并配置为路由,让两个设备分别可以访问对方内网所有设备。在新版中 Netbird 可以选取 Windows 设备作为路由,不过我感觉 Windows 的网络栈比较灵车,所以我还是建议使用一台 Linux 设备。
这次配置以 Ubuntu 系统为例,配置区域 A 的内网设备可以访问区域 B 的内网设备,反向同理。
## 配置 Netbird 路由
配置方法在上一集已经说过了,这里简单提一下,最近 Netbird UI 改了一次。
1 处填写目标区域内网 IP 地址段
2 处填写目标区域内网安装 Netbird 的设备
3 处填写来源区域内网安装 Netbird 的设备所在的 Group
![](https://mitsea-img.oss-cn-shanghai.aliyuncs.com/blog/posts/2024/03/Netbird%20%E5%AD%90%E7%BD%91%E8%B7%AF%E7%94%B1%E8%AE%BE%E7%BD%AE%20%EF%BC%88%E5%A4%84%E7%90%86%E4%B8%8D%E4%BE%BF%E5%AE%89%E8%A3%85%E7%9A%84%E8%AE%BE%E5%A4%87%EF%BC%89/Untitled%201.png)
这样的话,以开头的图为例,设备 A2 就可以访问区域 B 的所有内网设备了
## 配置静态路由
设置区域 A 的路由器,添加静态路由。目的是让这个内网设备访问区域 B 的内网网段时,不会被路由器丢弃,而是发送到 Netbird 设备上。具体配置如下:
![](https://img.mitsea.com/blog/posts/2024/03/Netbird%20%E5%AD%90%E7%BD%91%E8%B7%AF%E7%94%B1%E8%AE%BE%E7%BD%AE%20%EF%BC%88%E5%A4%84%E7%90%86%E4%B8%8D%E4%BE%BF%E5%AE%89%E8%A3%85%E7%9A%84%E8%AE%BE%E5%A4%87%EF%BC%89/Untitled%202.png?x-oss-process=style/ImageCompress)
目的地址和子网掩码:填写区域 B 的内网网段,可以再加一条,填写 Netbird 的内网网段
下一跳:填写当前内网里安装 Netbird 设备的 IP 地址
出接口LAN
## 配置 Netbird 设备
浏览器添加静态路由后,访问区域 B 的内网请求就被转发到了 Netbird 设备上。但是这个设备还要进行一些配置才能正确通过 Netbird 虚拟局域网转发流量。具体配置如下:
1. 确认 Netbird 创建的 TUN 所使用的 Interface 名称(一般是 wt0以及默认联网网卡的 Interface 名称。你可以使用`ip addr show` 来确认
![](https://img.mitsea.com/blog/posts/2024/03/Netbird%20%E5%AD%90%E7%BD%91%E8%B7%AF%E7%94%B1%E8%AE%BE%E7%BD%AE%20%EF%BC%88%E5%A4%84%E7%90%86%E4%B8%8D%E4%BE%BF%E5%AE%89%E8%A3%85%E7%9A%84%E8%AE%BE%E5%A4%87%EF%BC%89/Untitled%203.png?x-oss-process=style/ImageCompress)
我这边就是 wt0 和 eth0这两个 Interface 名称要记住,后面配置 iptables 要用。
2. 开启 ipv4 转发
`/etc/sysctl.conf` 文件中添加或修改以下行:
```
net.ipv4.ip_forward = 1
```
然后运行 `sudo sysctl -p` 来应用更改
3. 配置 NAT 规则
```bash
sudo iptables -I FORWARD -i eth0 -j ACCEPT
sudo iptables -I FORWARD -o eth0 -j ACCEPT
sudo iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -I FORWARD -i wt0 -j ACCEPT
sudo iptables -I FORWARD -o wt0 -j ACCEPT
sudo iptables -t nat -I POSTROUTING -o wt0 -j MASQUERADE
```
这个规则设置主要干了两件事:
1. 使用 MASQUERADE 隐藏了从 eth0 出去的流量让所有经过设备A的包看起来都是由本机发出的wt0 同理)
2. 允许 eth0 和 wt0 的流量转发
若对安全性有要求,可以细化规则
至此设置完毕
> Photo by [Martin Katler](https://unsplash.com/@martinkatler?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash) on [Unsplash](https://unsplash.com/photos/a-close-up-of-a-blue-and-purple-object-eVk59Ks4k2U?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash)