OpenVPNとは anchor.png

OpenVPNは、インターネットやLAN上に仮想的なプライベートネットワーク(VPN)を構築するためのソフトウェアです。 VPNを構築することにより、インターネット上であってもデータを安全にやり取りしたり、社外から社内のサーバーにアクセスできるようにすることもできます。オープンソースで、SSL/TLSをベースにした認証機構及び通信路暗号化を用いることで、セキュアに通信路を構築することが可能です。ん~、便利。 ちなみに、OpenVPNでは、SSL/TLSトンネルをサーバ/クライアント間で接続して通信します。トンネルについての解説は、トンネル接続って何だべ?の記事を見てくださいね♪

Page Top

OpenVPNをインストールしてみよう anchor.png

Page Top

サーバ側 anchor.png

サーバ側には24時間稼働している、Linuxサーバ君にインストールします。

# emerge -vuD openvpn

おしまい。

Page Top

クライアント側 anchor.png

クライアントにLinuxを使用する場合は、サーバと一緒。今回は、Windowsを使用するので、OpenVPN GUI for Windows 日本語版を使用します。インストール手順はこちらでね。

Page Top

暗号鍵を作成 anchor.png

OpenVPNインストール時、大体/usr/share/openvpn等のどこかに、easy-rsaというフォルダがあります。この中に、暗号鍵作成ツールが入っております。そのフォルダ内で、ツールを実行!

Page Top

CA局を作成 anchor.png

# 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]:

なんでも、好きなもの、識別できるものを入れておくとよいでしょう

Page Top

サーバ暗号鍵の作成 anchor.png

続いて、サーバ暗号鍵を作成します。

# build-key-server server

CA局と同じように聞かれていきますが、識別可能な奴を入れていってくださいね。んで、「Sign the certificate?(証明書に署名しますか?) [y/n]」と「1 out of 1 certificate requests certified, commit?(1つの証明書要求がありますが、コミットしますか?) [y/n]」という2つの質問が出ますが、両方にYesと答えてやって。

Page Top

クライアント暗号鍵の作成 anchor.png

クライアント鍵の作成は、

# build-key クライアント名

暗号鍵をパスワード保護したい場合は、

# build-key-pass クライアント名

同じようにいろいろ聞かれますが、同じように識別可能な奴を入れていってやって…で、これは接続したいクライアント数分、クライアント名を変更してコマンドを実施します。

Page Top

Diffie hellmanパラメータ作成 anchor.png

# build-dh

少々お待ちくださいね…

Page Top

TLSのHMAC認証用共有鍵作成 anchor.png

別に作成しなくてもよいのですが、後で述べる暗号強度を強める設定を行う場合は、共有鍵を作成します。

openvpn --genkey --secret ta.key
Page Top

鍵をコピー anchor.png

そうすると、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側に持ってってあげます。くれぐれも、漏えいしたりしないように気をつけつつ…

Page Top

OpenVPNを設定してみよう(共通設定) anchor.png

OpenVPNは、TUN/TAPの2種類の設定モードがありますが、まずは共通で設定できるものからね。

Page Top

サーバ側 anchor.png

/usr/share/doc/openvpn-XXX/examples/sample-config-files/ディレクトリに、設定ファイルのサンプルがあります。こちらを利用しましょう。 サーバ側ですので、この下にあるserver.conf.bz2を、/etc/openvpn配下に、openvpn.confという名称で、解凍&コピーします。この中で、特に必要な項目を…

port
openvpnで通信するポートを指定します(クライアント側と合わせる)
proto
tcpか、udpかを指定します。(クライアント側と合わせる)
ca
ここの暗号鍵作成で作成する、ca.crtを指定します。フルパスで書くのが安心。
cert
ここの暗号鍵作成で作成する、server.crtを指定します。フルパスで書くのが安心。
key
ここの暗号鍵作成で作成する、server.keyを設定します。フルパスで書くのが安心。
dh
ここの暗号鍵作成で作成する、dh1024.pemを設定します。
push
接続してきたクライアントに自動設定するパラメータを指定する。例えばルーティングテーブル。接続してできたデバイスに対して、通信先NWのルーティング(上の例なら172.21.0.0/16向けのルーティング)を設定するとか、クライアントに参照させたいDNSサーバのアドレスとか。
Page Top

クライアント側 anchor.png

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
ここの暗号鍵作成で作成する、ca.crtを指定します。フルパスで書くのが安心。Windowsは、ファイルパスに\を使用しますが、OpenVPNは、\の指定は\\ですので、注意。
cert
ここの暗号鍵作成で作成する、クライアント名.crtを指定します。フルパスで書くのが安心。Windowsは、ファイルパスに\を使用しますが、OpenVPNは、\の指定は\\ですので、注意。
key
ここの暗号鍵作成で作成する、クライアント名.keyを設定します。フルパスで書くのが安心。 Windowsは、ファイルパスに\を使用しますが、OpenVPNは、\の指定は\\ですので、注意。
Page Top

ブロードバンドルータ側の設定 anchor.png

普通は、ブロードバンドルータで、ポートを閉じていると思います。ブロードバンドルータ側で、openvpnを受け付けているプロトコル、ポートを、openvpnサーバ側に向けてあげる変換テーブルを設定してあげましょう。

Page Top

Linuxサーバの設定 anchor.png

Page Top

Sysctl anchor.png

Sysctlの、ip_forwardをONにします。

# echo "1" > /proc/sys/net/ipv4/ip_forward
Page Top

OpenVPNを設定してみよう(TUNモード) anchor.png

TUN.jpg

TUNモードは、ルーティングモードです。VPNのネットワークは、通信する先のネットワークとは別のサブネットマスクになります。OpenVPNの設定は楽なんだけど、ルーティングの設定が難しいんだよね…

Page Top

サーバ側 anchor.png

先ほどのopenvpn.confの項目で、以下の項目を設定するですよ。

dev
tunを指定します。
server
サーバモードで設定する、openvpn空間でのネットワークアドレスを指定します。通信先ネットワーク内で使用しているIPとは、かぶらないIPアドレスにする。例えば、通信先のNW空間が、仮に172.21.0.0/16ならば、openvpn空間のNWは、172.22.0.0/16とかね。
Page Top

クライアント側 anchor.png

先ほどのclient.ovpnの、以下の項目を編集します。

dev
tunを指定します。
Page Top

その他の設定 anchor.png

Page Top

iptables等 anchor.png

iptablesを指定している場合は、openvpn用のNWアドレスを通過する設定をしないといけません

Page Top

各種サーバ anchor.png

openvpn用のNWアドレスからのリクエストを受け付けるようにしましょう

Page Top

ブロードバンドルータ等 anchor.png

基本は、デフォルトゲートウェイにブロードバンドルータを指定している事でしょう。このデフォルトゲートウェイに、OpenVPNクライアントのアドレスはOpenVPNサーバにルーティングしてあげるルーティングテーブルを追加します。

Page Top

OpenVPNを設定してみよう(TAPモード) anchor.png

TAP.jpg

TAPモードは、アクセス先ネットワークとクライアントが同じサブネットとなります。TAPインタフェースの設定がめんどくさいんだけど、ルーティングなんかは設定しなくていいから楽なんだよね。ただ、アクセスコントロールをしたいときは難しいですわ。

こちらで設定した場合の方が、NW通信は早いみたい。

Page Top

サーバ側 anchor.png

dev
tap指定ね。特に、TAPデバイスを作成している場合は、そのままデバイス名(例えばtap0等)を指定すると良い
server-bridge
TAPの場合はこちら。ブリッジIFのアドレス、ネットマスク、クライアントに付与するアドレスの範囲を指定。ちなみに、何もオプションを指定しない場合は、DHCPProxyモードになります。向こう側のネットワークにDHCPサーバとかいる場合は、そちらのDHCPにNW設定をお任せできます。
Page Top

クライアント側 anchor.png

dev
tap指定ね。
Page Top

OpenVPNのサーバ anchor.png

ブリッジ設定を追加してやります。

Page Top

bridge-utilsのインストール anchor.png

emerge bridge-utils
Page Top

ブリッジインタフェースを作成する anchor.png

/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
Page Top

接続確認 anchor.png

サーバ側で、openvpnを起動してみます。

# /etc/init.d/openvpn start

クライアント側で、openvpnクライアントを起動してみましょう。ちなみに、私はブロードバンドルータの外側から接続を試してみてます。うちのプロバイダは、DHCPでクライアントへのアドレス払い出しが5つまでOKなので♪でないと試験の意味がないからね。openvpnGUIのコンテキストメニューから、『接続』を選択。さて、うまくコネクトできるでしょうか…クライアント側でログが出ますから、確認できるでしょう…ちなみに、私は、protoをTCPにしないとだめでした。ブロードバンドルーターとかいろいろあるのかしら…

Page Top

もう一工夫 anchor.png

Page Top

暗号化強度を上げてみる anchor.png

Page Top

OpenVPNの設定 anchor.png

OpenVPNの設定で、以下を追加すると、暗号強度が増しますよ。

tls-auth
TLSによる暗号化をプラスする場合、使用する。暗号強度が上がる。ここの暗号鍵作成で作成する、ta.keyを書いて、第2パラメータに0を指定。サーバで指定したら、クライアント側にも必要
cipher
暗号化アルゴリズムを指定します。サーバ、クライアントにて設定を合わせます
user,group
Windowsではない場合、openvpnが動作するユーザ、グループ権限が指定できる。root以外にすれば、セキュリティは向上するよね。
Page Top

鍵長を変えてみる anchor.png

/usr/share/openvpn/easy-rsaの下に、varsというファイルがあります。こいつの

export KEY_SIZE=2048

にすると、2048bitの鍵長になり、SSLキー自体の暗号強度が上がりますよ。デフォルトは1024bit長ね

Page Top

SSL等とポートを共有する anchor.png

例えば、apacheサーバ等の暗号化ポート(https:443番)を、OpenVPN用ポートと共有するってことを考えてみます。

Page Top

apache側 anchor.png

SSL等のListenポートをずらしてやります。apacheの設定ファイルを開いて

#Listen 443
Listen 444

#<VirtualHost _default_:443>
<VirtualHost _default_:444>

等ね。で、再起動

Page Top

OpenVPN側 anchor.png

port-shareってオプションを使用します。これを行うと、httpのプロトコルを、shareしたアドレス、ポートに転送してくれます。サーバ側のopenvpn.confを開いて

port 443
port-share 127.0.0.1 444

として再起動。 こうすると、httpは127.0.0.1のポート444に転送してくれて、VPN接続も443で実行できるってわけです。便利ねー

Page Top

通信速度の高速化 anchor.png

Page Top

通信パケットの圧縮 anchor.png

通信時に、データパケットを通信元で圧縮し、通信先で解凍すると、通信回線の速さよりもCPUが勝っていれば、通信速度が向上します。 クライアント、サーバ側にcomp-lzoオプションを追加してやって。

Page Top

インタフェースのMTU長 anchor.png

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モードにするとルーティングしない分、さらに早いみたいです。
Page Top

BitLocker to Go anchor.png

Windows側のVPNクライアントを見ていると、USBのアクセスキーを差し込まないとVPN接続できないようなもの、ありますよね。あれにチャレンジしてみます。

うちのdv3500君は、SDカードスロットを持っています。うちに1GbyteのSDカードがありました。こいつを暗号化して、これにさっきのクライアント暗号化キーをぶっこんでおけば…そいつがないとVPN接続できないし、安心ですね。
Windows7 Ultimateには、BitLockerというドライブ暗号化ツールが入っています。コントロールパネルから、BitLockerドライブ暗号化を選択します。SDカードを差し込むと、BitLocker to Goというメニューが出てきます。こいつでTPMデバイスを使用しない、パスワード認証を選択すると、SDカード差し込み時にパスワードを問い合わせてくる暗号化ドライブになります。これを選択。暗号化。

そして、出来上がった暗号化ドライブに、暗号キーを放り込んで、クライアント側OpenVPNのコンフィグファイルに、キーのパス(SDカードドライブを含むフルパス)を記述しておきます。こーすると、アクセスの手順がこうなります。

  1. SDカードスロットに暗号キーを差し込む
  2. SD暗号キーのパスワード認証(BitLocker側)
  3. OpenVPN GUIで『接続』を選択
  4. クライアント暗号キーのパスフレーズ入力(パスフレーズ付きのクライアントキー認証)
  5. サーバと接続確立
  6. あとはおうちで使用するのと同じように、サーバにSSHやら、共有ドライブアクセスやら、IMAP使用したりできる

うっふっふ♪こいつぁ便利な上に、SDカードとセットでないとアクセスできない。SDキーをなくしても、暗号化されている上に何のキーかわからないから、安心ってわけね。


Attach file:
fileTUN.jpg 390DL [Info] fileTAP.jpg 391DL [Info]

Front page   Freeze Diff Backup Copy Rename ReloadPrint View   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom) Powered by xpWiki
Counter: 38782, today: 3, yesterday: 2
Princeps date: 2010-03-07 (Sun) 23:36:48
Last-modified: 2010-07-05 (Mon) 00:13:21 (JST) (4831d) by maruo
ページ内検索

ログイン

ユーザー名:


パスワード:





パスワード紛失

メインメニュー

サブメニュー
自宅鯖計画

Gentoo Linuxな生活

玄箱HGにGentoo格闘記

航空ショーへ行こう

モータースポーツな世界

奥深き写真の世界への誘い

我思う ゆえに我あり



携帯用QRコード