在一个接口上发送数据包并在另一接口上接收数据包以进行测试

在一个接口上发送数据包并在另一接口上接收数据包以进行测试

我想测试我在 Ubuntu 16.04.6 LTS 上编写的 DHCP 客户端。我想在我的笔记本电脑上本地执行此操作,即在内部发送和接收 DHCP 数据包。

这是我尝试过的:

  • 创建了两个虚拟接口:dummy0dummy1
  • 为这两个接口创建了桥接: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 不起作用

相关内容