Back to page

− Links

 Print 

Backup diff of Gentoo Linuxな生活​/OpenVPNで悩む vs current(No. 1) :: Nest Of Hawk

Backup diff of xpwiki:Gentoo Linuxな生活/OpenVPNで悩む vs current(No. 1)

  Next »[4]
1: 2010-03-07 (Sun) 23:36:48 maruo[5] source[6] Cur: 2010-07-05 (Mon) 00:13:21 maruo[5] source[7]
Line 2: Line 2:
[[OpenVPN:http://www.openvpn.jp/]]は、インターネットやLAN上に仮想的なプライベートネットワーク(VPN)を構築するためのソフトウェアです。 [[OpenVPN:http://www.openvpn.jp/]]は、インターネットやLAN上に仮想的なプライベートネットワーク(VPN)を構築するためのソフトウェアです。
VPNを構築することにより、インターネット上であってもデータを安全にやり取りしたり、社外から社内のサーバーにアクセスできるようにすることもできます。オープンソースで、SSL/TLSをベースにした認証機構及び通信路暗号化を用いることで、セキュアに通信路を構築することが可能です。ん~、便利。 VPNを構築することにより、インターネット上であってもデータを安全にやり取りしたり、社外から社内のサーバーにアクセスできるようにすることもできます。オープンソースで、SSL/TLSをベースにした認証機構及び通信路暗号化を用いることで、セキュアに通信路を構築することが可能です。ん~、便利。
-ちなみに、OpenVPNでは、SSL/TLSトンネルをサーバ/クライアント間で接続して通信します。トンネルについての解説は、[[こちら>自宅鯖計画/トンネル接続って何だべ?]]を見てくださいね♪+ちなみに、OpenVPNでは、SSL/TLSトンネルをサーバ/クライアント間で接続して通信します。トンネルについての解説は、[[トンネル接続って何だべ?の記事>自宅鯖計画/トンネル接続って何だべ?]]を見てくださいね♪ 
 + 
 +*OpenVPNをインストールしてみよう [#rbce4c45] 
 +**サーバ側 [#yc5d946a] 
 +サーバ側には24時間稼働している、Linuxサーバ君にインストールします。 
 + # emerge -vuD openvpn 
 +おしまい。 
 +**クライアント側 [#v7b79b03] 
 +クライアントにLinuxを使用する場合は、サーバと一緒。今回は、Windowsを使用するので、[[OpenVPN GUI for Windows 日本語版:http://www.openvpn.jp/bridging/5.html]]を使用します。インストール手順は[[こちら:http://www.openvpn.jp/guiuse.html]]でね。 
 +*暗号鍵を作成 [#y9606253] 
 +OpenVPNインストール時、大体/usr/share/openvpn等のどこかに、easy-rsaというフォルダがあります。この中に、暗号鍵作成ツールが入っております。そのフォルダ内で、ツールを実行! 
 +**CA局を作成 [#naf18717] 
 + # source ./vars 
 + # clean-all 
 + # build-ca 
 + Generating a 1024 bit RSA private key 
 + ............++++++ 
 + ...........++++++ 
 + writing new private key to 'ca.key' 
 + ----- 
 + You are about to be asked to enter information that will be incorporated 
 + into your certificate request. 
 + What you are about to enter is what is called a Distinguished Name or a DN. 
 + There are quite a few fields but you can leave some blank 
 + For some fields there will be a default value, 
 + If you enter '.', the field will be left blank. 
 + ----- 
 + Country Name (2 letter code) [KG]: 
 + State or Province Name (full name) [NA]: 
 + Locality Name (eg, city) [BISHKEK]: 
 + Organization Name (eg, company) [OpenVPN-TEST]: 
 + Organizational Unit Name (eg, section) []: 
 + Common Name (eg, your name or your server's hostname) []:OpenVPN-CA 
 + Email Address [me@myhost.mydomain]: 
 +なんでも、好きなもの、識別できるものを入れておくとよいでしょう~ 
 +**サーバ暗号鍵の作成 [#t6a2d753] 
 +続いて、サーバ暗号鍵を作成します。 
 + # build-key-server server 
 +CA局と同じように聞かれていきますが、識別可能な奴を入れていってくださいね。んで、「Sign the certificate?(証明書に署名しますか?) [y/n]」と「1 out of 1 certificate requests certified, commit?(1つの証明書要求がありますが、コミットしますか?) [y/n]」という2つの質問が出ますが、両方にYesと答えてやって。 
 +**クライアント暗号鍵の作成 [#vd6c624e] 
 +クライアント鍵の作成は、 
 + # build-key クライアント名 
 +暗号鍵をパスワード保護したい場合は、 
 + # build-key-pass クライアント名 
 +同じようにいろいろ聞かれますが、同じように識別可能な奴を入れていってやって…で、これは接続したいクライアント数分、クライアント名を変更してコマンドを実施します。 
 +**Diffie hellmanパラメータ作成 [#g9b2984e] 
 + # build-dh 
 +少々お待ちくださいね… 
 +**TLSのHMAC認証用共有鍵作成 [#h77443fa] 
 +別に作成しなくてもよいのですが、後で述べる[[暗号強度を強める設定>Gentoo Linuxな生活/OpenVPNで悩む#r6a3b622]]を行う場合は、共有鍵を作成します。 
 + openvpn --genkey --secret ta.key 
 + 
 +**鍵をコピー [#q123c922] 
 +そうすると、keysサブディレクトリ配下に、以下があるはず。 
 + ca.crt 
 + ca.key 
 + dh1024.pem 
 + クライアント名.crt 
 + クライアント名.csr 
 + クライアント名.key 
 + server.crt 
 + server.csr 
 + server.key 
 + ta.key 
 +で、これらのうち、ca.crt(CA証明書),クライアント名.crt,クライアント名.csr(クライアント証明書),クライアント名.key(クライアント秘密鍵),ta.key(HMAC認証用共有鍵)をコピーして、Windows側に持ってってあげます。くれぐれも、漏えいしたりしないように気をつけつつ… 
 +*OpenVPNを設定してみよう(共通設定) [#tffcb460] 
 +OpenVPNは、TUN/TAPの2種類の設定モードがありますが、まずは共通で設定できるものからね。 
 +**サーバ側 [#aa7ab458] 
 +/usr/share/doc/openvpn-XXX/examples/sample-config-files/ディレクトリに、設定ファイルのサンプルがあります。こちらを利用しましょう。 
 +サーバ側ですので、この下にあるserver.conf.bz2を、/etc/openvpn配下に、openvpn.confという名称で、解凍&コピーします。この中で、特に必要な項目を… 
 +:port|openvpnで通信するポートを指定します(クライアント側と合わせる) 
 +:proto|tcpか、udpかを指定します。(クライアント側と合わせる) 
 +:ca|[[ここの暗号鍵作成>Gentoo Linuxな生活/OpenVPNで悩む#y9606253]]で作成する、ca.crtを指定します。フルパスで書くのが安心。 
 +:cert|[[ここの暗号鍵作成>Gentoo Linuxな生活/OpenVPNで悩む#y9606253]]で作成する、server.crtを指定します。フルパスで書くのが安心。 
 +:key|[[ここの暗号鍵作成>Gentoo Linuxな生活/OpenVPNで悩む#y9606253]]で作成する、server.keyを設定します。フルパスで書くのが安心。 
 +:dh|[[ここの暗号鍵作成>Gentoo Linuxな生活/OpenVPNで悩む#y9606253]]で作成する、dh1024.pemを設定します。 
 + 
 +:push|接続してきたクライアントに自動設定するパラメータを指定する。例えばルーティングテーブル。接続してできたデバイスに対して、通信先NWのルーティング(上の例なら172.21.0.0/16向けのルーティング)を設定するとか、クライアントに参照させたいDNSサーバのアドレスとか。 
 + 
 +**クライアント側 [#l2cb0b98] 
 +Windowsだと、c:\Program Files(64ビット版の場合は、c:\Program Files (x86))\OpenVPN\sample-configに、サンプル設定ファイルがあります。この中のclient.ovpnをコピーして、c:\Program Files(64ビット版の場合は、c:\Program Files (x86))\OpenVPN\configに置きます。そしてこのファイルを編集しますが…注意!Windows7や、Windows Vistaは、管理者モードでないと変更セーブされませんので…気をつけてね。私は、個人のフォルダにコピーして、変更してからconfigフォルダに管理者モードでコピーしました。 
 +:proto|tcpか、udpかを指定します。(サーバ側と合わせる) 
 +:remote|接続先のサーバ名と、ポート(サーバ側のport項で指定した値)を指定する。 
 +:ca|[[ここの暗号鍵作成>Gentoo Linuxな生活/OpenVPNで悩む#y9606253]]で作成する、ca.crtを指定します。フルパスで書くのが安心。Windowsは、ファイルパスに\を使用しますが、OpenVPNは、\の指定は\\ですので、注意。 
 +:cert|[[ここの暗号鍵作成>Gentoo Linuxな生活/OpenVPNで悩む#y9606253]]で作成する、クライアント名.crtを指定します。フルパスで書くのが安心。Windowsは、ファイルパスに\を使用しますが、OpenVPNは、\の指定は\\ですので、注意。 
 +:key|[[ここの暗号鍵作成>Gentoo Linuxな生活/OpenVPNで悩む#y9606253]]で作成する、クライアント名.keyを設定します。フルパスで書くのが安心。 
 +Windowsは、ファイルパスに\を使用しますが、OpenVPNは、\の指定は\\ですので、注意。 
 +**ブロードバンドルータ側の設定 [#ef9f4faa] 
 +普通は、ブロードバンドルータで、ポートを閉じていると思います。ブロードバンドルータ側で、openvpnを受け付けているプロトコル、ポートを、openvpnサーバ側に向けてあげる変換テーブルを設定してあげましょう。 
 +**Linuxサーバの設定 [#j3c08a4b] 
 +***Sysctl [#bc5bca59] 
 +Sysctlの、ip_forwardをONにします。 
 + # echo "1" > /proc/sys/net/ipv4/ip_forward 
 + 
 +*OpenVPNを設定してみよう(TUNモード) [#gcb1e883] 
 +#ref(TUN.jpg,around,right) 
 +TUNモードは、ルーティングモードです。VPNのネットワークは、通信する先のネットワークとは別のサブネットマスクになります。OpenVPNの設定は楽なんだけど、ルーティングの設定が難しいんだよね… 
 +#clear 
 +**サーバ側 [#ubdd8bbb] 
 +先ほどのopenvpn.confの項目で、以下の項目を設定するですよ。 
 +:dev|tunを指定します。 
 +:server|サーバモードで設定する、openvpn空間でのネットワークアドレスを指定します。通信先ネットワーク内で使用しているIPとは、かぶらないIPアドレスにする。例えば、通信先のNW空間が、仮に172.21.0.0/16ならば、openvpn空間のNWは、172.22.0.0/16とかね。 
 +**クライアント側 [#ebfbd9a9] 
 +先ほどのclient.ovpnの、以下の項目を編集します。 
 +:dev|tunを指定します。 
 + 
 +**その他の設定 [#zecd28f8] 
 +***iptables等 [#n39f0623] 
 +iptablesを指定している場合は、openvpn用のNWアドレスを通過する設定をしないといけません 
 +***各種サーバ [#r9e58f78] 
 +openvpn用のNWアドレスからのリクエストを受け付けるようにしましょう 
 +***ブロードバンドルータ等 [#deab2c18] 
 +基本は、デフォルトゲートウェイにブロードバンドルータを指定している事でしょう。このデフォルトゲートウェイに、OpenVPNクライアントのアドレスはOpenVPNサーバにルーティングしてあげるルーティングテーブルを追加します。 
 + 
 +*OpenVPNを設定してみよう(TAPモード) [#l984cd92] 
 +#ref(TAP.jpg,around,right) 
 +TAPモードは、アクセス先ネットワークとクライアントが同じサブネットとなります。TAPインタフェースの設定がめんどくさいんだけど、ルーティングなんかは設定しなくていいから楽なんだよね。ただ、アクセスコントロールをしたいときは難しいですわ。 
 + 
 +こちらで設定した場合の方が、NW通信は早いみたい。 
 + 
 +#clear 
 + 
 +**サーバ側 [#aa08ed07] 
 +:dev|tap指定ね。特に、TAPデバイスを作成している場合は、そのままデバイス名(例えばtap0等)を指定すると良い 
 +:server-bridge|TAPの場合はこちら。ブリッジIFのアドレス、ネットマスク、クライアントに付与するアドレスの範囲を指定。ちなみに、何もオプションを指定しない場合は、DHCPProxyモードになります。向こう側のネットワークにDHCPサーバとかいる場合は、そちらのDHCPにNW設定をお任せできます。 
 + 
 +**クライアント側 [#f5343d4c] 
 +:dev|tap指定ね。 
 +**OpenVPNのサーバ [#c272a946] 
 +ブリッジ設定を追加してやります。 
 +***bridge-utilsのインストール [#t84c78b8] 
 + emerge bridge-utils 
 +***ブリッジインタフェースを作成する [#o6c2ed73] 
 +/etc/conf.d/netをこんな感じで設定。 
 + config_br0=("br0に振るIPアドレス") 
 + routes_br0=( 
 +       "default via ゲートウェイアドレス" 
 + ) 
 + #eth0にはアドレス付与しない 
 + config_eth0=( "null" ) 
 + #tap0はTAPモードで動かす 
 + tuntap_tap0="tap" 
 + #tap0にはアドレス付与しない 
 + config_tap0=("null") 
 + #eth0とtap0をブリッジする 
 + bridge_br0="eth0 tap0" 
 + #net.eth0とnet.tap0を実行してからbr0を動かす 
 + #また、NW設定の一番頭で動かす。 
 + depend_br0() { 
 +   need net.eth0 net.tap0 
 +   before net 
 + } 
 +さらに、/etc/init.dに移って 
 + ln -sfn net.lo net.br0 
 + ln -sfn net.lo net.tap0 
 +さらにさらに、初期設定で自動起動するように、 
 + rc-update add net.br0 default 
 + 
 +*接続確認 [#c07b1bf1] 
 +サーバ側で、openvpnを起動してみます。 
 + # /etc/init.d/openvpn start 
 +クライアント側で、openvpnクライアントを起動してみましょう。ちなみに、私はブロードバンドルータの外側から接続を試してみてます。うちのプロバイダは、DHCPでクライアントへのアドレス払い出しが5つまでOKなので♪でないと試験の意味がないからね。openvpnGUIのコンテキストメニューから、『接続』を選択。さて、うまくコネクトできるでしょうか…クライアント側でログが出ますから、確認できるでしょう…ちなみに、私は、protoをTCPにしないとだめでした。ブロードバンドルーターとかいろいろあるのかしら… 
 + 
 +*もう一工夫 [#z3477833] 
 + 
 +**暗号化強度を上げてみる [#r6a3b622] 
 +***OpenVPNの設定 [#lf755405] 
 +OpenVPNの設定で、以下を追加すると、暗号強度が増しますよ。 
 +:tls-auth|TLSによる暗号化をプラスする場合、使用する。暗号強度が上がる。[[ここの暗号鍵作成>Gentoo Linuxな生活/OpenVPNで悩む#y9606253]]で作成する、ta.keyを書いて、第2パラメータに0を指定。サーバで指定したら、クライアント側にも必要 
 +:cipher|暗号化アルゴリズムを指定します。サーバ、クライアントにて設定を合わせます 
 +:user,group|Windowsではない場合、openvpnが動作するユーザ、グループ権限が指定できる。root以外にすれば、セキュリティは向上するよね。 
 +***鍵長を変えてみる [#scca189d] 
 +/usr/share/openvpn/easy-rsaの下に、varsというファイルがあります。こいつの 
 + export KEY_SIZE=2048 
 +にすると、2048bitの鍵長になり、SSLキー自体の暗号強度が上がりますよ。デフォルトは1024bit長ね 
 + 
 +**SSL等とポートを共有する [#x83a0432] 
 +例えば、apacheサーバ等の暗号化ポート(https:443番)を、OpenVPN用ポートと共有するってことを考えてみます。 
 +***apache側 [#y1caed41] 
 +SSL等のListenポートをずらしてやります。apacheの設定ファイルを開いて 
 + #Listen 443 
 + Listen 444 
 +  
 + #<VirtualHost _default_:443> 
 + <VirtualHost _default_:444> 
 +等ね。で、再起動 
 + 
 +***OpenVPN側 [#dc29ad6e] 
 +port-shareってオプションを使用します。これを行うと、httpのプロトコルを、shareしたアドレス、ポートに転送してくれます。サーバ側のopenvpn.confを開いて 
 + 
 + port 443 
 + port-share 127.0.0.1 444 
 + 
 +として再起動。 
 +こうすると、httpは127.0.0.1のポート444に転送してくれて、VPN接続も443で実行できるってわけです。便利ねー 
 + 
 +**通信速度の高速化 [#v1fac745] 
 +***通信パケットの圧縮 [#y0196690] 
 +通信時に、データパケットを通信元で圧縮し、通信先で解凍すると、通信回線の速さよりもCPUが勝っていれば、通信速度が向上します。 
 +クライアント、サーバ側にcomp-lzoオプションを追加してやって。 
 +***インタフェースのMTU長 [#pf891575] 
 +MTU長とは、IPパケット上に載せられるデータサイズの事。ふつーのEthernetは、1500バイトです。これを超えたデータを転送しようとするとパケットを分割しようとします。これをフラグメントと言いますが、ものすごく転送速度が落ちます。 
 + 
 +さて、このVPN、IPトンネルを使用します。IPトンネルもEthernetと同じくデバイスに見えます。このデバイスに入ったパケットは、IPヘッダをつけて、さらにEthernetの1500バイトのIPデータに変換されます。分かりました?IPトンネルは、余計にくっつけるヘッダサイズ分、MTU長が小さくなるのです。なので、これを調整してやると、飛躍的に転送速度が上がります。 
 + tun-mtu 1280 
 + mssfix 1280 
 + fragment 1280 
 +こんなオプションを、サーバ側、クライアント側の設定ファイルに追加すると…うちでは転送速度が2倍に向上したよ。fragmentはproto udpの時のみ有効です~。 
 + 
 +ゲートウェイのブロードバンドルータレベルで、約100Mbyteほどの転送速度。で、設定前と設定後で、100Mbyte程度のデータをVPN経由して転送してみました。 
 +:設定前|2.5Mbyte/sec=約20Mbps 
 +:設定後|5.2Mbyte/sec=約41Mbps 
 +:さらにTAPモードにすると|6.9Mbyte/sec=約55Mbps 
 +これは劇的な変化でしょ!!TAPモードにするとルーティングしない分、さらに早いみたいです。 
 + 
 +**BitLocker to Go [#j8f352de] 
 +Windows側のVPNクライアントを見ていると、USBのアクセスキーを差し込まないとVPN接続できないようなもの、ありますよね。あれにチャレンジしてみます。 
 + 
 +うちのdv3500君は、SDカードスロットを持っています。うちに1GbyteのSDカードがありました。こいつを暗号化して、これにさっきのクライアント暗号化キーをぶっこんでおけば…そいつがないとVPN接続できないし、安心ですね。~ 
 +Windows7 Ultimateには、BitLockerというドライブ暗号化ツールが入っています。コントロールパネルから、BitLockerドライブ暗号化を選択します。SDカードを差し込むと、BitLocker to Goというメニューが出てきます。こいつでTPMデバイスを使用しない、パスワード認証を選択すると、SDカード差し込み時にパスワードを問い合わせてくる暗号化ドライブになります。これを選択。暗号化。 
 + 
 +そして、出来上がった暗号化ドライブに、暗号キーを放り込んで、クライアント側OpenVPNのコンフィグファイルに、キーのパス(SDカードドライブを含むフルパス)を記述しておきます。こーすると、アクセスの手順がこうなります。 
 + 
 ++SDカードスロットに暗号キーを差し込む 
 ++SD暗号キーのパスワード認証(BitLocker側) 
 ++OpenVPN GUIで『接続』を選択 
 ++クライアント暗号キーのパスフレーズ入力(パスフレーズ付きのクライアントキー認証) 
 ++サーバと接続確立 
 ++あとはおうちで使用するのと同じように、サーバにSSHやら、共有ドライブアクセスやら、IMAP使用したりできる 
 + 
 +うっふっふ♪こいつぁ便利な上に、SDカードとセットでないとアクセスできない。SDキーをなくしても、暗号化されている上に何のキーかわからないから、安心ってわけね。
  Next »[4]