2014年8月5日火曜日

FreeBSD の自宅サーバへ OpenVPN をインストール(ルーティング方式)

DD-WRT 上の OpenVPN で VPN 環境を試験的に構築してみましたが、なかなか使い勝手もよく、恒常的に環境を維持しておきたいと思いました。そこでビルドが 2010 年ごろの DD-WRT の OpenVPN を使い続けるのはセキュリティ上問題もあると考えて、最新のバージョンを FreeBSD で構築している自宅サーバへインストールすることとしました。OpenVPN の接続形式は、ルーティング( Routing )方式を採用しました。

参考にしたウェブサイは次のものです。大切な情報ありがとうございます。

FreeBSD OpenVPN Server/Routed
https://www.secure-computing.net/wiki/index.php/FreeBSD_OpenVPN_Server/Routed

OpenVPN with FreeBSD 6.x 7.x
http://www.isgsp.net/freebsd/freebsd-openvpn.html
[自分用メモ] FreeBSDマシンにOpenVPNをインストールしてVPNサーバを構築した ~ サーバ設定編
http://ultrah.zura.org/?p=3510

OpenVPN のインストール

インストールそのものは、いつもの portupgrade で行いました。
# cd /usr/ports
# portupgrade -N security/openvpn
OpenVPN のビルド設定画面

以下の二つの ports が依存関係で自動的にインストールされました。
  • security/easy-rsa
  • archivers/lzo2

久々に ports によるインストール後に設定ファイルを置くディレクトリを作るなど、昔ながらの FreeBSD 流儀?の ports に驚かされたというか?喜びの声(笑)を挙げました。

設定ファイルの作成

どうも世間一般には /usr/local/etc/openvpn のディレクトリを作って、ここに設定ファイルを設置するのが主流のようです。FreeBSD の自由度の高さを謳うことよりも、もうここまで ports でやってもらって構わないのですが・・・。
# mkdir /usr/local/etc/openvpn

ここへ openvpn の設定ファイルをサンプルからコピーして設置します。参考にしたウェブサイトとは ports が新しいためかサンプルのディレクトリが異なっていました。
# cp /usr/local/share/examples/openvpn/sample-config-files/server.conf /usr/local/etc/openvpn/openvpn.conf

設定ファイルの編集は DD-WRT の時のものを参考にしました。事前に openvpn を設定していると、このような設定ファイルを操作するのも楽勝です。以下は設定事例です。

------------ openvpn.conf --------------
port 1194
proto udp
dev tun

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

server 192.168.66.0 255.255.255.0

keepalive 10 120
# client-to-client
comp-lzo

# user nobody
# group nobody

persist-key
persist-tun

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

push "route 192.168.24.0 255.255.255.0"
push "redirect-gateway def1"
push "dhcp-option DNS 192.168.24.100"
push "dhcp-option DOMAIN example.com"
------------ openvpn.conf --------------
ここで設定ファイル(openvpn.conf)に記述した動作状況ファイル(openvpn-status.log)のためのディレクトリを作成しておきます。
# mkdir /var/openvpn
なおログファイル(openvpn.log)は、一般的なログファイルを保存する /var/log に指定してあります。

ついでにログファイルは過去のデータをどんどん蓄積してしまうので、適当なところでログ・ローテーションをしてもらうように /etc/newsyslog.conf に登録しておきます。以下の一行を最後尾へ追加しました。

/var/log/openvpn.log     600  7     100  *     JC


証明書の作成

easy-rsa の雛形があるディレクトリへ移動して作業をします。必要であれば作業ディレクトリの内容を作業前にコピーして保管しておくことをお奨めします。
# cd /usr/local/share/easy-rsa

ここで設定ファイルの vars を編集します。これは上記の参考ウェブサイトを参照しながら編集しました。
# ee vars

一連のビルド作業では FreeBSD で一般に使用されている tcsh シェルでは動作しないため sh シェルで操作します。
# sh
# . ./vars
# . ./clean-all
# . ./build-ca

サーバ鍵の作成
# ./build-key-server server
# ./build-dh

クライアント鍵
# ./build-key client1

作業が終了したら sh シェルから抜けます。
# exit

作成された証明書や鍵などは /usr/local/share/easy-rsa/keys へ保存されています。この keys ディレクトリを openvpn の設定ファイルディレクトリへコピーします。
#  cp -Rp /usr/local/share/easy-rsa/keys /usr/local/etc/openvpn/.


起動ファイルの設定

サーバ起動時に openvpn も自動で起動するように /etc/rc.conf へ設定を追加します。
# ee /etc/rc.conf

以下の三行を追加しました。
# OpenVPN Server
openvpn_enable="YES"
openvpn_configfile="/usr/local/etc/openvpn/openvpn.conf"
gateway_enable="YES"

以上でインストールは終了です。手動で openvpn を起動させてみます。
# /usr/local/etc/rc.d/openvpn start
なお停止の時には stop 、設定ファイル変更で再起動の時には restart で操作します。

これでログファイル(/var/log/openvpn.log)や動作状態ファイル(/var/openvpn/openvpn-status.log)の様子を観察して問題点を洗い出します。



関連して修正(DNS の見直し)

今回 DD-WRT の時から気になっていた 名前の解決 が上手く動作しないことがある点を見直しました。

この OpenVPN をインストールしたサーバには DNS の動作をする BIND9 がシステムに元々組み込まれています。この BIND9 を利用して、家庭内 LAN 内のドメインの名前の解決を行なっています。この家庭内 LAN の独自のドメイン名の名前の解決が出来ない場合がありました。原因が BIND9 の設定ファイル(/etc/namedb/named.conf)にありました。

最近何かと話題となっている DNS アンプ攻撃にも関連する項目も修正が加わるだけに、注意をしながら設定を変更しました。具体的には named.conf の option の以下の二点を変更しました。


  • allow-recursion の項目追加
allow-recursion { 127.0.0.1; 192.168.24.0/24; 192.168.66.0/24; };
  • listen-on の修正
listen-on       { 127.0.0.1; 192.168.24.0/24; 192.168.66.0/24; };
OpenVPN で使用する仮想 LAN の部分のアドレス領域を追加しました。

以上で OpenVPN 経由でも名前の解決が正常に行えるようになりました。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。