前提:
我用的是树莓派3作为AP。我添加了一个 USB 转以太网适配器,这是我的配置:
- 内置 eth 端口作为 eth0 (WAN)
- 内置 wifi 接口作为 wlan0(LAN,无线)
- USB 转以太网适配器作为 eth1(LAN,有线)
我已成功将 wlan0 和 eth1 桥接到桥 br0 上。
然后我设置了一个 nat 以允许 br0 上的设备连接到互联网。所有这些都有效。
问题:
现在我想分割有线 LAN,以便有一个用于受信任设备的虚拟网络 (eth1:0) 和另一个用于不太受信任的设备的虚拟网络 (eth1:1)。
这个想法是仅将 eth1:0 添加到 br0。这似乎有效,但是当我列出网桥时,br0 似乎直接使用 eth1,而不是虚拟接口 eth1:0。
事实上,如果我尝试创建另一个网桥 (br1) 并添加另一个虚拟网络 (eth1:1),则会收到一条错误消息,指出该接口已在网桥中。
因此,虚拟接口似乎无法添加到网桥,只能添加到其父接口。
这是真的?还有其他方法吗?
这是我正在使用的测试脚本:
function configure_firewall() {
echo CONFIGURE FIREWALL START
####################### FORWARDING #####################
# Enable IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
# Allow forwarding of traffic LAN -> WAN
iptables -A FORWARD -i ${BRIDGE} -o ${WAN} -j ACCEPT
# Allow traffic WAN -> LAN but only as reply to communication initiated from the LAN
iptables -A FORWARD -i ${WAN} -o ${BRIDGE} -m state --state RELATED,ESTABLISHED -j ACCEPT
# Drop anything else
iptables -A FORWARD -j DROP
####################### MASQUERADING ########################
# Do the nat
iptables -t nat -A POSTROUTING -o ${WAN} -j MASQUERADE
###################### INPUT #############################
# Allow local connections
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i ${BRIDGE} -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -i ${WAN} -j ACCEPT
iptables -A INPUT -i ${WAN} -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -j DROP
###################### OUTPUT #############################
iptables -A OUTPUT -j ACCEPT
echo CONFIGURE FIREWALL END
}
function teardown_bridge() {
echo TEARDOWN BRIDGE START
ifconfig ${BRIDGE} down
brctl delif ${BRIDGE} ${LAN}:0
brctl delif ${BRIDGE} ${WIFI}
brctl delbr ${BRIDGE}
echo TEARDOWN BRIDGE END
}
function configure_bridge() {
echo CONFIGURE BRIDGE START
brctl addbr ${BRIDGE}
brctl addif ${BRIDGE} ${LAN}:0
brctl addif ${BRIDGE} ${WIFI}
ifconfig ${BRIDGE} up 192.168.10.1 netmask 255.255.255.0 broadcast 192.168.10.0
echo CONFIGURE BRIDGE END
}
function configure_interfaces() {
echo CONFIGURE INTERFACES START
ifconfig ${LAN} up 0.0.0.1
ifconfig ${LAN}:0 up 0.0.0.2
ifconfig ${LAN}:1 up 0.0.0.3
echo CONFIGURE INTERFACES END
}
function teardown_interfaces() {
echo TEARDOWN INTERFACES START
ifdown ${LAN}:1
ifdown ${LAN}:0
ifdown ${LAN}
echo TEARDOWN INTERFACES END
}
function delayed_reset() {
for i in `seq 15 -1 0`; do
sleep 1
echo ${i}
done
sync
reboot
exit
}
#test_network
#if [ $? -ne 0 ] ; then
teardown_firewall
teardown_bridge
teardown_interfaces
configure_interfaces
configure_bridge
configure_firewall
#delayed_reset
#fi
运行脚本后,如果我运行ifconfig
,看起来虚拟网络存在:
eth1 Link encap:Ethernet HWaddr 00:13:3b:62:11:f6
inet addr:0.0.0.1 Bcast:255.255.255.255 Mask:0.0.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:30712 errors:0 dropped:0 overruns:0 frame:0
TX packets:19110 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:5261152 (5.0 MiB) TX bytes:5355909 (5.1 MiB)
eth1:0 Link encap:Ethernet HWaddr 00:13:3b:62:11:f6
inet addr:0.0.0.2 Bcast:255.255.255.255 Mask:0.0.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
eth1:1 Link encap:Ethernet HWaddr 00:13:3b:62:11:f6
inet addr:0.0.0.3 Bcast:255.255.255.255 Mask:0.0.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
但整个eth1
似乎是br0
:
root@raspberrypi:/home/pi# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.00133b6211f6 no eth1
wlan0
这似乎证实了这一点:
root@raspberrypi:/home/pi# brctl addbr br1
root@raspberrypi:/home/pi# brctl addif br1 eth1:1
device eth1:1 is already a member of a bridge; can't enslave it to bridge br1.
笔记: 我确实看过在 Linux 中创建并桥接虚拟网络接口但它似乎已经过时了,因为它指的是 iproute2。
答案1
您无法在一个接口 eth1 上创建br0
and桥接,因为and是具有两个不同 IP 地址的同一接口 eth1。如果您的有线网络和交换机允许,您可以创建 VLAN。如果您创建两个 VLAN ,您将有两个不同的接口,这两个接口可用于网桥和。br1
eth1:0
eth1:1
eth1.10
eth1.20
br0
br1