![物理和虚拟网络接口具有相同的 MAC。这可能吗?](https://linux22.com/image/1504244/%E7%89%A9%E7%90%86%E5%92%8C%E8%99%9A%E6%8B%9F%E7%BD%91%E7%BB%9C%E6%8E%A5%E5%8F%A3%E5%85%B7%E6%9C%89%E7%9B%B8%E5%90%8C%E7%9A%84%20MAC%E3%80%82%E8%BF%99%E5%8F%AF%E8%83%BD%E5%90%97%EF%BC%9F.png)
首先,我是网络新手,所以,也许某个地方有我的问题的答案,但我找不到答案。
嗯,我有很多设备都连接了互联网。我想使用 VPN 技术将它们全部连接到一个网络。我使用 tinc-vpn 来解决我的需求,我想使用 DHCP 来配置我的网络。
问题出在这里:我已经成功配置了 DHCP 服务器并且它可以很好地为所有连接的设备提供服务,但是当我重置设备时它会从 DHCP 获取新地址。
据我了解,当设备上线时,它会向网络发送包含设备 MAC 的特殊广播请求。DHCP 处理该请求并将带有网络配置的响应发送回设备。好吧,ifconfig
在设备上为 VPN 设置虚拟接口并为其分配随机 MAC。为什么我总是得到随机 IP。我想如果我要求ifconfig
将物理网络的 MAC 地址分配给虚拟接口,我就能解决我的问题。可能吗?如果不行,我该如何解决我的问题?如果 DHCP IP 池很大,我就不会为此烦恼,但它只能服务 250 台设备,而且设备经常离线。
提前致谢。
答案1
感谢大家的回复。
我认为我找到了一个极好的解决方案,无需 DHCP。它基于使用设备的物理 MAC 地址计算唯一的静态 IP 地址。
在我的解决方案中,我将使用 /16 子网(例如 10.1.0.0)。因此,对于所有设备,我必须计算 IP 的最后 2 个八位字节。对于我的计算,我使用CRC-16对设备的真实 MAC 地址进行哈希函数运算。结果中我将得到包含 IP 地址八位字节的 2 字节整数。
例如。设备的 MAC 地址是22-23-B2-72-99-3A. MAC 的 CRC-16 将为0x2e49. 0x2e == 46 且 0x49 = 73,因此设备 IP 将为 10.1.46.73。
优点:
- 没有 DHCP;
- 已知道该设备在所有网络上的永久且唯一的 IP。
缺点:
- MAC 地址的 CRC-16 冲突(同一子网中的两个设备具有相同的 IP 但具有不同的 MAC 地址)。但我认为这种情况发生的概率可以忽略不计。
欢迎任何建议和批评。
答案2
回答标题:可以在两个接口上设置相同的 MAC,但这可能会导致一些网络问题或只是意外行为。
有四种方法(我知道)可以解决您的问题:
- 正如 grawity 所建议的:在 DHCP 服务器上为特定主机名保留 ip 地址。
- 创建虚拟网络设备后,为其分配特定的 MAC 地址。在 Linux 上,可以使用脚本自动执行此操作。
- 使用 DHCP 客户端请求特定 IP 地址。为了确保可靠性,您应将 DHCP 租约期限缩短(例如 5 分钟或 1 小时,具体取决于您的 vpn 登录频率),这样请求的 IP 就不会被有效租约占用。
- 由于您的 VPN 网关不太可能经常更改,因此您可以使用静态 IP 设置。您始终需要该 IP - 那么为什么要使用 DHCP?缩小 DHCP IP 范围,并将部分释放的空间用于静态 IP...
编辑:
因此,脚本会多次运行以自动创建新设备。在这种情况下,您可以从设备名称计算 IP(或 MAC)。示例:
PREFIX='tap'
DEV_NUM=${INTERFACE#$PREFIX}
# it's good idea to increment, because devices usually number from 0
# and ip ending with .0 and .1 generally shouldn't be used by a client
DEV_NUM=$(($DEV_NUM+2))
ifconfig ${INTERFACE} 10.0.1.${DEV_NUM} netmask 255.255.0.0
MAC_NUM=`printf "%02d\n" ${DEV_NUM}`
ip link set dev ${INTERFACE} address ba:df:ace:00:00:${MAC_NUM}
或者维护将 IP 分配给设备名称的文件。例如:
ADDRESS_MAP='/etc/vpn-ip-mapping.conf'
while IFS='='; read -ra line; do
if [ "${line[0]}" == "${INTERFACE}" ]; then
IP_ADDRESS=${line[1]}
ifconfig ${INTERFACE} ${IP_ADDRESS} netmask 255.255.0.0
break
fi
done < ${ADDRESS_MAP}
答案3
多一个。
我发现一个问题,为什么在建立连接后我无法从设备上的 DHCP 接收配置。原因是创建隧道后执行的tinc-up
其他脚本tinc
与 tinc 服务同步,并且我的 dhcp 客户端在进行tinc
握手之前因超时而退出。
为了解决这个问题,我在tinc-up
脚本后台运行 dhcp 客户端。
tinc-up
脚本现在如下所示:
#!/bin/sh
ifconfig $INTERFACE hw ether fe:fd:00:00:00:00 # set interface hw address to get same IP from leases every time, connection established
dhcpcd -w $INTERFACE & # start dhcp client parralel with handshake proccess of tinc