#! /bin/sh # iproute2 を使って2つのISPを同時に利用するための設定スクリプト #E=echo export LANG=C #Linuxが直接PPPoEを喋る時はこんな感じで情報取得できます。 #後述の IP_{a,b} や LINK_{a,b} で利用します。 #PPP0_IF_IP=`ifconfig ppp0 | grep 'inet addr' | # sed -e 's/^.*inet addr://' -e 's/ .*$//'` #PPP0_LINK_IP=`ifconfig ppp0 | grep 'inet addr' | # sed -e 's/^.*P-t-P://' -e 's/ .*$//'` #ISP A ;ISP B TBL_a=10 ;TBL_b=20 PRIORITY_a=10 ;PRIORITY_b=10 DEV_a=eth1 ;DEV_b=eth2 IP_a=192.168.0.254 ;IP_b=192.168.1.254 LINK_a=192.168.0.253 ;LINK_b=192.168.1.253 PREFIX_a=192.168.0.0/24 ;PREFIX_b=192.168.1.0/24 #LAN DEV_c=eth0 IP_c=192.168.2.254 PREFIX_c=192.168.2.0/24 #古いルーティング情報を削除 ip route show table $TBL_a | sed -e 's/^/ip route del /' -e 's/$/ table '$TBL_a'/' | sh ip route show table $TBL_b | sed -e 's/^/ip route del /' -e 's/$/ table '$TBL_b'/' | sh ip route show table main | egrep '^[1-9]' | sed -e 's/^/ip route del /' | sh $E ip route del default $E ip rule del priority $PRIORITY_a from $IP_a table $TBL_a $E ip rule del priority $PRIORITY_b from $IP_b table $TBL_b #デバッグ情報表示 echo %%% netstat -rn echo %%% ip route show table main echo %%% ip route show table $TBL_a echo %%% ip route show table $TBL_b echo %%% ip rule list echo %%% #各サブネットへの経路設定 $E ip route add $PREFIX_a dev $DEV_a $E ip route add $PREFIX_b dev $DEV_b $E ip route add $PREFIX_c dev $DEV_c #ISP A 側で通信するための静的ルート設定 $E ip route add AAA.AAA.AAA.AAA/18 via $LINK_a $E ip route add XXX.XXX.XXX.XXX/21 via $LINK_a #ISP B 側で通信するための静的ルート設定 $E ip route add BBB.BBB.BBB.BBB/21 via $LINK_b $E ip route add YYY.YYY.YYY.YYY/20 via $LINK_b #外部との経路設定 $E ip route add $PREFIX_a dev $DEV_a src $IP_a table $TBL_a $E ip route add default dev $DEV_a via $LINK_a table $TBL_a $E ip route add $PREFIX_b dev $DEV_b src $IP_b table $TBL_b $E ip route add default dev $DEV_b via $LINK_b table $TBL_b #デフォルトルート設定(1:1の割合でラウンドロビン) #(Linux Advanced Routing & Traffic Control HOWTO 4.2.2. 負荷分散 参照) $E ip route add default scope global nexthop via $LINK_a dev $DEV_a weight 1 \ nexthop via $LINK_b dev $DEV_b weight 1 #外から開始された通信を、同じISPに返すための設定 #(Linux Advanced Routing & Traffic Control HOWTO 4.2.1. アクセス分割 参照) $E ip rule add priority $PRIORITY_a from $IP_a table $TBL_a $E ip rule add priority $PRIORITY_b from $IP_b table $TBL_b #念のためルート情報のキャッシュをクリア $E ip route flush cache #デバッグ情報表示 echo %%% netstat -rn echo %%% ip route show table main echo %%% ip route show table $TBL_a echo %%% ip route show table $TBL_b echo %%% ip rule list echo %%% exit 0