人,很多时候可以等效于另外一个字“懒”。
我,我也不例外,就是一个字“懒”。
由于目前新的机器都有2个以上的网卡,这些网卡用来干吗呢?,一个接Lan一个接Internet?也不是所有的机器都有这个需求呀。后来想到一个办法,用来做冗余线路,防止单个交换机O了导致单点故障。
其实Linux下的桥接,好久之前也用过,当初配置OpenVPN的时候也使用过,但是都是使用一个shell脚本,执行一堆brctl命令,然后网桥起来了。
我一直很喜欢RH的风格,虽然很多人纷纷投向Debian Gentoo LFS 等等所谓NX的Linux系统,对于linux我现在只用FC,我个人觉得RH的配置很规范(大家不要撇砖头哦)。所以前几天就想找一些文章,看怎么配置后,网桥可以在启动network的时候自动启动起来,大家或许也看到了我的Blog转载过几篇文章,其中也有部分是要使用patch的。linux的启动都是通过脚本来执行命令的,其实看了之后就知道改怎么配置了,由于“懒”所以还是找现成的。
由于我不太喜欢给系统打补丁,我也不相信RH的启动脚本默认启动Bridge会有问题,所以一边按照别人的配置方法,一边看脚本,最后终于搞定了。
写一篇文章出来,以后大家可以参考参考(Fedora Core 4 )
注: FC3以前Bridge启动脚本在/sbin/ifup脚本中,FC4开始那段代码放到/etc/sysconfig/network-scripts/ifup-eth脚本里面了
下面开始吧:
ifup-eth 代码片断
===========================
if [ "${TYPE}" = "Bridge" ]; then
if [ ! -x /usr/sbin/brctl ]; then
echo $"Bridge support not available: brctl not found"
exit 1
fi
/sbin/ip link set dev ${DEVICE} down 2>/dev/null
/usr/sbin/brctl delbr ${DEVICE} 2>/dev/null
/usr/sbin/brctl addbr ${DEVICE} 2>/dev/null
# brctl doesn't report success/failure (BZ #104408)
# Test for ourselves whether it worked.
if ! /usr/sbin/brctl show | LANG=C grep -q "^${DEVICE} " ; then
echo $"Bridge support not available in this kernel"
exit 1
fi
[ -n "${DELAY}" ] && /usr/sbin/brctl setfd ${DEVICE} ${DELAY}
[ -n "${GCINT}" ] && /usr/sbin/brctl setgcint ${DEVICE} ${GCINT}
[ -n "${STP}" ] && /usr/sbin/brctl stp ${DEVICE} ${STP}
fi
============================
从以上代码可以看出,碰到TYPE=Bridge的设备,直接当成网桥处理,使用brctl增加一个网桥设备,名字为DEVICE定义的。Bridge设备的TYPE一定为“Bridge”,同时注意大写小。
同时还可以通过定义STP来设置网桥是否STP打开(防止环路),设置DELAY来设置网桥的Forward Delay时间, /usr/sbin/brctl setgcint 这个选项在1.0.4-6版本里面没有找到,所以最好不要设置GCINT
ifup-eth代码片断:
============================
if [ -n "${BRIDGE}" -a -x /usr/sbin/brctl ]; then
/sbin/ip addr flush dev ${DEVICE} 2>/dev/null
/sbin/ip link set dev ${DEVICE} up
/usr/sbin/brctl addif ${BRIDGE} ${DEVICE}
# Upon adding a device to a bridge,
# it's necessary to make radvd reload its config
[ -r /var/run/radvd/radvd.pid ] && kill -HUP `cat /var/run/radvd/radvd.pid`
exit 0
fi
============================
从代码中可以看到,如果设备中出现了BRIDGE,脚本会把这个设备上的IP地址清除,并且把该设备加入到BRIDGE所指定的网桥中。
分析上面代码后可以得出结论:
要使网桥在启动network脚本时启动,务必这么设置(假设网桥:br0,br0包含eth0 eth1):
ifcfg-eth0:
========================
DEVICE=eth0
ONBOOT=yes
TYPE=Ethernet
BRIDGE=br0
========================
ifcfg-eth1:
========================
DEVICE=eth1
ONBOOT=yes
TYPE=Ethernet
BRIDGE=br0
========================
ifcfg-br0:
========================
DEVICE=br0
BOOTPROTO=static
IPADDR=192.168.0.1
NETMASK=255.255.255.0
ONBOOT=yes
TYPE=Bridge
STP=on
========================
注: 网桥接口最好不要使用dhcp,因为RH的脚本在启动的时候就试图获得IP地址,但是由于网桥优先于eth0 eth1启动,所以在启动的时候没有任何一个网卡添加到网桥中,所以根本无法获得IP地址。不知道是否有其它解决办法。
阅读(8028) | 评论(4) | 转发(0) |