前面有提到过自己写的一个自动化在服务器上配置quagga跑ospf的脚本。简单说一下适用的环境1. 服务器同时有千兆和万兆的接入,万兆接入交换机上起OSPF,互联地址每个网卡使用/30的一段地址。2. ospf的验证需要和交换机相一致。3. 使用dummy0宣告单独的万兆服务地址使用的方式比较简单

sh confi
g_ospf.sh
eth4 eth5 192.168.1.1

当交换机上配置好ospf,就能自动抓包分析配置,在本地dummy0宣告192.168.1.1的地址了。

#!/bin/s
h
#****************************************************************#
    # ScriptName: confi
g
_ospf.sh
    # Author: [email protected]
    # Create Date: 2013-10-30 11:29
    # Modify Author: [email protected]
    # Modify Date: 2014-05-16 14:18
    # Function:
#***************************************************************#
. /etc/profi
le
#DEVS=(eth4 eth5)
declare -A IPS
declare -A AREAS
declare -A MASKS
declare -A NETWORKS
declare -A HELLOTIMES
declare -A DEADTIMES
declare -A GATEWAYS
OSPF_PASS=OSPF—PASS-WORD
#if no bond0,
set GIGADEV=()
GIGADEV=( bond0 )
INNET_GATEWAY="172.15.1.1"
NET=30
TMP=/tmp/autoconfi
g.$$
get_link_confi
g(){
killall -9 zebra ospfd
for dev in ${DEVS[@]}
do
#tcpdump
ifconfi
g $dev up
echo "get $dev info"

        tcpdump  -i $dev  proto ospf -nn -v -c1 2>/dev/null >$TMP         RIP=$(grep OSPFv2 $TMP |awk ‘{print $1}’)         if [ $RIP ];then             LIP=$( echo $RIP|sed “s/.*.//”)

LIP=$((LIP + 1))
LIP=$(
echo $RIP|sed -r "s/\.[0-9]*$/.$LIP/")
AREAID=$(grep Area $TMP |awk '{print $4}'|tr -d ",")
HELLO=$(grep "Hello Timer" $TMP|awk '{print $3}'|cut -ds -f1)
DEAD=$(grep "Hello Timer" $TMP|awk '{print $6}'|cut -ds -f1)

            #MASK=$( grep Mask $TMP |awk ‘{print $8}’ |tr -d “,”)

MASK="255.255.255.252"
NETWORK=$(ipcalc -n $LIP/30|cut -d"=" -f2)
IPS[$dev]=$LIP
AREAS[$dev]=$AREAID
MASKS[$dev]=$MASK
NETWORKS[$dev]=$NETWORK
DEADTIMES[$dev]=$DEAD
HELLOTIMES[$dev]=$HELLO
GATEWAYS[$dev]=$RIP
fi
areanum=$(
echo ${AREAID[@]}|tr " " "\n"|sort -u|wc -l)

        if [ $areanum -ne 1 ];then

echo "more than one area id,exit"

            exit         else

AREA=$(
echo ${AREAID[@]}|tr " " "\n"|sort -u)

        fi

rm -f $TMP

    done

}
auto_config_dev()
{
for dev in ${!IPS[@]}
do
dev_conf="/etc/sysconfig/network-scripts/ifcfg-$dev"

        ifdown $dev

echo "config $dev  ${NETWORKS[$dev]}/30 ${IPS[$dev]} ${MASKS[$dev]}"
cat >$dev_conf<<EOF
DEVICE=$dev
BOOTPROTO=none
TYPE="Ethernet"
ONBOOT=yes
IPADDR=${IPS[$dev]}
NETMASK=${MASKS[$dev]}
EOF
ifup $dev
done
}
config_zebra(){
conf=/etc/zebra.conf
HOST_NAME=$(hostname)
```bash
    cat >$conf <<EOF
hostname $HOST_NAME
password  xxxxxxxxxxxxx
enable password  xxxxxxxxxxx
log syslog
log facility local4
log file /var/log/zebra.log

!
!
interface lo
!
EOF
for dev in  ${!IPS[@]}
do
```bash
cat >>$conf <<EOF
interface $dev
link-detect
!
EOF
done
}
config_ospfd(){
conf=/etc/ospfd.conf
```bash
    cat >$conf <<EOF

!

log syslog
log facility local5
log file /var/log/ospf.log
service password-encryption
password 8  xxxxxxxxxxxxxx
enable password 8 xxxxxxxxxxxxx

!
!
interface lo
!
EOF
for dev in  ${!IPS[@]}
do
```bash
cat >>$conf <<EOF
interface $dev
```bash
    ip ospf authentication message-digest
    ip ospf message-digest-key 1 md5 $OSPF_PASS
    ip ospf network point-to-point
    ip ospf hello-interval ${HELLOTIMES[$dev]}
    ip ospf dead-interval ${DEADTIMES[$dev]}

EOF done


    ROUTE_ID=$(hostname  -i)
```bash
cat >>$conf <<EOF
router ospf
ospf router-id $DUMMY_IP
log-adjacency-changes
```bash
    ! Important: ensure reference bandwidth is consistent across all routers

!auto-cost reference-bandwidth 100000 EOF for dev in  ${!IPS[@]} do echo "    network ${NETWORKS[$dev]}/30 area $AREA " »$conf

    done
```bash
cat >>$conf <<EOF
network $DUMMY_IP/24 area $AREA
```bash
      area $AREA  nssa translate-candidate no-summary

! line vty ! EOF } config_route_rule(){ metric=100 rt=/etc/iproute2/rt_tables for dev in  ${!IPS[@]} do grep $dev $rt &>/dev/null

        if [ $? -ne 0 ];then
```bash
echo "$metric route_$dev" >>$rt
metric=$((metric+1))
fi
```bash
        echo "table route_$dev default via ${GATEWAYS[$dev]} dev $dev" > /etc/sysconfig/network-scripts/route-$dev
        echo "from ${IPS[$dev]} table  route_$dev" > /etc/sysconfig/network-scripts/rule-$dev

done


}
config_giga_route_rule(){
metric=5
rt=/etc/iproute2/rt_tables
name=innet
for dev in  ${GIGADEV[@]}
do
```bash
echo "config $dev route rule"
grep $dev $rt &>/dev/null

        if [ $? -ne 0 ];then

echo "$metric route_$dev" >>$rt
metric=$((metric+1))
fi
```bash
        innet_ip=$(ip addr show dev bond0|grep inet|awk '{print $2}'|cut -d/ -f1)
        echo "table route_$dev default via $INNET_GATEWAY dev $dev" > /etc/sysconfig/network-scripts/route-$dev
        echo "from $innet_ip table  route_$dev" > /etc/sysconfig/network-scripts/rule-$dev
done

}
config_dummy_dev(){
```bash
dummy_conf="/etc/sysconfig/network-scripts/ifcfg-dummy0"
```bash
    echo "config dummy0 ip: $DUMMY_IP/32"
    cat >$dummy_conf <<EOF
IPADDR=$DUMMY_IP
NETMASK=255.255.255.255
DEVICE="dummy0"
BOOTPROTO="static"
ONBOOT="yes"
TYPE="ethernet"
EOF
 ifup dummy0
}
restart_ospf(){
```bash
echo "restart ospf"
killall -9 ospfd zebra &>/dev/null
/sbin/zebra -u root -d -f /etc/zebra.conf
/sbin/ospfd -u root -d -f /etc/ospfd.conf
}
check_quagga(){
```bash
    rpm -q quagga &>/dev/null

if [ $? -ne 0 ]; then yum install  quagga  -y else echo “quagga alreay been installed”

    fi

groupadd  quagga &>/dev/null } add_rpfilter(){ cat »/etc/sysctl.conf«EOF net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.bond0.rp_filter = 0 net.ipv4.conf.dummy0.rp_filter = 0 EOF for dev in  ${!IPS[@]} do cat »/etc/sysctl.conf«EOF net.ipv4.conf.$dev.rp_filter = 0 EOF done sysctl -p } add_rclocal(){ rc=/etc/rc.local grep zebra $rc &>/dev/null

    if [ $? -ne 0 ];then
```bash
echo "/sbin/zebra -u root -d -f  /etc/zebra.conf" >> $rc

    fi

grep ospfd $rc &>/dev/null

    if [ $? -ne 0 ];then

echo "/sbin/ospfd -u root -d -f  /etc/ospfd.conf" >> $rc

    fi

}
unbootbond(){
sed -i 's/ONBOOT=yes/ONBOOT=no/' /etc/sysconfig/network-scripts/ifcfg-bond0

}

usage(){
echo -e "help:\n\t./confi
g_ospf.sh
\e[1;
32meth4 eth5 dummy0_ip\e[m"
exit 1
}
if [ $# -ne 3 ];
then

    usage

else     DEVS=( $1 $2 )     DUMMY_IP=$3

echo "try to config ${DEVS[@]} with $DUMMY_IP"

fi

check_quagga
get_link_config
#config_route_rule
config_giga_route_rule
auto_config_dev
config_zebra
config_ospfd
add_rpfilter
restart_ospf
config_dummy_dev
add_rclocal
unbootbond