« 遅いSSD | トップページ | VPN on FreeBSD(後編) »

2011/12/10

VPN on FreeBSD

2011/12/16 設定ファイルに一行追加しました。


最近パソコン意欲(?)が強くなってきたので、長年の課題であった自宅環境のVPN化をもくろんでみた。
ま、外からつなぐ回線はPHSなのであくまでお遊びである。

FreeBSDでVPNを使うことについてはこのページが詳しいので、大いに参考にさせてもらったが一部バージョン違いのせいか書いてある内容ではうまくいかないところや手を加えたかったところなどがあるので、こちらにも記載しておく。

ウチの環境はFreeBSD8.1-RELEASE & OpenVPN2.2.1である。
あと、いるのはOpenSSLとLZOとbashである。OpenSSLはデフォルトでインストールされる・・・かな?LZO2はデフォルトでは入っていないので、「/usr/ports/archivers/lzo2」からインストールしてやる必要がある。bashは・・・あとで使うんす。
あとは、当然OpenVPN。今回はソースからコンパイルするので、http://openvpn.net/からダウンロードしておく。まぁ、/tmpあたりに置いておけばいいだろう。

☆デバイスのロード
VPN接続するにはTAP デバイスとブリッジデバイスが必要。NICをブリッジしてやるデバイス・・・なのかな?よくわからん。
下記コマンドにて if_tap と if_bridge をロードする。
 # kldload if_tap
 # kldload if_bridge
ロードできたら起動時に自動的にロードするように、/boot/loader.conf に下記 2行を追加。
 if_bridge_load="YES"
 if_tap_load="YES"

☆OpenVPNのコンパイル
ダウンロードしてきたtar玉を解凍して、できたディレクトリに移動。
今回は圧縮機能を有効にしたいので以下の通り、makeファイルを作成する。
 % ./configure --with-lzo-headers=/usr/local/include --with-lzo-lib=/usr/local/lib --prefix=/usr/local/openvpn
問題なければ、make
 % make
 # make install

☆証明書&鍵の作成
これはソースから行うらしい。なので、コンパイルが終わってもOpenVPNのソースディレクトリを消さないこと。
この手順は先に挙げたページの説明が詳しいので引用させてもらう。
~~~~~~~~引用~~~~~~~~~~
vars スクリプト内の変数及びちょっとした修正を行う。
easy-rsa スクリプト群はどうも vars スクリプトの環境変数を上手く引き継げないようなので、これも合わせて修正。

まずは /(OpenVPN ソースディレクトリ)/easy-rsa/ に移動しておく。

# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY=***
export KEY_PROVINCE=***
export KEY_CITY=***
export KEY_ORG=***
export KEY_EMAIL=***

$1 ←これを追加

最後の方にある KEY_* はデフォルトでも良いし自分で好きな値に書き換えても良い。
最終行の $1 は、vars スクリプトで環境変数が設定された後にスクリプトを呼び出すための処置。
~~~~~~~~ここまで~~~~~~~~
上の説明はvarsというスクリプトの説明である。
ちなみに、このディレクトリの位置は正しくは「 /(OpenVPN ソースディレクトリ)/easy-rsa/2.0/」だったりする。
ファイルの最後にあるKEY_hogehogeというのは、サンプルファイルをまねして適当に書き換えればいい。どうせなんちゃって証明書なのでデフォルトのままでもいいだろう。

☆ルートCA認証局の開局
ここら辺は、正直さっぱりわからないので(ほかのところもわからないのだが(汗))、上記のページのまるまるマネっこである。
~~~~~~~~引用~~~~~~~~~~
まずは証明書に署名を行うためのルート CA 認証局を開設する。
一度きりの実行でよい。

# ./vars "./clean-all"
# ./vars "./build-ca"

"Organizational Unit Name" は空のまま。
"Common Name" はなんでも良いが、今回は "OpenVPN-CA" という文字列を使用した。
~~~~~~~~ここまで~~~~~~~~
ただ、よくわからないのだが、(t)csh上ではうまく動かなかった、のでbashに切り替えて実行する必要があった。
今確認してみたのだが、varsがシェルスクリプトじゃないんだね。なんでかな?まぁ、それならcshにexportなんて内部コマンドがないからエラーになるのも当たり前だ。
なので、bashは必須。

☆サーバ証明書&鍵の作成
例によって引用
~~~~~~~~引用~~~~~~~~~~
サーバーで使用する証明書と鍵を作成する。
一度きりの実行でよい。

# ./vars "./build-key-server server"

"Organizational Unit Name" は空のまま。
"Common Name" は "server" とした。
"A challenge password" は空のまま。
"An optional company name" は空のまま。
"Sign the certificate?" (サインしても良いか?) には "y"。
"1 out of 1 certificate requests certified, commit?" (1/1証明書要求を確認したが良いか?) には "y"。
~~~~~~~~ここまで~~~~~~~~

☆DH (Diffie-Hellman) パラメータファイルの作成
引用。
~~~~~~~~引用~~~~~~~~~~
サーバーで使用する "DH パラメータ" ファイルを作成する。
一度きりの実行でよい。

# ./vars "./build-dh"

マシンパワーに左右されるほどの時間がかかるのでのんびりお待ち下さい。
といっても PentiumIII 800MHz で数分だが。
~~~~~~~~ここまで~~~~~~~~
ウチの環境AthlonII X2 240eでは一瞬だったかな。

☆クライアント証明書/鍵の作成
引用。
~~~~~~~~引用~~~~~~~~~~
クライアントで使用する証明書と鍵を作成する。
クライアント単位で個別の証明書が必要なので、クライアントが増えたらこの操作を行うこと。

# ./vars "./build-key client1"

"Organizational Unit Name" は空のまま。
"Common Name" は "client1" とした。名前は何でもよいので証明書ファイル名の名前を指定するとよい。
"A challenge password" は空のまま。
"An optional company name" は空のまま。
"Sign the certificate?" (サインしても良いか?) には "y"。
"1 out of 1 certificate requests certified, commit?" (1/1証明書要求を確認したが良いか?) には "y"。
~~~~~~~~ここまで~~~~~~~~
これがあるから、ソースディレクトリを消してはいけないのだね。
ちなみに、ここまでの作業はvarsを実行するのでbashが必要。これが終わったら抜けていい。

☆ファイルコピー
サーバの/usr/local/openvpn/etc/以下に次の4つのファイルをコピーする。
サーバー証明書 (server.crt)
サーバー鍵 (server.key)
ルート CA 証明書 (ca.crt)
DH パラメータ (dh*.pem)
クライアントは後述。ただし、使うファイルは次の3つのファイルなのでとりあえずクライアントのデスクトップにでも持ってきておけばいいのでは?
クライアント証明書 (client*.crt)
クライアント鍵 (client*.key)
ルート CA 証明書 (ca.crt)

☆設定ファイル作成
これは本家を見ながら自分で作ってもいいが、先に挙げたページにサンプルファイルがあるのでそれを使ってもいい。
いるのはサーバは設定ファイル・スタートアップファイル・ブリッジ作成ファイル・ブリッジ削除ファイルの4つ。
クライアントは設定ファイル・・・だがいらない場合もある。(後述)
サーバ用ファイルはそれぞれ次の場所に配置する。
設定ファイル(/usr/local/openvpn/etc/bridge.conf)644
スタートアップファイル(/usr/local/etc/rc.d/openvpn.sh)755
ブリッジ作成ファイル(/usr/local/openvpn/sbin)755
ブリッジ削除ファイル(同上)755
上の括弧の後ろの数字はパーミッション。(誰も教えてくれてないが、たぶんこれでいい)
なお、ウチの設定ファイル(bridge.conf)は次のようになっている。
~~~~
daemon

port 8081

proto udp

dev tap0

mode server

ca /usr/local/openvpn/keys/ca.crt
cert /usr/local/openvpn/keys/server.crt
key /usr/local/openvpn/keys/server.key
dh /usr/local/openvpn/keys/dh1024.pem

server-bridge 192.168.0.xxx 255.255.255.0 192.168.0.200 192.168.0.209
push "dhcp-option DNS xxx.xxx.xxx.xxx"
#push "dhcp-option WINS 192.168.1.10"
push "redirect-gateway def1"

keepalive 30 120

script-security 2

up /usr/local/openvpn/sbin/bridge-up.sh
down /usr/local/openvpn/sbin/bridge-down.sh

verb 3

management localhost 7505

comp-lzo
~~~~
「port」のところは環境によって書き換えて欲しい。それとプロトコルはあえてUDPにしてみた。TCPよりUDPの方がいいらしいので。
あと、今回は圧縮を使いたいので「comp-lzo」は必須。(これを書いた場合はクライアントでも圧縮を有効にしないといけないらしい)
「script-security 2」というのはよくわからないが、サーバを起動したときのエラーメッセージに書けと書いてあったので入れてみた。なくてもいいかもしれない。
2011/12/16追加
「push "dhcp-option DNS xxx.xxx.xxx.xxx"」の一行を追加。アドレスにはLANで使用しているDNSサーバのアドレスを入力する。この設定を入れないと、VPNで接続したときに名前解決ができなくなってしまう。

☆起動テスト
テストを行いたいのだが、上の設定ファイルだとデーモンモードで起動してしまうので「daemon」→「#daemon」に書き換えておく。(テストが終わったら忘れずに元に戻しておくこと)
そして以下のコマンドを実行
# /usr/local/openvpn/sbin/openvpn --config /usr/local/openvpn/etc/bridge.conf
設定ファイルに問題がなければ、いくつかメッセージが出た後openvpnが起動する。
この状態だとOpenVPNがフォアグラウンドで実行されているので、テストが終わったらCtrl+Cで抜ける。
ちなみに、エラーがある場合は最後Exitで勝手に抜けてしまうので、表示されたメッセージを確認して設定ファイルを修正すること。

☆本起動
テストが終わったら、以下のコマンドを実行してOpenVPNをデーモンモードで起動する。
#/usr/local/etc/rc.d/openvpn.sh start
もちろん、設定ファイルのdaemonのコメントアウトを元に戻しておくこと。

☆クライアント設定
・・・書こうと思ったのだが、存外に長くなってしまったので次回書きます。(笑)

|

« 遅いSSD | トップページ | VPN on FreeBSD(後編) »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/50484/53445779

この記事へのトラックバック一覧です: VPN on FreeBSD:

« 遅いSSD | トップページ | VPN on FreeBSD(後編) »