我想测试我在 Ubuntu 16.04.6 LTS 上编写的 DHCP 客户端。我想在我的笔记本电脑上本地执行此操作,即在内部发送和接收 DHCP 数据包。
这是我尝试过的:
- 创建了两个虚拟接口:
dummy0
,dummy1
- 为这两个接口创建了桥接:
br0
目标是从 发送 DHCP discoverydummy0
并在 上接收它dummy1
,我在 上发送 DHCP discovery ,不幸的是我在接口dummy0
上没有看到任何数据包。dummy1
如果可以接收到,下一步将是运行 DHCP 服务器来dummy1
测试我的客户端的运行情况。
我在接口wireshark
上看到 DHCP 发现。dummy0
我在 上什么也没看到dummy1
。另外:我在 上看到了数据包br0
。
我想可能有更好的方法来做到这一点,你能告诉我如何做到这一点吗?
答案1
“Boomerang 数据包”(从一个本地接口发出,在另一个本地接口上接收)被视为路由错误(在某处循环),并且默认情况下被内核丢弃。
此外,使用虚拟设备也很麻烦。
更好的方法:创建一个(或两个)网络命名空间,在网络命名空间和主命名空间(或两个网络命名空间)之间放置一个 veth 对。不需要桥梁。然后测试你想要的一切。
在每个命名空间中运行一个xterm
,让您的生活更轻松。
这是我用来执行此操作的脚本。随意修改。
#!/bin/bash
# Setup network namespace with veth pair, start xterm in it
# nsterm ns0 veth0 10.0.0 yellow 24
#
# tested: yellow, lime, orange, cyan
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root" 1>&2
exit 1
fi
NS=${1:-ns0}
DEV=${2:-veth0}
DEV_A=${DEV}a
DEV_B=${DEV}b
ADDR=${3:-10.0.0}
ADDR_A=${ADDR}.254
ADDR_B=${ADDR}.1
MASK=${5:-24}
COL=${4:-yellow}
# echo ns=$NS dev=$DEV col=$COL mask=$MASK
ip netns add $NS
ip link add $DEV_A type veth peer name $DEV_B netns $NS
ip addr add $ADDR_A/$MASK dev $DEV_A
ip link set ${DEV}a up
ip netns exec $NS ip addr add $ADDR_B/$MASK dev $DEV_B
ip netns exec $NS ip link set ${DEV}b up
ip netns exec $NS ip link set lo up
ip netns exec $NS ip route add default via $ADDR_A dev $DEV_B
ip netns exec $NS su -c "xterm -bg $COL &" your_username
答案2
我认为这里的答案(命令)很容易理解和遵循。 对于 veth 对,ping 无法识别接口名称,并且 tc qdisc netem 不起作用