>お楽しみコーナー>Linux>openVPN サイトマップ 最終更新日:2005/07/22

センリュウのホームページへ ようこそ!

 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 作成