前面有提到过自己写的一个自动化在服务器上配置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