EC2からルーターのVPN(PPTP)に接続する方法

社内からのみ接続を許可しているサーバーがあり、
EC2上から直接ファイルの転送する必要があるときなどの用途になります。
FireWallを開けるほうが楽な場合はそっちをオススメします。

PPTP周りのソフトをインストールします。
yum install pptp-setup ppp-devel

VPN接続プロフィールを作成します。

pptpsetup –create “{接続名}” –server “{ルータのIPアドレス}” –username “{ユーザー名}” –password “{パスワード}” –encrypt

http://network.station.ez-net.jp/os/linux/network/pptp/centos/5.6.asp
こちらのページを参考にスクリプトを作成します。

mkdir -p /root/script
vim /root/script/get_network.sh

#!/bin/sh

# Usage: NETINFO=(`get_network "192.168.1.130" "28"`)
#
#  ${NETINFO[0]}: Network Address
#  ${NETINFO[1]}: Broadcast Address
#  ${NETINFO[2]}: Netmask

function get_network()
{
        local NETWORK=""
        local BROADCAST=""
        local NETMASK=""

        local IPADDR="$1"
        local MASKBIT="$2"

        local ip_array=(`echo "$IPADDR" | sed -e "s/./ /g"`)
        local ip_index=0

        while [ $ip_index -lt 4 ]
        do
                if [ "$MASKBIT" -lt 8 ]
                then
                        MASK=$((256-2**$((8-MASKBIT))))
                        MASK_REV=$((~MASK%256+256))
                        MASKBIT=0
                else
                        MASK=255
                        MASK_REV=0
                        MASKBIT=$((MASKBIT - 8))
                fi

                NETWORK="${NETWORK}.$((ip_array[ip_index] & MASK))"
                BROADCAST="${BROADCAST}.$((ip_array[ip_index] | MASK_REV))"
                NETMASK="${NETMASK}.$MASK"

                ip_index=$((ip_index + 1))
        done

        NETWORK=`echo $NETWORK | sed -e "s/^.//"`
        BROADCAST=`echo $BROADCAST | sed -e "s/^.//"`
        NETMASK=`echo $NETMASK | sed -e "s/^.//"`

        echo "$NETWORK $BROADCAST $NETMASK"
}

vim /root/script/ppp-network-start.sh

#!/bin/bash

PPTPNAME="{接続名}"
MASKBIT=24

 . /root/script/get_network.sh

function clear_status()
{
        DEVICE=""
        LOCAL_IP=""
        REMOTE_IP=""
}

function check_progress()
{
        local LINE="$1"

        case "$LINE" in

                "Using interface "*)
                        DEVICE=`echo "$LINE" | sed -e "s/^Using interfaces*//"`
                        ;;

                "local  IP address "*)
                        LOCAL_IP=`echo "$LINE" | sed -e "s/^local  IP addresss*//"`
                        ;;

                "remote IP address "*)
                        REMOTE_IP=`echo "$LINE" | sed -e "s/^remote IP addresss*//"`
                        ;;

                "Connection terminated.")
                        clear_status
                        ;;

                *)
                        ;;
        esac
}

clear_status

while read LINE
do

        echo $LINE
        check_progress "$LINE"

done < <(/usr/sbin/pppd call $PPTPNAME updetach)

if [ "$DEVICE" ]
then

        NETINFO=(`get_network "$LOCAL_IP" "$MASKBIT"`)

        NETWORK=${NETINFO[0]}
        BROADCAST=${NETINFO[1]}
        NETMASK=${NETINFO[2]}

        ROUTECMD="route add -net $NETWORK/${MASKBIT} dev $DEVICE"

        $ROUTECMD

        exit 0

else

        echo "Failed to connect to $PPTPNAME."

        exit 1

fi

vim /root/script/ppp-network-stop.sh

#!/bin/sh

PPTPNAME="{接続名}"

pkill -f "^/usr/sbin/pppd call ${PPTPNAME}s"

chmod +x /root/script/*

VPNに接続します
/root/script/ppp-network-start.sh
route -n
ppp0が追加されていることを確認します。
これでVPNへの接続は完了ですが、
すべてのパケットをVPN経由で飛ばさないと目的のサーバーにログインできません。

route add default ppp0

これでデフォルトゲートウェイがppp0に切り替わるので、目的のサーバーにログインできます。
※DNSの解決を内部のサーバーとかでおこなっているとそちらが参照できなくなるので、
 /etc/resolv.confを「nameserver 8.8.8.8」などに書き換えてください。

元に戻すときは、

route del default ppp0
/root/script/ppp-network-stop.sh

でVPN接続が切れます。