前面有提到过自己写的一个自动化在服务器上配置quagga跑ospf的脚本。简单说一下适用的环境
1. 服务器同时有千兆和万兆的接入,万兆接入交换机上起OSPF,互联地址每个网卡使用/30的一段地址。
2. ospf的验证需要和交换机相一致。
3. 使用dummy0宣告单独的万兆服务地址
使用的方式比较简单
sh config_ospf.sh eth4 eth5 192.168.1.1
当交换机上配置好ospf,就能自动抓包分析配置,在本地dummy0宣告192.168.1.1的地址了。
#!/bin/sh
#****************************************************************#
# ScriptName: config_ospf.sh
# Author: pm@gnuers.org
# Create Date: 2013-10-30 11:29
# Modify Author: pm@gnuers.org
# Modify Date: 2014-05-16 14:18
# Function:
#***************************************************************#
. /etc/profile
#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/autoconfig.$$
get_link_config(){
killall -9 zebra ospfd
for dev in ${DEVS[@]}
do
#tcpdump
ifconfig $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)
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
cat >>$conf <<EOF
interface $dev
link-detect
!
EOF
done
}
config_ospfd(){
conf=/etc/ospfd.conf
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
cat >>$conf <<EOF
interface $dev
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)
cat >>$conf <<EOF
router ospf
ospf router-id $DUMMY_IP
log-adjacency-changes
! 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
cat >>$conf <<EOF
network $DUMMY_IP/24 area $AREA
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
echo "$metric route_$dev" >>$rt
metric=$((metric+1))
fi
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
echo "config $dev route rule"
grep $dev $rt &>/dev/null
if [ $? -ne 0 ];then
echo "$metric route_$dev" >>$rt
metric=$((metric+1))
fi
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(){
dummy_conf="/etc/sysconfig/network-scripts/ifcfg-dummy0"
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(){
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(){
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
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./config_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