Linux 网桥功能使用
Linux 网桥功能使用
网桥是在数据链路层,将两个LAN连接起来,根据MAC地质来转发帧,可以看作是低层的路由器。
安装网桥配置工具
检测系统中是否有有bridge
工具:rpm -qa | grep bridge
。
我这里执行这个命令失败。然后直接跳过检测,执行网桥创建。
~ # brctl addbr br0
brctl: bridge br0: Package not installed
提示我未安装。那么我们直接安装bridge工具,这里通过编译内核模块来进行安装。
cp arch/arm/configs/hi3518ev201_full_defconfig .config
make ARCH=arm CROSS_COMPILE=arm-hisiv300-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-hisiv300-linux- modules
menuconfig
中我们需要配置 Networking support -> Networing options -> 802.1d Ethernet Bridging
内核模块,这里选择,不编译进内核,我们直接通过手动加载ko的方式来使用。
将下列的模块复制到板卡上系统上,使用ismod
依次加载llc.ko
,stp.ko
和bridge.ko
。或者直接使用modprobe bridge.ko
自动安装.ko及依赖,前提是要现在/lib/modules/$(uname -r)
下执行depmod
。
cp $(find . -name "*bridge*.ko") ../modules/
cp $(find . -name "*stp*.ko") ../modules/
cp $(find . -name "*llc*.ko") ../modules/
再次创建网桥br0
,这是已经不会报错了。
/lib/modules/3.4.35 # insmod llc.ko
/lib/modules/3.4.35 # insmod stp.ko
/lib/modules/3.4.35 # insmod bridge.ko
/lib/modules/3.4.35 # brctl addbr br0
这里是怎么知道还需要加载llc.ko
和stp.ko
的呢?
因为直接加载bridge.ko
会失败,报如下错误:
/mnt # ismod ./bridge.ko
-sh: ismod: not found
/mnt # insmod bridge.ko
bridge: Unknown symbol llc_mac_hdr_init (err 0)
bridge: Unknown symbol stp_proto_register (err 0)
bridge: Unknown symbol stp_proto_unregister (err 0)
insmod: can't insert 'bridge.ko': unknown symbol in module, or unknown parameter
这时,将所有的.ko
文件放到/lib/modules/$(uname -r)
目录下,然后执行depmod
,再对需要查看的ko
文件modinfo bridge.ko
。这里可以看到bridge.ko
依赖两个模块。这里就可以知道我们还需要什么模块了。
/lib/modules/3.4.35 # modinfo bridge.ko
filename: bridge.ko
license: GPL
vermagic: 3.4.35 mod_unload ARMv5 p2v8
depends: stp,llc
配置网桥
参考:
https://blog.51cto.com/lihongweibj/1657851
https://www.lizhongyi.com/archives/linux-双网卡桥接模式配置/
创建网桥逻辑接口
/lib/modules/3.4.35 # brctl addbr br0
/lib/modules/3.4.35 # ifconfig -a
br0 Link encap:Ethernet HWaddr 02:67:3A:73:0D:1B
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
eth0 Link encap:Ethernet HWaddr 76:06:E1:4F:95:86
inet addr:192.168.47.100 Bcast:192.168.47.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1312 errors:0 dropped:0 overruns:0 frame:0
TX packets:170 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:239162 (233.5 KiB) TX bytes:18232 (17.8 KiB)
Interrupt:12
添加网口到网桥
/lib/modules/3.4.35 # brctl addif br0 eth0
device eth0 entered promiscuous mode
/lib/modules/3.4.35 # brctl addif br0 ra0
device ra0 entered promiscuous mode
设置网卡设备为混杂模式
ifconfig eth0 0.0.0.0
ifconfig ra0 0.0.0.0
设置网桥IP
ifconfig br0 172.16.1.1/24
eth0为板卡的Lan口,ra0是板卡上的无线网卡。此时eth0连接的是虚拟机,手机连接到ra0上的。通过在虚拟机上ping手机IP,可以ping通,证明网桥已经工作了。
此时,两个端口之间可以互相通信,数据包由网桥转发,如果需要两端能和网桥通信,需要将网桥的IP地址和端口外的网络设置在一个网段。
相关参考。
设置开机脚本
/etc/init.d/S99app1
:
#!/bin/sh
echo "Start User Init ...!"
modprobe bridge.ko
brctl addbr br0
brctl addif br0 eth0
brctl addif br0 ra0
ifconfig eth0 0.0.0.0
ifconfig ra0 0.0.0.0
ifconfig br0 172.16.1.1/24