センリュウのホームページへ ようこそ!
VPN(仮想LAN)システム openVPN
インターネットで仮想LAN構築ということですが、ここでは、OpenVPNを使ってVPNの構築をやってみます。
また、プラットフォームにはFedoraCore3を使いました。
openVPNは、Ver2.0よりpeer-peerモード(1対1)のほかにマルチ・モード(1対多)が可能になっています。
ここでは、マルチ・モードを目指します。
また、ブリッジで社内LANと接続できるようにします。
必要なもの
・OpenSSL 最近のLinuxディストリビューションであれば、たぶん標準でインストールされていると思います。
・LZO圧縮(リアルタイムでデータを圧縮・展開)を使う場合は、LZOライブラリもインストールします。
ここでは省略。
・TUN/TAPデバイス
TUN/TAPデバイスがカーネルモジュールとしてインストールされていれば(/dev/net/tun)、カーネルの再構築は必要はありません。
# modprobe tun
として、エラーが出なければ大丈夫です。FedoraCore3の場合は、OKです。
# modprobe tun 自身の実行は、openvpnの起動スクリプトで自動的になされるようになっているので、通常はあえて実行する必要はありません。
tap/tunの違いは、tun=レイヤ3トンネル、tap=レイヤ2トンネルです。
OpenVPN(openvpn-2.0_rc17)のインストール
http://openvpn.net/からSouce(Tarball)をダウンロード。
解凍したらINSTALLファイルを見ておく。
# ./configure --disable-lzo
# make
# make install
解凍した/sample-scriptsディレクトリにあるopenvpn.initをopenvpn名で/etc/rc.d/init.d/にコピー。
さらに、サービス画面を出し、「サービスの追加」でopenvpnを追加しておく。
openvpn.initの内容を確認すると、modprobe tunや/etc/openvpnなどが書き込まれている。
/etc/openvpnディレクトリを作りここに、解凍した/sample-config-filesディレクトリにあるsever.confを適当な名称(test.conf)でコピーする。
設定 マルチ・モード(1対多接続)
マルチ・モードでは
・tapを使用する。
・事前共有鍵は使えず、秘密鍵や証明書が必要になる。
・クライアントの仮想IPアドレスは、DHCPのように自動的に割り当てられる。
ここでは仮想アドレスとして、サーバーには172.16.0.1、クライアントには172.16.0.100〜を割り当てるようにしました。
/etc/openvpn/test.confファイル
port 1194
dev tap0
server-bridge 172.16.0.1 255.255.255.0 172.16.0.100 172.16.0.254
ブリッジデバイスに172.16.0.1/255.255.255.0を設定し、172.16.0.100〜254の範囲でクライアントに仮想IPアドレスを自動的に割り当てる。
tls-server TLSサーバーの宣言
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
inactive 600 応答がなくなってからクライアントを削除するまでの時間
user nobody
group nobody
push "dhcp-option DNS 172.16.0.1" pushはクライアントに設定を送り出す(クライアントはpullで受け取る)
push "dhcp-option WINS 172.16.0.1"
verb 3
キーの準備
CA秘密キーとCA証明書の作成
# cd /etc/openvpn
# openssl req -nodes -new -x509 -keyout ca.key -out ca.crt -days 3650
CA署名に向けたopensslの準備
/usr/share/ssl/openssl.cnfの編集
[ CA_default ]セクション(ゴシック部分を変更)
dir = /etc/openvpn
certs = $dir/certs
crl_dir = $dir/crl
database = $dir/index.txt
new_certs_dir = $dir
certificate = $dir/ca.crt
serial = $dir/serial
crl = $dir/crl.pem
private_key = $dir/ca.key
RANDFILE = $dir/private/.rand
x509_extensions = usr_cert
name_opt = ca_default
cert_opt = ca_default
default_days = 3650
default_crl_days = 30
default_md = md5
preserve = no
policy = policy_match
sirialとindex.txtファイルを作っておく。
# echo 01 > serial
# touch index.txt
ホスト・キーの作成とそのCA署名(上で作ったCAキーで署名する)
# openssl req -nodes -new -keyout server.key -out server.csr
最後の「A Challenge password」と「 An optinal company mname」は入力しない(CA作成時に指定していない)。
# openssl ca -out server.crt -in server.csr
Diffie-Hellmanのパラメーター作成
# openssl dhparam -out dh1024.pem 1024
ファイアウォールの設定
iptables -A INPUT -p udp --dport 1194 -j ACCEPT
iptables -A OUTPUT -p udp --dport 1194 -j ACCEPT
ブリッジ
ブリッジ(tap0とeth1をブリッジしてbr0にする)の設定をすることでVPNクライアントは、社内LANに接続できるようになる。
接続→ eth0:***.***.***.*** eth1:192.168.0.1(これはなくなる)
VPNクライアント ――――――――― openVPNサーバー ―――― 内部PC
172.16.0.100〜254(DHCP) ←付与 172.16.0.1 172.16.0.2〜99
解凍した/sample-scriptsディレクトリにあるbridge-startとbridge-stopを/etc/openvpn/にコピーして、システムに合わせて編集する。
/etv/openvpn/bridge-startの編集
#!/bin/bash
br="br0"
tap="tap0"
eth="eth1"
eth_ip="172.16.0.1"
eth_netmask="255.255.255.0"
eth_broadcast="172.16.0.255"
………………………
sleep 5
/etc/rc.d/init.d/openvpn start
sleep 5
/sbin/iptables -A INPUT -i $br -j ACCEPT
/sbin/iptables -A FORWARD -i $br -o eth0 -j ACCEPT
( /sbin/iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to ***.***.***.***
) これがないときは入れておく
/etv/openvpn/bridge-stopの編集
#!/bin/bash
(POSTROUTINGを入れた時ははずしておく)
/sbin/iptables -D FORWARD -i br0 -j ACCEPT
/sbin/iptables -D INPUT -i $br -j ACCEPT
/etc/rc.d/init.d/openvpn stop
sleep 5
br="br0"
tap="tap0"
………………………
sleep 5
/etc/rc.d/init.d/network restart
起動は普通、bridge-start→openvpnの順になる。停止はopenvpn→bridge-stopの順となる。
ここではすべてbridge-startとbridge-stopに組み込んだので、起動はbridge-start、停止はbridge-stopだけでよい。
また、openvpnはPC起動時に自動起動しないようにしておく。
図の例は、内部PC(192.168.0.*)がつながっているeth1とtap0をブリッジするようになっているが、この場合、ブリッジのゾーンが172.16.0.になるため、内部PCのIPアドレスを192.168.0.*から172.16.0.2〜99に変更しておかなければない。いずれにせよ、全体の設定を最初から計画的に決めておく必要があるだろう。
iptablesの注意点
すでにopenvpnサーバー側でwin関連のFORWARDを全面的に禁止している場合は、br0に関してはこれを解除するようにしておかなくてはならない。またはFORWARDするインターフェイスを限定するようにする(vpnクライアント側はそのままでかまわない)。
クライアント
ここでは、windowsマシンを想定します。
マルチ・モードではNAT越えもOKなので、どこからでも接続できます。
openVPNのインストール
openvpn-2.0_rc17-install.exeをダウンロード。これを実行するとインストールされる。
/Program Files/OpenVPN/sample-config/client.opvnを/Program Files/OpenVPN/config/にコピー。
/Program Files/OpenVPN/config/client.opvnの編集
port 1194
dev tap
remote ***.***.***.*** サーバーのアドレスを記入
tls-client
ca ca.crt
cert client1.crt
key client1.key
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
pull サーバーからのパラメータを引き受ける
float IPアドレスはサーバーからもらう
verb 3
クライアントの接続用のバッチファイルの作成
/Program Files/OpenVPN/bin/openvpn-start.bat
cd C:\Program Files\OpenVPN\config
..\bin\openvpn.exe --config client.opvn
キーの準備
/Program Files/OpenVPN/configフォルダに置くようにする。
証明付き公開キーは上と同じものを使う。
ホスト・キーと署名(サーバー側で作成してやるとよい)
# openssl req -nodes -new -keyout client1.key -out client1.csr
# openssl ca -out client1.crt -in client1.csr
dh1024.pemは、クライアントには不要。
接続とテスト
サーバー
起動は/etc/openvpn/bridge-start、停止は/etc/openvpn/bridge-startbridge-stop。
また、openvpnはPC起動時に自動起動しないようにしておく。
クライアント
/Program Files/OpenVPN/bin/openvpn-start.batを起動。停止はF4キー。
あとは、pingなどで互いに接続できるかテストしてみてください。
履歴 2005/05 更新
2005/04 作成