2011年10月22日

OpenVPN+bridge-utilsのVPNでリモートの同一セグメントに乗っかる

 普段持ち歩くPCはWindowsなので、VPNはPPTPが一番楽である。クライアント1台のみのことなのでいちいちルーティングを設定して使うのは面倒で、PPTPはクライアント1台をVPNの向こう側の同一セグメント上に接続しているかのごとく見せるのが簡単にできるので結構なのである(LinuxのPPTPサーバの実装[PopTop]もある)。が、先日ブロバンルータを乗り換えたため、問題が発生した。PPTPはGREを使うのだが、古いバッファローのルータではプロトコルGREのパケットを特定ホストに転送が出来たのに、今度のコレガのルータではプロトコルIPv4のパケット(のTCPかUDPの特定のポート)しか内側に振れないのである。従って、PPTPはまるっきり使えないことになった。
 次善の策として、OpenVPNを使って、同じように、リモートからVPN越しにつないで、あたかもVPN先のセグメントに繋がってるが如くに振る舞うようにする設定したのであった。サーバーはCentOS5.7、クライアントはWindows7である。

サーバー側の設定
設定ファイルは、/etc/openvpnに置くことを仮定している。

1. OpenVPNのインストール
RPMforgeにあるので、yumで一発。また、bridge-utilsを使ってブリッジを作るので、それもインストール。

# yum install --enablerepo=rpmforge openvpn
[略]
# /usr/sbin/openvpn --version
OpenVPN 2.2.0 x86_64-redhat-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [eurephia] built on Jun 6 2011
[略]
# yum install bridge-utils
# brctl --version
bridge-utils, 1.1
2. 鍵を作る
OpenVPNをブリッジで使うときは static-key が使えないみたいなので、CAを作って鍵を作って署名する。
# cd /etc/openvpn/ ※どこのディレクトリでやってもいいのだが。
# cp -r /usr/share/doc/openvpn-2.2.0/easy-rsa/2.0/ easy-rsa
# cd easy-rsa
# vi vars ※設定値を変えておくと作業が楽になる
export KEY_COUNTRY="JP"
export KEY_PROVINCE="ToKyo"
export KEY_CITY="ChiyoDaku"
export KEY_ORG="usoinfo"
export KEY_EMAIL="usoinfo_at_ahoaho.net"
# source vars
# ./clean-all

# ./build-ca ※CAを作る。プロンプトにはEnterでいいが適宜お好みで。
# ./build-key-server server ※サーバーの鍵。これもお好みで。
# ./build-key ahoaho ※クライアントの鍵。接続するクライアント毎に作る。

# cp keys/ca.crt /etc/openvpn/
※出来たCAの証明書をconfigのあるところへ配置。

# cp keys/server.crt keys/server.key keys/dh1024.pem /etc/openvpn/
※出来たサーバ用の鍵をconfigのあるところへ配置。
※ keys/ca.crt keys/ahoaho.crt keys/ahoaho.key はクライアントの動作に使う
3. ブリッジの用意
# cp /usr/share/doc/openvpn-2.2.0/sample-scripts/bridge-start /etc/openvpn
# cp /usr/share/doc/openvpn-2.2.0/sample-scripts/bridge-stop /etc/openvpn
※ブリッジの開始・停止スクリプトをコピー

# chmod 755 bridge-start bridge-stop ※実行ビットを付与

# vi bridge-start ※ブリッジ開始の設定を編集
br="br0" ※ブリッジインターフェース名。
tap="tap0" ※ブリッジするOpenVPNのTAPインターフェース名。
eth="eth0" ※ブリッジするローカルセグメントのインターフェース名。
eth_ip="192.168.x.y"
eth_netmask="255.255.255.0"
eth_broadcast="192.168.x.255"

# vi bridge-stop ※ブリッジ停止の設定を編集
br="br0" ※bridge-startに合わせる
tap="tap0" ※bridge-startに合わせる
 ブリッジインターフェース名は、他にブリッジがなければbr0でいいだろう。TAPインターフェース名は、OpenVPNの設定と合っていないとダメ。ethの各項目は、ローカルセグメントに繋がっているインターフェースの設定を書く。
 OpenVPNでブリッジするときは、bridge-start → openvpn startの順で開始し、openvpn stop → bridge-stopの順で停止しないといけない。面倒なので、スタートアップスクリプトに開始と終了を埋め込む。
# vi /etc/rc.d/init.d/openvpn
[略]
case "$1" in
start)
echo -n $"Starting openvpn: "
/etc/openvpn/bridge-start ※開始時OpenVPNが始まる前にブリッジ開始
/sbin/modprobe tun >/dev/null 2>&1
[略]
stop)
echo -n $"Shutting down openvpn: "
for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do
if [ -s $pidf ]; then
kill `cat $pidf` >/dev/null 2>&1
fi
rm -f $pidf
done

# Run shutdown script, if defined
if [ -f $work/openvpn-shutdown ]; then
$work/openvpn-shutdown
fi
/etc/openvpn/bridge-stop ※OpenVPNが停止した後でブリッジ停止
4. OpenVPNサーバーの設定
 OpenVPNサーバーの設定は、設定ディレクトリ(/etc/openvpn)に、xxxx.confという名前で保存しておくと、スタートアップスクリプトが .conf の設定を読み込んで実行してくれる。/usr/share/doc/openvpn-2.2.0/sample-config-files/server.conf にサンプルの設定ファイルがあるので、これをベースに書き換えてもいい。
OpenVPNサーバー設定のポイントを抜粋:
server-bridge 192.168.1.1 255.255.255.0 192.168.1.222 192.168.1.230
dev tap0
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
client-to-client
push "route 192.168.2.0 255.255.255.0"
push "dhcp-option DNS 192.168.1.1"
server-bridgeが、ブリッジモードを指定する。1,2番目がローカルセグメントの(つまりeth1の)アドレスとネットマスク、3,4番目が、クライアントに割り当たるアドレスの開始アドレスと終了アドレスである。
dev tap0で、OpenVPNのTAPインターフェースを指定する。bridge-start/stopで指定したインターフェース名を、数字も込みでで指定する。"dev tap"ではダメである。
ca cert key dhは、2.で作った証明書と鍵をOpenVPNに読み込ませる設定。
client-to-clientは、OpenVPNクライアント同士が通信するときに必要。クライアントが1台だけならいらない。
push "route 192.168.2.0 255.255.255.0"は、他のネットワーク(ここでは192.168.2.0)への通信がVPNを経由するようにクライアントに経路を設定させる。
push "dhcp-option DNS 192.168.1.1"は、クライアントにDNSサーバーのアドレスを通知する。

TCPサーバーモード、ポート5000で動かす場合の設定ファイルのサンプルはこちら

5. 設定ファイルを配置したら、service openvpn startでデーモン開始。ブリッジを開始するときにしばらく通信できなくなることがある(ブリッジの設定を失敗するとずっと通信できなくなる)ことがあるので、実行はコンソールからやるのがお勧め。
正常動作を確認できたら、chkconfig openvpn onで自動的に開始するようにしておく。

クライアント側の設定
1. OpenVPNのインストール
http://www.openvpn.net/index.php/open-source/downloads.htmlから Windows Installer をダウンロードしてきて、インストールする。

2. クライアントの設定
 サーバーの2.で作ったクライアント用の鍵と証明書のファイル(ca.crt,ahoaho.crt,ahoaho.key)を、クライアントのconfigフォルダに置く。デフォルトでは、C:\Program Files\OpenVPN\config
 configフォルダにクライアント用の設定ファイルをxxxx.opvnという名前で作成する。
OpenVPNクライアント設定のポイントを抜粋:
dev tap
ca ../config/ca.crt
cert ../config/barkhorn.crt
key ../config/barkhorn.key
tls-client
pull
float
dev tapで、OpenVPNのTAPインターフェースを指定する。
ca cert key dhは、2.で作った証明書と鍵をOpenVPNに読み込ませる設定。
tls-clientで、TLSクライアントを指定する。
pullで、サーバーからconfigを読み取る。サーバーがpushで設定した項目が設定される。
tls-clientで、IPアドレスが可変であることを指定する。

TCPクライアントモード、ポート5000で動かす場合の設定ファイルのサンプルはこちら

3. スタートメニューから、OpenVPN GUIを実行し、通知領域アイコンを右クリック、「Connect」を実行する。うまくいけば、"Initalization Sequence Completed" と出て、TAPアダプターにIPアドレスが付与されるはずである。


ブロバンルータで、OpenVPNのポートを内側のホストにアドレスに振っておくのを忘れずに。
タグ:Linux VPN OpenVPN
posted by usoinfo at 11:07 | Comment(0) | Linux | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]