ページへ戻る

− Links

 印刷 

Gentoo Linuxな生活​/OpenVPNで悩む :: Nest Of Hawk

xpwiki:Gentoo Linuxな生活/OpenVPNで悩む

ページ内コンテンツ
  • OpenVPNとは
  • OpenVPNをインストールしてみよう
    • サーバ側
    • クライアント側
  • 暗号鍵を作成
    • CA局を作成
    • サーバ暗号鍵の作成
    • クライアント暗号鍵の作成
    • Diffie hellmanパラメータ作成
    • TLSのHMAC認証用共有鍵作成
    • 鍵をコピー
  • OpenVPNを設定してみよう(共通設定)
    • サーバ側
    • クライアント側
    • ブロードバンドルータ側の設定
    • Linuxサーバの設定
      • Sysctl
  • OpenVPNを設定してみよう(TUNモード)
    • サーバ側
    • クライアント側
    • その他の設定
      • iptables等
      • 各種サーバ
      • ブロードバンドルータ等
  • OpenVPNを設定してみよう(TAPモード)
    • サーバ側
    • クライアント側
    • OpenVPNのサーバ
      • bridge-utilsのインストール
      • ブリッジインタフェースを作成する
  • 接続確認
  • もう一工夫
    • 暗号化強度を上げてみる
      • OpenVPNの設定
      • 鍵長を変えてみる
    • SSL等とポートを共有する
      • apache側
      • OpenVPN側
    • 通信速度の高速化
      • 通信パケットの圧縮
      • インタフェースのMTU長
    • BitLocker to Go

OpenVPNとは anchor.png[1]

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

Page Top

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

Page Top

サーバ側 anchor.png[5]

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

# emerge -vuD openvpn

おしまい。

Page Top

クライアント側 anchor.png[6]

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

Page Top

暗号鍵を作成 anchor.png[9]

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

Page Top

CA局を作成 anchor.png[10]

# 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[11]

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

# 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[12]

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

# build-key クライアント名

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

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

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

Page Top

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

# build-dh

少々お待ちくださいね…

Page Top

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

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

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

鍵をコピー anchor.png[15]

そうすると、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[16]

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

Page Top

サーバ側 anchor.png[17]

/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[18]

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[19]

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

Page Top

Linuxサーバの設定 anchor.png[20]

Page Top

Sysctl anchor.png[21]

Sysctlの、ip_forwardをONにします。

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

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

TUN.jpg

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

Page Top

サーバ側 anchor.png[23]

先ほどの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[24]

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

dev
tunを指定します。
Page Top

その他の設定 anchor.png[25]

Page Top

iptables等 anchor.png[26]

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

Page Top

各種サーバ anchor.png[27]

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

Page Top

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

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

Page Top

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

TAP.jpg

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

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

Page Top

サーバ側 anchor.png[30]

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

クライアント側 anchor.png[31]

dev
tap指定ね。
Page Top

OpenVPNのサーバ anchor.png[32]

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

Page Top

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

emerge bridge-utils
Page Top

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

/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[35]

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

# /etc/init.d/openvpn start

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

Page Top

もう一工夫 anchor.png[36]

Page Top

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

Page Top

OpenVPNの設定 anchor.png[38]

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

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

鍵長を変えてみる anchor.png[39]

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

export KEY_SIZE=2048

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

Page Top

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

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

Page Top

apache側 anchor.png[41]

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

#Listen 443
Listen 444

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

等ね。で、再起動

Page Top

OpenVPN側 anchor.png[42]

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[43]

Page Top

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

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

Page Top

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

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[46]

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キーをなくしても、暗号化されている上に何のキーかわからないから、安心ってわけね。


Last-modified: 2010-07-05 (月) 00:13:21 (JST) (5016d) by maruo