我编写了一个简单的 C 程序,可以使用它发送和接收以太网帧/dev/net/tun
,并使用虚拟桥和 veth 对将 Tap 接口与以太网网卡连接起来。
我希望在捕获以太网卡时看到来自我的水龙头的一些流量。问题是看到我的数据包来自 Tap0,我看到它们到达网桥,但在捕获以太网卡时我看不到任何东西到达。
老实说,我不知道我在做什么,所以我尝试使用 netplan 配置文件brctl
、ip
和ifconfig
.
我尝试将同一子网的 IP 地址添加到 br0 tap 和 enp8s0,并且我尝试只向网桥提供一个 IP 地址,但始终得到相同的结果,使用 veth 时也是如此
目前我的设置是:
#create tap0
sudo ip tuntap add tap0 mode tap
sudo ip link set tap0 promisc on
#create Br0
sudo ip link add br0 type bridge
sudo ip link set enp8s0 promisc on
#set to up
sudo ip link set br0 up #To add an interface br0s state must be up
sudo ip link set enp8s0 up #To add an interface its state must be up
sudo ip link set dev tap0 up #To add an interface its state must be up
#Adding the interface into the bridge is done by setting its master to bridge_name:
sudo ip link set enp8s0 master br0
sudo ip link set tap0 master br0
sudo ip addr add dev br0 192.168.4.10/24
我正在将此结构写入 Tap 文件描述符:
struct eth_hdr
{
unsigned char h_dest [6];
unsigned char h_source [6];
uint16_t ethertype;
unsigned char payload[];
} __attribute__((packed));
wireshark 显示了一个有效的以太网帧,但我不确定哪个源 mac 是合适的
我该怎么做才能将以太网标头从 tap0 更改为 enp8s0
答案1
您可以将桥视为交换机。这意味着您只会看到数据包恩普8s0如果它们是为了恩普8s0。
要查看流量,您至少有三个选项(无特定顺序):
- 将流量直接发送至恩普8s0的 MAC 地址
- 将流量发送到广播地址FF:FF:FF:FF:FF:FF
- 将交换机变成集线器(它将在所有端口上复制数据包)
brctl setageing <bridge> 0
。但这并不是桥梁通常的工作方式。