1. 网桥基础
什么是网桥
网桥将多个网络在数据链路层连接起来。
网桥的前身是集线器或中继器。网桥和集线器的区别:集线器上各端口都是共享同一条背板总线的,网桥的两个端口分别有一条独立的交换信道,不是共享一条背板总线,可隔离冲突域。
Linux下的bridge,工作于数据链路层,对下层而言是一个桥设备,进行数据的转发;对上层而言,它就像普通的ethernet设备一样,有自己的IP和MAC地址,上层可以把它加入路由系统,并利用它发送接收数据。
当把一个网络接口加入到Bridge中,Bridge成为该接口的主设备,该接口成为Bridge的从设备。当把一个网络接口加入到Bridge中,实际上是Bridge接管了该接口首发包的过程。(设置dev->prive_flags加上IFF_BRIDGE_PORT,这样它就不能再作为其他br的从设备了;并设置dev->rx_handler为br_handler_frame())
发包:Bridge调用从设备dev->ops->ndo_start_xmit(skb,dev))发包;
收包:接收接口通过netif_receive_skb(skb)函数调用dev->rx_handler也就是br_handler_frame()交给Bridge处理包。
2. 网桥应用
Linux 网桥配置命令brctl
在Linux中配置网络一般使用 brctl命令,使用此命令首先要安装:bridge-utils软件包。
[inbi@debian~]#apt-get install bridge-utils
[inbi@debian~]#modprobe bridge
[inbi@debian~]#echo "1">/proc/sys/net/ipv4/ip_forward
#安装bridge-utils软件包,并加载bridge模块和开启内核转发。
[inbi@debian~]#brctl
#直接输入brctl命令将显示帮助信息!
Usage: brctl [commands]
commands:
addbr <bridge> add bridge
delbr <bridge> delete bridge
addif <bridge> <device> add interface to bridge
delif <bridge> <device> delete interface from bridge
setageing <bridge> <time> set ageing time
setbridgeprio <bridge> <prio> set bridge priority
setfd <bridge> <time> set bridge forward delay
sethello <bridge> <time> set hello time
setmaxage <bridge> <time> set max message age
setpathcost <bridge> <port> <cost> set path cost
setportprio <bridge> <port> <prio> set port priority
show show a list of bridges
showmacs <bridge> show a list of mac addrs
showstp <bridge> show bridge stp info
stp <bridge> {on|off} turn stp on/off
增加网桥
[inbi@debian~]#brctl addbr br0
#增加一个网桥
[inbi@debian~]#ifconfig eth0 0.0.0.0 promisc
[inbi@debian~]#ifconfig eth1 0.0.0.0 promisc
[inbi@debian~]#brctl addif br0 eth0 eth1
#将两块已有的网卡添加到网桥,此时这两个网卡工作于混杂模式,所以不需要IP了,因为网桥是工作在链路层的。
[inbi@debian~]#brctl show
#查看已有网桥
你也可以为 br0 设置一个IP,已访问这台机器。
[inbi@debian~]#ifconfig br0 10.10.1.1 netmask 255.255.0.0 up
删除网桥
[inbi@debian~]#brctl delif br0 eth0 eth1
#增加网桥中的接口
[inbi@debian~]#brctl delbr br0
#删除网桥
关闭生成树
[inbi@debian~]#brctl stp br0 off
#关闭生成树协议,减少数据包污染,因为我这里只有一个路由器哦!
配置桥开机激活
[inbi@debian~]#echo "modprobe bridge">>/etc/rc.local
#开机加载 bridge 模块,或者echo "bridge">>/etc/modules
[inbi@debian~]#cp /etc/network/interfaces /etc/network/interfaces.default
#备份下,方便以后使用啊!
[inbi@debian~]#vim /etc/network/interfaces
auto lo eth0 eth1 br0
iface lo inet loopback
iface br0 inet static
address 10.10.10.1
netmask 255.255.0.0
gateway 10.10.10.254
pre-up ip link set eth0 promisc on
pre-up ip link set eth1 promisc on
pre-up echo "1">/proc/sys/net/ipv4/ip_forward
bridge_ports eth0 eth1
#配置eth0 eth1 br0开机启动,eth0,eth1未设置IP信息,在启动br0网卡时,开启了eth0,eth1的混杂模式,并桥接了它们。