Linuxゲートウェイ+***クライアント高可用性の実装


一、需要
業務の発展の需要によって、会社のアメリカ支社は***ダイヤルを通じて香港の機械室と接続して、ダイヤルしたクライアントは***のクライアントとして機能して、同時にそれをlinuxゲートウェイとして使って、現在1台しかなくて、その機に着いた後に、アメリカの香港は連絡することができなくて、ついにその高可用性を配置して1台の機械の機を実現して、別の機械の正常な運行を保証することができます.
二、計画メインノード:172.18.5.105予備ノード:172.18.5.106 keepalived-1.2.8を利用して両ノードの高利用可能な構成システムを実現する:centos 5.5
三、手順
(一)ファイアウォールにvrrpおよび***プロトコルを許可するルールを追加する
-A RH-Firewall-1-INPUT -p gre -j ACCEPT-A RH-Firewall-1-INPUT -p ipip -j ACCEPT-A RH-Firewall-1-INPUT -i eth0 -p vrrp -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 53 -j ACCEPT-A RH-Firewall-1-INPUT -p udp --dport 53 -j ACCEPT
(二)selinuxsetenforce 0を閉じる
(三)同期時間
1、同期時間ダブルクリック相互通信を確立する
#ntpdate+タイムサーバ
#ssh-keygen -t rsa -P ''
# ssh-copy-id -i .ssh/id_rsa.pub 172.18.5.106
スクリプトで相手ノードにコマンドを実行できるようにすることを目的としています.
(四)コンパイルインストールkeepalived-1.2.8
http://www.keepalived.org/download.html最新のものが必ずしもベストとは限らないので、1.2.8を選びます
  • tar xf keepalived-1.2.8.tar.gz
  • cd keepalived-1.2.8
  • mkdir -p/data/soft/keepalived
  • ./configure--prefix=/data/soft/keepalived注意:インストールをコンパイルする前に、gccと追加のパッケージをインストールする必要がある場合があります.
  • を自分で解決してください.
  • make&&make installコンパイルエラー../include/vrrp_ipaddress.h:32:27: error: linux/if_addr.h: No such file or directoryIn file included from ../include/vrrp.h:31,from ../include/smtp.h:34,from smtp.c:27:../include/vrrp_ipaddress.h:41:error:field‘ifa’has incomplete typemake 2:*[smtp.o]Error 1 make 2:Leaving directory`/root/keepalived-1.2.7/keepalived/core'make 1:[all]Error 1 make 1:Leaving directory`/root/keepalived-1.2.7/keepalived'make:*[all]Error 2原因と解決策:kernel-headersソフトウェアバージョンが低すぎることによる
  • yum-y install kernel-headers問題解決ファイルを正しい場所に転送
  • mkdir/etc/keepalived
  • pwd/data/soft/keepalived
  • cp etc/keepalived/keepalived.conf/etc/keepalived/
  • cp etc/rc.d/init.d/keepalived/etc/init.d/
  • cp etc/sysconfig/keepalived/etc/sysconfig/
  • cp sbin/keepalived/usr/sbin/
  • chkconfig --add keepalived
  • service keepalived startStarting keepalived: [ OK ]
  • chkconfig --add keepalived
  • chkconfig keepalived onコンパイルが完了し、プライマリ・スタンバイ・ノードがコンパイル完了して起動しても問題ない後、keepalivedをプライマリ・セカンダリ構成します.その前に、まず***をインストールするクライアントをコンパイルします.

  • (五)コンパイルインストールpptp-1.7.1
    http://pkgs.fedoraproject.org/repo/pkgs/pptp/
  • tar xf pptp-1.7.1.tar.gz
  • cd pptp-1.7.1
  • make&&make install構成クライアント
  • vim/etc/ppp/peers/**pty「pptp 172.18.8.254--nolaunchpppd」/***サーバのアドレスは、リモートダイヤルであれば、必ず***パブリックネットワークiplocknoauthnobsdcompnodeflatename amosと書きます.lu//***ダイヤルアップのユーザーremotename*//リモートサーバで作成された接続の名前.この2つの名前はchap-secretsのフィールドと一致するようにipparam*//上の名前と一致するようにしたほうがいいrequire-mppe-128//リモート***サーバが暗号化を要求したら、書きます.要求しないで、書く必要はありません.
  • vim/etc/ppp/chap-secretsユーザー名remotenameパスワード*(デフォルトではip)サーバ側のユーザーがすでに存在する場合は、ダイヤルアップ接続が可能です.
  • /usr/sbin/pppd call***logfd 1 updetach//この***は/etc/ppp/peers/***ディレクトリUsing interface ppp 0 Connect:ppp 0/dev/pts/3 CHAP authentication succeedMPPE 128-bit stateless compression enabledlocal IP address 172.18.01 remote IP address 172.18.54ダイヤル成功!プライマリスレーブノードも同様に構成すればよい

  • (六)高可用性構成の実現
    プライマリノードプロファイル
    vim /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
    global_defs {
    notification_email {
    root@localhost
    }
    notification_email_from [email protected]
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id LVS_DEVEL
    }
    vrrp_script monitor {
    script "nohup /etc/keepalived/monitor.sh 2> /root/error.log & &> /dev/null"
    interval 20
    }
    vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 200
    priority 100
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass 1111
    }
    virtual_ipaddress {
    172.18.5.10
    }
    track_script {
    monitor
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
    }

    監視スクリプト
    # vim/etc/keepalived/monitor.sh
    #!/bin/bash
    function start_pppd(){
    /sbin/ip addr show |grep "172.18.5.10/32" &> /dev/null
    if [ $? -eq 0 ];then
      ssh 172.18.5.104 "killall -0 pppd&> /dev/null ;[ $? -eq 0 ] && killall pppd &>/dev/null"
      sleep 3
      killall -0 pppd &> /dev/null
      if [ $? -eq 1 ];then
        /usr/sbin/pppd call *** logfd 1 updetach&> /dev/null
        sleep 10
        killall -0 pppd &> /dev/null
        if [ $? -eq 1 ];then
          service keepalived stop
        fi
      fi
    fi
    }
    function add_route(){
     killall -0 pppd &> /dev/null
     if [ $? -eq 0 ];then
      PPP=`ifconfig | grep ppp | awk -F' ' '{print$1}'`
       ip route show table main | grep"172.18.8.0/24" &> /dev/null
         if [ $? -ne 0 ];then
            ip route add 172.18.8.0/24 via172.18.8.254 dev $PPP  &>/dev/null
         fi
     fi
    }
    start_pppd
    sleep 5
    add_route

    ノードプロファイルから
    #vim /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
    global_defs {
    notification_email {
    root@localhost
    }
    notification_email_from [email protected]
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id LVS_DEVEL
    }
    vrrp_script monitor {
    script "nohup /etc/keepalived/monitor.sh 2> /root/error.log & &> /dev/null"
    interval 20
    }
    vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 200
    priority 50
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass 1111
    }
    virtual_ipaddress {
    172.18.5.10
    }
    track_script {
    monitor
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
    }

    監視スクリプト
    # vim/etc/keepalived/monitor.sh
    #!/bin/bash
    function start_pptp(){
    /sbin/ip addr show |grep "172.18.5.10/32" &> /dev/null
    if [ $? -eq 0 ];then
      ssh 172.18.5.106 "killall -0 pppd&> /dev/null ;[ $? -eq 0 ] && killall pppd &>/dev/null"
      sleep 3
      killall -0 pppd &> /dev/null
      if [ $? -ne 0 ];then
         /usr/sbin/pppd call *** logfd 1 updetach&> /dev/null
         sleep 10
         killall -0 pppd &> /dev/null
         if [ $? -ne 0 ];then
           service keepalived stop
         fi
      fi
    fi
    }
    function add_route(){
     killall -0 pppd &> /dev/null
     if [ $? -eq 0 ];then
        PPP=`ifconfig | grep ppp | awk -F' ''{print $1}'`
        ip route show table main | grep"172.18.8.0/24" &> /dev/null
          if [ $? -ne 0 ];then
             ip route add 172.18.8.0/24 via172.18.8.254 dev $PPP &> /dev/null
          fi
     fi
    }
    start_pptp
    sleep 5
    add_route

    3.5、何を実現しましたか.2つのノードがkeepalivedを同時に起動してプライマリノードを観察
  • ip addr1: lo: mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host loinet6::1/128 scope host valid_lft forever preferred_lft forever2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000link/ether 00:50:56:b3:71:ec brd ff:ff:ff:ff:ff:ffinet 172.18.5.106/24 brd 172.18.5.255 scope global eth0inet 172.18.5.10/32 scope global eth0 -------------------------》vipinet6 fe80::250:56ff:feb3:71ec/64 scope link valid_lft forever preferred_lft forever3: sit0: mtu 1480 qdisc noop link/sit 0.0.0.0 brd 0.0.0.04: virbr0: mtu 1500 qdisc noqueue link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ffinet 192.168.122.1/24 brd 192.168.122.255 scope global virbr06: ppp0: mtu 1496 qdisc pfifo_fast qlen 3 link/ppp inet 172.18.8.97 peer 172.18.8.254/32 scope global ppp 0-----」ダイヤルアップ成功
  • ip route show table main172.18.8.254 via 172.18.5.1 dev eth 0 src 172.18.5.106 172.18.254 dev ppp 0 proto kernel scope link src 172.18.97 172.8.5.0/24 dev eth 0 proto kernel scope link src 172.8.5.106 172.8.8.0/24 via 172.18.8.254 dev ppp 0--------------->スクリプトで実現されるパスは、ポリシー192.168.122.0/24 dev virbr 0 proto kernel scope link src 192.168.11 dev eth0 scope link default via 172.18.5.1 dev eth0

  • プライマリノードを停止してスタンバイノードを観察
  • ip addr1: lo: mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host loinet6::1/128 scope host valid_lft forever preferred_lft forever2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:50:56:b 3:7 d:3 a brd ff:ff:ff:ff:ff:ffinet 172.8.5.104/24 brd 172.18.5.255 scope global eth 0 inet 172.8.5.10/32 scope global eth 0-----」vipはinet 6 fe 80::250:56 ff:feb 3:7 d 3 a/64 scope link valid_lft forever preferred_lft forever3: sit0: mtu 1480 qdisc noop link/sit 0.0.0.0 brd 0.0.0.027: ppp0: mtu 1496 qdisc pfifo_fast qlen 3 link/ppp inet 172.18.8.97 peer 172.18.8.254/32 scope global ppp 0-----」ダイヤルアップ成功
  • ip route show table main172.18.8.254 dev ppp 0 proto kernel scope link src 172.18.97 172.18..0/24 dev eth 0 proto kernel scope link src 172.8.5.104 172.18.8.0/24 via 172.18.8.254 dev ppp 0---------------」スクリプトで実現されたルーティングポリシー169.254.0/16 dev eth 0 scope link default via 172.18.5.1 dev eth 0

  • (七)出会った問題
    1、***ダイヤルが通じない;2、バックグラウンドsleepプロセスが多すぎて、cpu負荷が特に高い原因を分析する:keepalivedプロファイルの構成を開始し、スクリプトの応用時にvrrp_をこのように書くscript monitor{cript"/etc/keepalived/monitor.sh"interval 20}はこのように書いて、keepalivedを起動した後、ログはいつも故障を報告して、スクリプトプログラムの中断による可能性があって、後に変更します:vrrp_script monitor{script"while true;do/etc/keepalived/monitor.sh 2>/root/error.log;done&>/dev/null"interval 20}これによりcpu負荷が高くなり、現在の姿に変更されました:vrrp_script monitor{script"nohup/etc/keepalived/monitor.sh 2>/root/error.log&&>/dev/null"interval 20}システムを再起動すると、これまでバックグラウンドで実行されていた数百のsleepプロセスも消え、***ダイヤルが通じない問題も解決されます.
    以上はpptpプロトコルに基づいて実現され、以下greプロトコルに基づいて実現される方式である.
    一、vipがイントラネットipである場合、プロセス中に対端リモートホスト上にトンネルを構築するスクリプトを修正する必要があるため、ローカルとリモートのホストに対して相互信頼を確立する必要がある.以下はプロファイルだけで、ソフトウェアのインストールは上と同じです.
    greプロトコルベースの実装
    プライマリノード:
    1.keepalived.confファイル
    ! Configuration File for keepalived
    global_defs {
       notification_email {
       [email protected]
       }
       notification_email_from [email protected]
       smtp_server hzmx.sky-mobi.com
       smtp_connect_timeout 30
       router_id LVS_DEVEL
    }
    vrrp_script monitor {
    script "nohup /etc/keepalived/monitor.sh  2> /root/error.log & &> /dev/null"
    interval 3
    }
    vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 100
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
        172.18.5.10
        }
        track_script {
           monitor
        }
    }

    2.Monitor.shファイル
    #!/bin/bash
    HASSH=172.18.5.104
    ETH=172.18.50.10/24
    SELF=172.18.5.106
    REMOTE=172.18.3.222
    VIP=172.18.5.10/32
    /sbin/ip addr show | grep $VIP &> /dev/null
    if [ $? -eq 0 ];then
       ssh $HASSH " [ `ifconfig | grep -c tun253` -eq 1 ] && { /etc/keepalived/gre.sh down ;ifconfig eth0:1 down &> /dev/null; }"
       sleep 10
       ssh $REMOTE "grep -c $HASSH /etc/keepalived/gre.sh && { /etc/keepalived/gre.sh down;sed -i "s/$HASSH/$SELF/" /etc/keepalived/gre.sh;/etc/keepalived/gre.sh &> /dev/nul
    l; }"
       if [ `ifconfig | grep -c tun253` -eq 0 ];then
          /etc/keepalived/gre.sh &> /dev/null
          /sbin/ifconfig eth0:1 $ETH up
       fi
       if [ `ifconfig | grep -c eth0:1` -eq 0 ];then
          /sbin/ifconfig eth0:1 $ETH up
       fi
    fi

    3.gre.shファイル
    REMOTE_ADDR='172.18.3.222'
    LOCAL_ADDR='172.18.5.106'
    LOCAL_DEV='eth0'
    TUN_NAME='tun253'
    MODE='gre' # ipip gre
    TUN_IPADDR='192.168.80.254'
    TUN_GATEWAY='192.168.80.253'
    ACTION="up"
    if (($# != 0)); then
            if [ "$1" != "up" -a "$1" != "down" ]; then
                    echo "error"
                    exit 1
            else
                    ACTION="$1"
            fi
    fi
    if ((`lsmod | grep -c "ip_gre"` == 0));then
       modprobe ip_gre
    fi
    if [ "${ACTION}" = "up"  ]; then
            if ((`ifconfig | grep -c ${TUN_NAME}` > 0)); then
                    exit 1
            fi
            ip tunnel add ${TUN_NAME} mode ${MODE} remote ${REMOTE_ADDR} local ${LOCAL_ADDR} dev ${LOCAL_DEV} ttl 64
            ip link set ${TUN_NAME} up
            ip addr add ${TUN_IPADDR} dev ${TUN_NAME}
            ip route add ${TUN_GATEWAY} dev ${TUN_NAME}
            if ((`ip route show | grep -c 172.18.30.0/24` > 0));then
                    exit 1
            fi
            ip route add 172.18.30.0/24 via $TUN_IPADDR
    fi
    if [ "${ACTION}" = "down" ]; then
            if ((`ifconfig | grep -c ${TUN_NAME}` > 0)); then
                    echo "down ${TUN_NAME}"
                    ip link set ${TUN_NAME} down
                    ip tunnel del ${TUN_NAME}
            fi
    fi

    スペアノード
    1.keepalived.confファイル
    ! Configuration File for keepalived
    global_defs {
       notification_email {
       root@localhost
       }
       notification_email_from [email protected]
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id LVS_DEVEL
    }
    vrrp_script monitor {
    script "nohup /etc/keepalived/monitor.sh 2> /root/error.log &  &> /dev/null"
    interval 3
    }
    vrrp_instance VI_1 {
        state BACKUP
        interface eth0
        virtual_router_id 100
        priority 50
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
        172.18.5.10
        }
       track_script {
          monitor
       }
    }

    2.monitor.shファイル
    #!/bin/bash
    HASSH=172.18.5.106
    ETH=172.18.50.10/24
    SELF=172.18.5.104
    REMOTE=172.18.3.222
    VIP=172.18.5.10/32
    /sbin/ip addr show | grep $VIP &> /dev/null
    if [ $? -eq 0 ];then
       ssh $HASSH " [ `ifconfig | grep -c tun253` -eq 1 ] && { /etc/keepalived/gre.sh down ;ifconfig eth0:1 down &> /dev/null; }"
       sleep 10
       ssh $REMOTE "grep -c "$HASSH" /etc/keepalived/gre.sh && { /etc/keepalived/gre.sh down;sed -i "s/$HASSH/$SELF/" /etc/keepalived/gre.sh;/etc/keepalived/gre.sh &> /dev/n
    ull; }"
       if [ `ifconfig | grep -c tun253` -eq 0 ];then
          /etc/keepalived/gre.sh &> /dev/null
          /sbin/ifconfig eth0:1 $ETH up
       fi
       if [ `ifconfig | grep -c eth0:1` -eq 0 ];then
          /sbin/ifconfig eth0:1 $ETH up
       fi
    fi

    3.gre.shファイル
    REMOTE_ADDR='172.18.3.222'
    LOCAL_ADDR='172.18.5.104'
    LOCAL_DEV='eth0'
    TUN_NAME='tun253'
    MODE='gre' # ipip gre
    TUN_IPADDR='192.168.80.254'
    TUN_GATEWAY='192.168.80.253'
    ACTION="up"
    if (($# != 0)); then
            if [ "$1" != "up" -a "$1" != "down" ]; then
                    echo "error"
                    exit 1
            else
                    ACTION="$1"
            fi
    fi
    if ((`lsmod | grep -c "ip_gre"` == 0));then
       modprobe ip_gre
    fi
    if [ "${ACTION}" = "up"  ]; then
            if ((`ifconfig | grep -c ${TUN_NAME}` > 0)); then
                    exit 1
            fi
            ip tunnel add ${TUN_NAME} mode ${MODE} remote ${REMOTE_ADDR} local ${LOCAL_ADDR} dev ${LOCAL_DEV} ttl 64
            ip link set ${TUN_NAME} up
            ip addr add ${TUN_IPADDR} dev ${TUN_NAME}
            ip route add ${TUN_GATEWAY} dev ${TUN_NAME}
            if ((`ip route show | grep -c 172.18.30.0/24` > 0));then
                    exit 1
            fi
            ip route add 172.18.30.0/24 via $TUN_IPADDR
    fi
    if [ "${ACTION}" = "down" ]; then
            if ((`ifconfig | grep -c ${TUN_NAME}` > 0)); then
                    echo "down ${TUN_NAME}"
                    ip link set ${TUN_NAME} down
                    ip tunnel del ${TUN_NAME}
            fi
    fi

    二、vipがパブリックネットワークipである場合、greプロトコルに基づいて実現する
    プライマリノードkeepalivedファイル
    ! Configuration File for keepalived
    global_defs {
       notification_email {
       [email protected]
       }
       notification_email_from [email protected]
       smtp_server hzmx.sky-mobi.com
       smtp_connect_timeout 30
       router_id LVS_DEVEL
    }
    vrrp_script monitor {
    script "nohup /etc/keepalived/monitor.sh  2> /root/error.log & &> /dev/null"
    interval 3
    }
    vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 100
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
        172.18.1.222
        }
        track_script {
           monitor
        }
    }

    プライマリノードモニタshモニタリングスクリプト
    #!/bin/bash
    HASSH=172.18.5.104
    ETH=172.18.50.10/24
    REMOTE=172.18.3.222
    VIP=172.18.1.222/32
    /sbin/ip addr show | grep $VIP &> /dev/null
    if [ $? -eq 0 ];then
       ssh $HASSH " ifconfig | grep -c tun253 && { /etc/keepalived/gre.sh down ;ifconfig eth0:1 down &> /dev/null; }"
       sleep 10
       if [ `ifconfig | grep -c tun253` -eq 0 ];then
          /etc/keepalived/gre.sh &> /dev/null
          /sbin/ifconfig eth0:1 $ETH up
       fi
       if [ `ifconfig | grep -c eth0:1` -eq 0 ];then
          /sbin/ifconfig eth0:1 $ETH up
       fi
    fi

    メインノードは、スクリプトで実行するトンネルを貫通するスクリプトgreを監視する.sh
    REMOTE_ADDR='172.18.3.222'
    LOCAL_ADDR='172.18.1.222'
    LOCAL_DEV='eth0'
    TUN_NAME='tun253'
    MODE='gre' # ipip gre
    TUN_IPADDR='192.168.80.254'
    TUN_GATEWAY='192.168.80.253'
    ACTION="up"
    if (($# != 0)); then
            if [ "$1" != "up" -a "$1" != "down" ]; then
                    echo "error"
                    exit 1
            else
                    ACTION="$1"
            fi
    fi
    if ((`lsmod | grep -c "ip_gre"` == 0));then
       modprobe ip_gre
    fi
    if [ "${ACTION}" = "up"  ]; then
            if ((`ifconfig | grep -c ${TUN_NAME}` > 0)); then
                    exit 1
            fi
            ip tunnel add ${TUN_NAME} mode ${MODE} remote ${REMOTE_ADDR} local ${LOCAL_ADDR} dev ${LOCAL_DEV} ttl 64
            ip link set ${TUN_NAME} up
            ip addr add ${TUN_IPADDR} dev ${TUN_NAME}
            ip route add ${TUN_GATEWAY} dev ${TUN_NAME}
            if ((`ip route show | grep -c 172.18.30.0/24` > 0));then
                    exit 1
            fi
            ip route add 172.18.30.0/24 via $TUN_IPADDR
    fi
    if [ "${ACTION}" = "down" ]; then
            if ((`ifconfig | grep -c ${TUN_NAME}` > 0)); then
                    echo "down ${TUN_NAME}"
                    ip link set ${TUN_NAME} down
                    ip tunnel del ${TUN_NAME}
            fi
    fi

    スペアノード
    keepalived.conf  
    ! Configuration File for keepalived
    global_defs {
       notification_email {
       root@localhost
       }
       notification_email_from [email protected]
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id LVS_DEVEL
    }
    vrrp_script monitor {
    script "nohup /etc/keepalived/monitor.sh 2> /root/error.log &  &> /dev/null"
    interval 3
    }
    vrrp_instance VI_1 {
        state BACKUP
        interface eth0
        virtual_router_id 100
        priority 50
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
        172.18.1.222
        }
       track_script {
          monitor
       }
    }

    モニタスクリプトモニタsh
    #!/bin/bash
    HASSH=172.18.5.106
    ETH=172.18.50.10/24
    REMOTE=172.18.3.222
    VIP=172.18.1.222/32
    /sbin/ip addr show | grep $VIP &> /dev/null
    if [ $? -eq 0 ];then
       ssh $HASSH " ifconfig | grep -c tun253 && { /etc/keepalived/gre.sh down ;ifconfig eth0:1 down &> /dev/null; }"
       sleep 10
       if [ `ifconfig | grep -c tun253` -eq 0 ];then
          /etc/keepalived/gre.sh &> /dev/null
          /sbin/ifconfig eth0:1 $ETH up
       fi
       if [ `ifconfig | grep -c eth0:1` -eq 0 ];then
          /sbin/ifconfig eth0:1 $ETH up
       fi
    fi

    トンネルシナリオgre.sh
    REMOTE_ADDR='172.18.3.222'
    LOCAL_ADDR='172.18.1.222'
    LOCAL_DEV='eth0'
    TUN_NAME='tun253'
    MODE='gre' # ipip gre
    TUN_IPADDR='192.168.80.254'
    TUN_GATEWAY='192.168.80.253'
    ACTION="up"
    if (($# != 0)); then
            if [ "$1" != "up" -a "$1" != "down" ]; then
                    echo "error"
                    exit 1
            else
                    ACTION="$1"
            fi
    fi
    if ((`lsmod | grep -c "ip_gre"` == 0));then
       modprobe ip_gre
    fi
    if [ "${ACTION}" = "up"  ]; then
            if ((`ifconfig | grep -c ${TUN_NAME}` > 0)); then
                    exit 1
            fi
            ip tunnel add ${TUN_NAME} mode ${MODE} remote ${REMOTE_ADDR} local ${LOCAL_ADDR} dev ${LOCAL_DEV} ttl 64
            ip link set ${TUN_NAME} up
            ip addr add ${TUN_IPADDR} dev ${TUN_NAME}
            ip route add ${TUN_GATEWAY} dev ${TUN_NAME}
            if ((`ip route show | grep -c 172.18.30.0/24` > 0));then
                    exit 1
            fi
            ip route add 172.18.30.0/24 via $TUN_IPADDR
    fi
    if [ "${ACTION}" = "down" ]; then
            if ((`ifconfig | grep -c ${TUN_NAME}` > 0)); then
                    echo "down ${TUN_NAME}"
                    ip link set ${TUN_NAME} down
                    ip tunnel del ${TUN_NAME}
            fi
    fi