OpenVPNのブリッジモード(まとめ)

概要

OpenVPNのブリッジモード構築手段についてまとめておく。

事前準備

以下の条件を満たしていること。

  1. サーバはFreeBSD
  2. クライアントはFedora Core6
  3. OSは双方共インストール済み
  4. クライアントは自分で頑張ってやってちょ(参考文献で十分だと思う)
  5. サーバはブリッジが有効になってる

テスト環境

D-LINK社のDI-624を2台、適当なスイッチを1台。
スイッチをインターネット環境に見立てて、双方のルータをスイッチに接続。
それぞれのルータにVPN Client、VPN Serverを接続という流れとした。
VPN Server側ルータにはUDP 1194をVPN Server側に転送する設定とし、後は適当に設定。

OpenVPNのインストール

バージョンは2.0.9。この辺から適当にソースコードをダウンロードしてくる。2.0.x系と2.1.x系は若干違うようなので注意。
http://openvpn.net/
また、依存ライブラリであるLZOも準備しておく。LZOは2.02.2だが、下位互換性をちゃんと意識しているので多分適当なものでいい。
lzoはtarを展開してから、例によってこの三つでインストール。

./configure
make
make install

OpenVPNだが、lzoのパスを指定やる以外はほとんど同じ。

./configure --with-lzo-headers=/usr/local/include/lzo/ --with-lzo-lib=/usr/local/lib/
make
make install

適当に変更してもらえればOK。

ネットワーク設定

続いてサーバのネットワーク設定。今回はNICのデバイス名がsk0だったのでその前提で。デバイス名が自環境でどうなっているかは、ifconfigで確認すればいい。
/etc/rc.confを開いて以下行を追加して再起動すればDHCP

ifconfig_sk0="dhcp"

固定なら同ファイルを開いてこんな感じ。要再起動。

ifconfig_sk0="inet 192.168.40.2 netmask 255.255.255.0 broadcast 192.168.40.255"
defaultrouter="192.168.40.1"

再起動を忘れずに。結果はifconfigで確認すればいい。

ブリッジの有効化

ブリッジを使わないと今回の構成では話にならないので、これが上手くいくかを確認する。

kldload bridge

問題なさそうな雰囲気なら、/boot/loader.confに以下を加えれば自動的にBridgeが有効にされるようになるが、これは好みで。

bridge_load="YES"

どの道ブリッジの起動Shellは後で作るので、そこでkldloadをやってもいい。

TAPデバイスの有効化

OpenVPNをブリッジモードで動作させるためにTAPデバイスを使うので、TAPデバイスを有効化してあげる必要がある。大体Bridgeの時と同じような手順。

kldload if_tap

これがOKなら問題なし。OKじゃない場合は調べてないから書けない。
/boot/loader.confはこんなの。って、もうわかるか。例によって記述は好みで。

if_tap_load="YES"

ipfwの有効化

ついでにFirewallも動かしておく。今回私は大して使ってないのだが、将来使う事になりそうなので有効化だけやっておいた。
/etc/rc.confを開いて下記行を追加。

firewall_enable="YES"
firewall_type="OPEN"
firewall_script="/etc/ipfw.rule"
firewall_logging="YES"
firewall_quiet="YES"

ついでに/etc/ipfw.ruleも作成する。
後でやるという人はこれだけ書いておけばいい。

ipfw add allow all from any to any

書いておかないと全てのパケットをブロックする凶悪なファイアウォールが稼動してしまうので、上記を書くか、ipfwを使わないか、ちゃんと設定するかのどれかにしよう。

SSHの設定

なんか私の環境では、デフォルトではチャレンジレスポンスモードで動いていたので、非対称鍵でやる事にした。
でもこの設定はOpenVPNとあまり関係ないので省略。適当にどうぞ・・。
TeraTermとかなら、認証方式をチャレンジレスポンスにする点だけ注意すること。

証明書の作成

How to通りでいい。
OpenVPNのソースを解凍した場所に、easy-rsaというディレクトリがあるのでそこにcdしておく。
次にシェルを/bin/shに切り替えておく。
で、要するに以下時系列に打てばいい。vars先頭の「.」に注意。

/bin/sh
. ./vars
./clean-all
./build-ca
./build-key-server server
./build-key vpnclient
./build-dh
exit

varsを編集しておくとデフォルト値を変更できるので後が楽。
build-keyやらbuild-caやらでは色々と質問を受けるのだが、注意するのはCommonNameという項目。ここは必ず一意にしなければならないので、クライアントとサーバで同じ値にしないように注意すること。


鍵は色々出来るが、以下のファイル以外は不要。

ファイル名 サーバ クライアント
ca.crt
ca.key  
ch[n].pem  
Server.crt  
Server.csr  
Server.key  
vpnclient.crt  
vpnclient.csr  
vpnclient.key  

ほんとは*.csrもいらないが、将来設定を変更した時のために一応残しておく。この辺はお好みで。
.keyファイルを大切に保管しておく事を忘れずに。パーミッションを600か400辺りにしておけばいいだろう。
で、これを適当な場所に設置。
私は/etc/openvpn/keys/に置いた。クライアントは社員に任せていたら、なんか/usr/share/doc/openvpn-2.0.9/に入ってた。

サーバの設定

説明は省略する。とりあえず/etc/openvpn/server.confを作って、以下のファイルを貼り付け。

port 1194
proto udp
dev tap

# keys
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem

# server address
server-bridge 192.168.40.200 255.255.255.0 192.168.40.201 192.168.40.220

# client-to-client!!
client-to-client

# !test only!
duplicate-cn

# exec user and group
user nobody
group nobody

# keep alive (value is default)
keepalive 10 120

# restart setting
persist-key
persist-tun


# control script's
up /etc/openvpn/start-bridge.sh
down /etc/openvpn/stop-bridge.sh

# compress setting
comp-lzo

# message level
verb 3

server-bridgeは左からサーバのブリッジIP、サブネットマスクVPNクライアントのIPアドレス範囲の開始IP、VPNクライアントのIPアドレス範囲の終了IP。後ろ二つは、要するにDHCPスコープの設定。
んで、/etc/openvpn/start-bridge.shを作成して以下を貼り付け。

#!/bin/sh
ifconfig tap0 inet 192.168.40.200
sysctl -w net.link.ether.bridge.enable=1
sysctl -w net.link.ether.bridge.ipfw=1
sysctl -w net.link.ether.bridge_cfg="sk0 tap0"

IPアドレスとデバイス名に気をつけて。
/etc/openvpn/stop-bridge.shを作成して、以下を貼り付け。

#!/bin/sh
sysctl -w net.link.ether.bridge.enable=0
sysctl -w net.link.ether.bridge.ipfw=0
sysctl -w net.link.ether.bridge_cfg=

テスト

これでとりあえず完了。以下で起動させよう。

cd /etc/openvpn/
/usr/loca/sbin/openvpn --config ./server.conf

「Initialization Sequence Completed」と最後に出れば成功。
駄目なら一度再起動して、もう一度。
それでも駄目なら頑張って調べよう。
OKならクライアントと接続して色々テストしてみればいい。

仕上げ

設定ファイルの修正

/etc/openvpn/server.confに以下を追加。

status /var/log/openvpn-status.log
log-append  /var/log/openvpn.log
verb 3

verbは書き換え。
duplicate-onも消しておこう。

デーモン化

デーモンとして動かすので/etc/rc.d/openvpnを作成して、以下を貼り付け。
※本項はあまりテストしてない。

#!/bin/sh
. /etc/rc.subr

: ${openvpn_dir="/etc/openvpn"}
: ${openvpn_configfile="/etc/openvpn/server.conf"}
: ${openvpn_enable="YES"}

name="openvpn"
rcvar=`set_rcvar`
pidfile="/var/run/${name}.pid"

load_rc_config ${name}

# rc_debug="YES"

required_files="${openvpn_configfile}"

command="/usr/local/sbin/${name}"
command_args="--cd ${openvpn_dir} --daemon --config ${openvpn_configfile} --writepid ${pid file}"


run_rc_command "$1"

なんかしっくり来なかったらrc_debugのコメントアウトを解除して再テスト。デバッグメッセージがたくさん出てくる。

logrotate

FreeBSDはlogrotateがデフォルトで入ってないので、ローテーションにはnewsyslogを使う。
/etc/newsyslog.confを開いて以下を追記。
※本項はあまりテストてしてない

/var/log/openvpn.log                    600  5     100  *     JC
/var/log/openvpn-status.log             600  5     100  *     JC

まとめ

我ながら説明する気のあまりなさそうなエントリだが、とりあえずこんな感じで。
ルーティングモードはもうちょっと検証する機会があったら後日まとめる。
ゲートウェイやらNATDやらで、ルーティングモードの方がはるかに面倒。OpenVPNを手軽に使いたいと思っているなら、はじめからブリッジモードでやった方がいいというのが感想。