PPTP-VPN に接続する(CentOS 5.6)

2011/05/31 Tomohiro Kumagai

□ Linux で PPTP サーバーへ接続する

たとえば VPN サーバー機能を搭載したルーター BUFFALO WHR-G301N へ Linux から接続するには PPTP クライアントを設定して、接続を行う必要があります。

CentOS 5.6 の場合、rpmforge リポジトリから "pptp" パッケージと "pptp-setup" パッケージをインストールする必要がありました。rpmforge リポジトリを使うには CentOS 5.4 のシステムアップデート取得先としてリポジトリを追加する で記したような方法で、あらかじめ準備をしておく必要があります。

 

rpmforge を利用する準備ができていれば、次のようにして、PPTP クライアントに必要なパッケージのインストールを行います。

yum install pptp

yum install pptp-setup

これで Linux を PPTP クライアントとして利用するためのパッケージのインストールは完了です。

なお、pptp を動作させるためには pppd も必要なので、場合によっては "pppd" パッケージも別途インストールする必要があるかもしれません。

 

インストールが完了したら、接続設定は "pptp-setup" を利用すれば簡単です。

たとえば、次のような接続設定を行いたい場合を見てみます。

PPTP サーバー pptp.server.xxx.xx.jp
接続アカウント ACCOUNT
接続パスワード PASSWORD

これを設定したい場合には、次のようにして、設定ファイルを作成します。

pptpsetup --create "PPTP1" --server "pptp.server.xxx.xx.jp" --username "ACCOUNT" --password "PASSWORD" --encrypt

このようにすることで、PPTP 接続設定が "/etc/ppp/peers/" ディレクトリ内に "PPTP1" という名前で作成されて、パスワードについては "/etc/ppp/chap-secrets" ファイル内に記載されます。

このとき、"--create" の後に付加した接続設定名には、ハイフン ( - ) はつけられないようでした。アンダースコア ( _ ) なら大丈夫なようです。

 

設定ができたら、後は次のようにして、先ほど作成した設定ファイル名 "PPTP1" を呼び出してあげることで、接続を開始できました。

pppd call PPTP1 updetach

ここで "updetach" は、接続が完了するまでの間、フォアグラウンドで接続処理を行うためのオプションだそうです。

ちなみに切断は、pppd プロセスを終了させれば良いようですけど、もし PPPoE でプロバイダーに接続する で記したように PPPoE 接続なども行っている環境ではそれも pppd で接続されるようなので、"pkill -x pppd" などで終了させると、そういった別の接続も終了させてしまう感じでした。

目的の PPTP 接続のみを終了させたい場合には、次のようにするのが良さそうです。

pkill -f "^/usr/sbin/pppd call PPTP1\s"

このようにすることで、設定ファイル名 "PPTP1" が指定された pppd プロセスのみを終了させてくれるので、ほかの pppd に依存する接続を終了させずに済むようになると思います。

 

□ pptpsetup が作成する設定ファイル

pptpsetup を実行すると、接続設定ファイルとして次のようなものが "/etc/ppp/peers/" ディレクトリ内に作成されます。

# written by pptpsetup

pty "pptp pptp.server.xxx.xx.jp --nolaunchpppd"

lock

noauth

nobsdcomp

nodeflate

name ACCOUNT

remotename PPTP1

ipparam PPTP1

require-mppe-128

このように、"pppd" オプションと "pptp" に渡す引数が指定されたファイルが出来上がっていました。

他にも必要に応じて、"nodefaultroute"(この接続をゲートウェイとして使用しない), "persist"(切断時に再接続を試みる), "proxyarp"(ARP プロキシを有効にする)など、設定を追記しても良いかもしれません。

これらの設定は、接続設定ファイルに個別にでなくても、"/etc/ppp/options.pptp" に記載することでも設定できるようです。

 

このほかに、"/etc/ppp/chap-secret" ファイルにも、次のようなアカウント情報が記載されます。

# added by pptpsetup for pptp_tachibanadai

ACCOUNT PPTP1 "PASSWORD" *

記載は順に "アカウント名", "remotename に設定されている名称", "パスワード", "IP アドレス" となるようです。

ただ "IP アドレス" については、試してみた感じでは、ここで IP アドレスを指定しても何も影響はない感じでした。これは PPPoE サーバーなどを構築した場合に、接続元の IP アドレスを限定するために使用するもののような感じでした。

 

□ ルーティング設定をスクリプトで自動化するには

たとえば、Linux ルーター上で PPTP 接続を行い、取得できたネットワークへのルーティング情報を自動的にシステムに登録したいような場合には、次のようなスクリプトで、pppd call コマンドの戻り値から得た情報を解析して、それをルーティングテーブルに書き込むことも可能でした。

#!/bin/bash

PPTPNAME="PPTP1"
MASKBIT=24

 . /etc/ez-net/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 interface\s*//"`
			;;

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

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

		"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

ここで、冒頭で組み込んでいるスクリプト "/etc/ez-net/get_network.sh" というのは、以前に シェルスクリプトでネットワークアドレスを計算する でお話した、ネットワークアドレスを取得するシェルスクリプト関数 "get_network" が定義されたファイルです。

このような感じのスクリプトを実行することで、少なくとも pptp 1.7.2 の PPTP 接続から、その出力結果から、PPTP で接続された外部プライベートネットワークへアクセスするためのルーティング設定を追加することができました。

 

なお、PPTP の切断については、次のようなスクリプトを用意すれば大丈夫な感じです。

#!/bin/sh

PPTPNAME="PPTP1"

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

PPTP が切断されて ppp インターフェイスが消滅すれば、自動的にルーティングテーブルも消去される感じなので、これでひとまずの終了処理になるのではないかと思います。


 

カスタム検索

copyright © Tomohiro Kumagai @ EasyStyle G.K.
contact me: please from mail-form page.