在 FreeBSD 中除了用 bridge 和 if_bridge 構建網橋外,還可以用 NETGRAPH 的 ng_ether 和 ng_bridge 構建網橋。
用這個方法將幾塊網卡構建的網橋,在外部看上去就像一塊網卡。
執行腳本:/bin/ebridge
--------------------------------------------------------
#!/bin/sh
B_NAME=bnet0 #網橋名稱
B_IF0=fxp0 #第一塊網卡
B_IF1=rl1 #第二塊網卡
kldload ng_ether #加載模塊
kldload ng_bridge #加載模塊
ifconfig ${B_IF0} up #啟動網卡
ifconfig ${B_IF1} up #啟動網卡
ngctl mkpeer ${B_IF0}: bridge lower link0 #創建網橋節點並將第一塊網卡掛在這個節點上,lower 表示轉發進入的包
ngctl name ${B_IF0}:lower ${B_NAME} #命名網橋名稱
ngctl connect ${B_IF1}: ${B_NAME}: lower link1 #將第二塊網卡掛在這個節點上
ngctl connect ${B_IF0}: ${B_NAME}: upper link2 #將第一塊網卡掛在這個節點上,upper 表示轉發出去的包,如果是純網橋不與主機聯絡這兩行可不寫
ngctl connect ${B_IF1}: ${B_NAME}: upper link3 #將第二塊網卡掛在這個節點上
ngctl msg ${B_IF0}: setpromisc 1 #設置第一塊網卡為混雜模式
ngctl msg ${B_IF0}: setautosrc 0 #設置第一塊網卡采用單一的 Ethernet 源地址
ngctl msg ${B_IF1}: setpromisc 1 #設置第二塊網卡為混雜模式
ngctl msg ${B_IF1}: setautosrc 0 #設置第二塊網卡采用單一的 Ethernet 源地址
---------------------------------------------------------
如果開機就需要構建網橋以及一個網橋要跨接好幾張網卡時可采用下列方法:
開機啟動腳本:/etc/rc.d/ebridge
---------------------------------------------------
#!/bin/sh
# PROVIDE: ebridge
# BEFORE: NETWORKING
# KEYWORD: nojail
ebridge_enable=${ebridge_enable:-"NO"}
. /etc/rc.subr
name="ebridge"
rcvar=`set_rcvar`
start_cmd="${name}_start"
stop_cmd="${name}_stop"
B_NAME="bnet0"
ebridge_start()
{
for j in ng_ether ng_bridge; do
if kldstat -v | grep -qw $j; then
else
kldload $j
fi
done
for k in ${ebridge_interfaces}; do
ifconfig $k up
done
FIF=`echo ${ebridge_interfaces}|awk '{ print $1 }'`
ngctl mkpeer ${FIF}: bridge lower link0
ngctl name ${FIF}:lower ${B_NAME}
LKN=0
for SIF in ${ebridge_interfaces}; do
if [ ${LKN} != 0 ]; then
ngctl connect ${SIF}: ${B_NAME}: lower link${LKN}
fi
LKN=`expr ${LKN} + 1`
done
for AIF in ${ebridge_interfaces}; do
ngctl connect ${AIF}: ${B_NAME}: upper link${LKN}
LKN=`expr ${LKN} + 1`
done
for i in ${ebridge_interfaces}; do
ngctl msg $i: setpromisc 1
ngctl msg $i: setautosrc 0
done
}
ebridge_stop()
{
ngctl kill ${B_NAME}: > /dev/null 2>&1
for k in ${ebridge_interfaces}; do
ngctl kill $k: > /dev/null 2>&1
done
}
load_rc_config $name
run_rc_command "$1"
---------------------------------------------------
-------------------------------
ebridge_enable="YES"
ebridge_interfaces="rl0 rl1 rl2 rl3" #需要加入網橋的網卡
ifconfig_rl0="inet 192.168.1.x mask 255.255.255.0" #給網橋一個IP地址
-------------------------------
在運行中可以用命令停止網橋:
# /etc/rc.d/ebridge stop
也可以啟動網橋:
# /etc/rc.d/ebridge start
以可以停止再啟動網橋:
# /etc/rc.d/ebridge restart