描述:
我和我的团队正在使用几台 Raspberry Pi 3 和一个名为 PicoTCP 的 IP 堆栈。PicoTCP 使用 TAP 接口,我们的接口称为tap0
。tap0
与 PicoTCP 一起使用时,接口必须有自己的 IP。不幸的是,由于接口tap0
是虚拟化的,它无法感知同一 LAN 上的其他 Raspberry Pi。显然,我们需要将接口tap0
与以太网接口桥接起来eth0
以解决这个问题(如果我错了,请纠正我)。我们尝试了很多解决方案,但都无济于事!
技术信息:
- 所有 Pi 都通过以太网连接到同一个路由器
- 所有 Pi 都运行最新版本的 Raspbian OS
我们尝试过以下几种解决方案: https://help.ubuntu.com/community/Network%20Bridge%20with%20a%20Tap!
auto br0
iface br0 inet dhcp
pre-up tunctl -t (tap device ""ex:tap0"") -u (tap owner) -g (owner group name)
pre-up ip link set dev eth0 down ('''Brings down ethernet''')
pre-up brctl addbr br0 ('''Adds bridge''')
pre-up brctl addif br0 eth0 ('''Adds eth0 to bridge''')
pre-up brctl addif br0 tap0 ('''Adds tap0 to bridge''')
pre-up ip link set dev tap0 up ('''Bring tap0 up''')
up chmod 0666 /dev/net/tun ('''Changes permissions on tap device to user/ owner''')
post-down ip link set dev eth0 down ('''Brings down eth0''' )
post-down ip link set dev tap0 dpwn ('''Brings down tap0''')
post-down ip link set dev br0 down ('''Brings down br0''')
post-down brctl delif br0 eth0 ('''Removes bridge between br0 & eth0''')
post-down brctl delif br0 tap0 ('''Removes bridge between br0 & tap0''')
post-down brctl delbr br0 ('''Removes bridge''')
如何将 tap 桥接到 Raspberry Pi 上的 eth0?
ip tuntap add tap0 mode tap user root
ip link set tap0 up
ip link add br0 type bridge
ip link set tap0 master br0
ip link set dev eth0 down
ip addr flush dev eth0
ip link set dev eth0 up
ip link set eth0 master br0
ip link set dev br0 up
http://prssrp.blogspot.com/2014/02/raspberry-pi-openvpn-server-bridge-mode.html
#!/bin/bash
#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
#################################
# Define Bridge Interface
br="br0"
# Define list of TAP interfaces to be bridged,
# for example tap="tap0 tap1 tap2".
tap="tap0"
# Define physical ethernet interface to be bridged
# with TAP interface(s) above.
eth="eth0"
eth_ip="192.168.10.253"
eth_netmask="255.255.255.0"
eth_broadcast="192.168.10.255"
for t in $tap; do
openvpn --mktun --dev $t
done
brctl addbr $br
brctl addif $br $eth
for t in $tap; do
brctl addif $br $t
done
for t in $tap; do
ifconfig $t 0.0.0.0 promisc up
done
ifconfig $eth 0.0.0.0 promisc up
ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast
PicoTCP 利用tap0
接口:
struct pico_device* init_picotcp(void) {
struct pico_device *dev;
struct pico_ip4 ipaddr, netmask, local;
pico_string_to_ipv4("tap0", &local.addr);
dev = pico_ipv4_link_find(&local);
if(!dev) {
printf("FAIL!\n");
return NULL;
}
pico_string_to_ipv4(serv.ipv4_addr.c_str(), &ipaddr.addr);
pico_string_to_ipv4(serv.netmask.c_str(), &netmask.addr);
pico_ipv4_link_add(dev, ipaddr, netmask);
return dev;
}
这一行:
pico_ipv4_link_add(dev, ipaddr, netmask);
tap0
使用特定的 IP 和网络掩码打开创建的设备。
尤其:
这些解决方案对我们来说都不起作用。
答案1
(picoTCP 开发人员在此)
第一个(非常粗略的)猜测:您可能正在使用 root 权限设置 TAP 设备。您是否也以 root 身份运行 picoTCP?如果不是,则可能由于权限问题而无法打开 TAP。首先尝试在 sudo 下运行 picoTCP 应用程序。
如果你不喜欢以 root 身份运行应用程序,你可以使用sudo tunctl -u <username>
它来设置可访问的 tap 设备<username>
。
如果不是这个原因,可能需要更多信息:是否有任何工具打印了一些错误或警告?您所说的“这些解决方案对我们都不起作用”究竟是什么意思 - 其中一个命令(或 picoTCP 应用程序)是否报告了错误、停止或崩溃,或者一切都在运行,但您无法 ping 设备?您可以在 tap 设备上进行 wireshark 转储,以便我们查看来来去去的内容?ifconfig -a
当您设置好一切后,您可以向我们展示 的输出吗?也许brctl show
还有 的输出。(抱歉,问题列表很长,只是有很多小事可能会出错。)
此外,我们在 README.md 的开发分支中还有一些新的示例代码(https://github.com/tass-belgium/picotcp/blob/development/README.md),您可以查看一下。它也可以与 Tap 设备配合使用(尽管不能与桥接配合使用)。它应该在我们的下一个版本中被推送到 master,这已经花了很长时间。如果该示例有效(没有桥接),也许您可以尝试修改代码示例中的 IP 地址以匹配您的本地网络,然后再次设置桥接,您应该能够 ping 通它。