我有一台由 cortexA CPU 驱动的设备,我在其上运行 Linux:
它有 5 个网络接口。其中一个实际上是以太网接口 ( eth0
)。其他接口是tun
通过 SPI 通道与内部外围设备通信的接口。
根据我的网络知识,每个接口必须属于不同的子网。
接口tun
和与其连接的外围设备必须配置众所周知的静态地址(出于应用程序限制)。
用户eth0
在安装时选择配置静态还是动态(通过 dhcp 服务器或通过链路本地地址)。
问题是无法预先知道eth0
将配置哪个子网。所以我不知道要将哪些子网分配给tun
接口。
我尝试使用环回地址类 127.0.0.0,将接口的网络掩码lo
从 /8 更改为 /16(超出标准)。但目前无法运行tun
具有 127.1.0.0/24 等地址的接口。
我可以更安全地将哪些地址和网络掩码分配给tun
接口以最大限度地降低冲突风险eth0
?
答案1
IPv4 为私有地址定义了三个块:
192.168.*.*
(又名192.168.0.0/16
):通常用于“小型”网络(通常是您的家庭网络,因此您的以太网端口的地址可能在该范围内)10.*.*.*
(又名10.0.0.0/8
),通常用于企业内部网。172.{16..31}.*.*
(又名172.16.0.0/12
):这些地址通常用于虚拟机或 Docker 网络,可能是因为它们不太可能与使用其他两个块的“真实”网络发生冲突。出于这个原因,这也将是您的默认选择。
否则,由于您使用的是 Linux,因此您可以调查使用网络命名空间将隧道接口的地址与系统的其余部分隔离。所有现代版本的 Linux 内核都支持此功能(例如,这是 Docker 容器的基础)。
答案2
很少有地址是不需要付费的和不会与任何事情发生冲突。
- 169.254.0.0/16“链路本地”地址范围不太可能被任何实际 LAN 使用。
- 使用 240.0.0.0/4(“E 类”)保留范围的一小部分。虽然需要付出一些努力才能取消保留,但成功的可能性不大,而且也不太可能在任何 LAN 上使用。(也许 AWS 等大型网络除外。)
- 使用“文档”范围之一 (TEST-NET-x)。这可能是个坏建议,但不是最糟糕的。
- 购买一系列民众地址并永久保留。“公开”意味着您能在互联网上使用它们,并不意味着你必须这样做。
- 使用 IPv6,其链路本地地址(fe80:: 范围)永远不会冲突,因为它们始终需要指定接口。
- 使用 IPv6,并随机生成 ULA 地址范围(40 位随机性应该足够)。
答案3
我可以用两种方法来实现:
- 使用命名空间(感谢 xenoid)。这样我就可以隔离两个“网络域”,这样就不会再出现子网冲突的问题了。
- 我能够使用 127.1.0.0/24 类地址,而无需修改内核。
只需在本地网络上启用路由:
sudo sysctl -w net.ipv4.conf.<interface>.route_localnet=1
然后,如果您不想将网络掩码更改为接口,lo
则可以使用一些iptables
规则/链。