假设:一台运行 Linux(CentOS 5.x)的计算机,一个网卡连接到 LAN 交换机,另一个网卡通过交叉电缆连接到电缆调制解调器。这台计算机充当本地网络的路由器/防火墙/流量整形器。
计算机通过 DHCP 从 ISP 获取其公共 IP 地址。我知道我的 ISP 可以向客户端提供 2 个 IP 地址(当电缆调制解调器直接连接到集线器等时)。我希望在连接到 ISP 的一台计算机上获取 2 个 IP 地址。这将简化流量隔离、NAT 和整形。
我知道我可能可以“伪造” DHCP 请求并拼凑一些可以执行此操作的脚本,但我想知道是否有人知道更简单且正确的方法。
问题:如何让 Linux 计算机通过 DHCP 请求两个 IP 地址并将它们都分配给一个网卡?
答案1
由于 DHCP 答复基于请求接口的 MAC 地址,并且只有一个物理接口,因此答案是“您不能”。唯一的方法是使用脚本。
或许类似于(在主接口上定义子接口):
- 主接口发出 DHCP 并获取 IP 地址
- macchanger 改变接口的 MAC 地址
- 子接口发出 DHCP 并获取 IP 地址
- 使用 macchanger 恢复 mac 地址
终止 dhcp 客户端,以便它不会在稍后自动运行。计算出您获得的 IP 地址的租约时间,并安排此脚本在租约到期之前再次运行。
更新
为此,您需要安装 iproute2。以下命令将添加绑定到现有 eth0 接口的虚拟接口:
ip link add link eth0 address 00:11:22:33:44:55 virtual0 type macvlan
将接口的 mac 和“virtual0”名称替换为您喜欢的任何名称。打开它:
ip link set virtual0 up
然后根据需要使用 dhcpd 或 dhclient 或 ifconfig 进行配置。我已在 Debian squeeze 上测试过 - 您的发行版可能没有在内核中启用所有需要的功能(特别是 macvlan)。
答案2
正如@JesseChisholm 所建议的,向 DHCP 服务器询问正确的信息比进行复杂的网络设置要容易得多。
对于 OpenWRT 我可以简单地运行:
# udhcpc -i eth0:1 -x 0x3d:0100BEEFC0FFEE
这导致来自同一个 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)