使用 DHCP 在一张网卡上获取 2 个 IP 地址

hai*_*img 8 networking linux centos dhcp centos-5

给定:一台运行 Linux (CentOS 5.x) 的计算机,一张网卡连接到 LAN 交换机,另一张网卡通过交叉电缆连接到电缆调制解调器。这台计算机充当本地网络的路由器/防火墙/流量整形器。

计算机通过 DHCP 从 ISP 获取其公共 IP 地址。我知道我的 ISP 可以向客户端提供 2 个 IP 地址(当电缆调制解调器直接连接到集线器等时)。我想在连接到 ISP 的一台计算机上获得 2 个 IP 地址。它将简化流量隔离、NAT 和整形。

我知道我可能会“伪造”DHCP 请求并将一些脚本组合在一起,但我想知道是否有人知道更简单和正确的方法。

问题:如何让一台Linux电脑通过DHCP请求两个IP地址,并将它们都分配给一张网卡?

Pau*_*aul 8

由于 DHCP 回复基于请求接口的 MAC 地址,因此对于单个物理接口,答案是“你不能”。做到这一点的唯一方法是使用脚本。

也许类似(在主接口上定义了一个子接口):

  1. 主接口发出 DHCP 并获取 IP 地址
  2. macchanger 更改接口的 MAC 地址
  3. 子接口发出DHCP并获取IP地址
  4. 使用 macchanger 还原 mac 地址

杀死 dhcp 客户端,以便它以后不会自动运行。计算您获得的 IP 地址的租用时间,并安排此脚本在租用到期之前再次运行。

更新

为此,您需要安装 iproute2。以下命令添加绑定到现有 eth0 接口的虚拟接口:

ip link add link eth0 address 00:11:22:33:44:55 virtual0 type macvlan
Run Code Online (Sandbox Code Playgroud)

将接口的 mac 和“virtual0”名称替换为您喜欢的任何名称。打开它:

ip link set virtual0 up
Run Code Online (Sandbox Code Playgroud)

然后根据需要使用 dhcpd 或 dhclient 或 ifconfig 进行配置。我已经在 Debian 挤压上对此进行了测试 - 您的发行版可能没有在内核中启用所需的一切(尤其是 macvlan)。

  • **re:DHCP 回复基于 MAC 地址** - 实际上它是 BOOTP(DHCP 的前身)*严格*基于 MAC。DHCP 有一个 *Client ID* 选项字段,*supposed* 可以用来代替。如果客户端 ID 不存在,则 DHCP 会自行使用 MAC。因此,*理论上*可以使用相同的 MAC 但不同的 *Client ID* 制作 DHCP 请求,以从同一 DHCP 服务器获取 2 个 IP。-- 我还没有真正尝试过,只是阅读了 DHCP 规范。 (2认同)

小智 8

正如@JesseChisholm 所建议的那样,向 DHCP 服务器询问正确的事情比进行复杂的网络设置要容易得多。

对于 OpenWRT,我可以简单地运行:

 # udhcpc -i eth0:1 -x 0x3d:0100BEEFC0FFEE
Run Code Online (Sandbox Code Playgroud)

这导致有来自同一个 dhcp 服务器的两个 IP 地址。

0x36 是选项 61,它是客户端 ID 选项。在 : 之后有一个十六进制字节选项。这来自 udhcpc 的帮助选项:

 # udhcp --help
 BusyBox v1.22.1 (2014-10-08 16:34:50 HKT) multi-call binary.

 Usage: udhcpc [-fbqRB] [-t N] [-T SEC] [-A SEC/-n]
 [-i IFACE] [-s PROG] [-p PIDFILE]
 [-oC] [-r IP] [-V VENDOR] [-F NAME] [-x OPT:VAL]... [-O OPT]...

 ...
 -x OPT:VAL     Include option OPT in sent packets (cumulative)
                Examples of string, numeric, and hex byte opts:
                -x hostname:bbox - option 12
                -x lease:3600 - option 51 (lease time)
                -x 0x3d:0100BEEFC0FFEE - option 61 (client id)
Run Code Online (Sandbox Code Playgroud)