トップ > OpenVPNの設定 > 拠点間VPNの設定 >
VPNサーバ機の設定

  

VPNサーバ機の設定

まずは、VPNサーバ機で作業を行います。 ログインしていなければログインし、以下の各ステップを実施します。

暗号化通信のための鍵の生成

暗号化通信に使用するための鍵を生成します。 OpenVPNでの暗号化と復号の概要については付録 - OpenVPNの暗号化と復号ついて -を参照してください。

OpenSSLの設定ファイルの編集

共通鍵方式や公開鍵方式の鍵の生成に使用するOpenSSLの設定ファイルである/etc/ssl/openssl.cnfファイルを編集します。

編集内容 補足
countryName_default = AU
  ↓(修正)
countryName_default = JP

発行する証明書に埋め込む国名を指定します。

JPに変更します。

stateOrProvinceName_default = Some-State
  ↓(修正)
stateOrProvinceName_default = <都道府県>

発行する証明書に埋め込む都道府県を指定します。

例) Oita

localityName = Locality Name (eg, city)
  ↓(追加) 下の1行を追加
localityName = Locality Name (eg, city)
localityName_default = <市町村区>

発行する証明書に埋め込む市町村区を指定します。

例) Beppu

0.organizationName_default = Internet ...(省略)
  ↓(修正)
0.organizationName_default = <組織名称>

発行する証明書に埋め込む組織名称を指定します。

例) TaroYamadaCompany

OpenSSLの追加設定ファイルの作成

用途別にOpenSSLの追加設定ファイルを作成します。

まずは、認証局用の追加設定ファイルとして/etc/openvpn/openssl-ca.cnfファイルを作成します。

以下の要領で/etc/openvpn/openssl-ca.cnfファイルを作成します。

  1. basicConstraints = CA:TRUE
 

次に、VPNサーバ機用の追加設定ファイルとして/etc/openvpn/openssl-server.cnfファイルを作成します。

以下の要領で/etc/openvpn/openssl-server.cnfファイルを作成します。

  1. basicConstraints = CA:FALSE
  2. keyUsage = digitalSignature, keyEncipherment
  3. extendedKeyUsage = serverAuth
 

続いて、VPNクライアント機(支社)用の追加設定ファイルとして/etc/openvpn/openssl-clientl.cnfファイルを作成します。

以下の要領で/etc/openvpn/openssl-clientl.cnfファイルを作成します。

  1. basicConstraints = CA:FALSE
  2. keyUsage = digitalSignature
  3. extendedKeyUsage = clientAuth
 

最後に、VPNクライアント機(出先)用の追加設定ファイルとして/etc/openvpn/openssl-clientr.cnfファイルを作成します。

以下の要領で/etc/openvpn/openssl-clientr.cnfファイルを作成します。

  1. basicConstraints = CA:FALSE
  2. keyUsage = digitalSignature
  3. extendedKeyUsage = clientAuth
 

認証局用の秘密鍵と証明書の生成

認証局用の鍵ペア(秘密鍵と公開鍵)を生成します。

認証局とは公開鍵に証明書を付加するための機関です。 認証局の証明があれば、その鍵ペアは安全なものであるといえます。 インターネット上のショッピングサイト等では、日本ベリサイン社、セコムトラストシステムズ社、GMOグローバルサイン社などに証明書の発行を依頼しますが、有償であるため本案件では利用しません。

本案件では、独自に認証局を立て、その認証局で後ほど生成する公開鍵に証明書を発行します。

まずは、認証局用の秘密鍵(ca.key)を生成します。 鍵のビット長は2048ビットとします。


cd /etc/openvpn
openssl genrsa -out ca.key 2048
chmod 400 ca.key

 

次に、認証局用のシリアルナンバーファイル(ca.srl)を作成します。


echo 00 > ca.srl

 

続いて、認証局用の秘密鍵(ca.key)から認証局用の証明書要求(ca.csr)を生成します。


openssl req -new -key ca.key -out ca.csr

 

上のコマンドを実行すると、入力を求められますので、以下のように入力します。

入力内容

(未入力)
(未入力)
(未入力)
<組織名称>CA
(未入力)
(未入力)
(未入力)
(未入力)
(未入力)
  
上記の(未入力)とは、Enterキーのみを押すことを意味しています。
  
入力内容の4行目の Organization Name には、<組織名称>の後ろに CA を付加しています。 これは、OpenVPNは、証明する側と証明される側が同じ組織名称の証明書を認めないためです。

続いて、認証局用の証明書要求(ca.csr)から認証局用の証明書(ca.crt)を生成します。 署名には、認証局の秘密鍵(ca.key)を使用します。


openssl x509 -in ca.csr -out ca.crt -req -signkey ca.key -days 3650 -extfile openssl-ca.cnf

 

最後に、生成した証明書の内容を確認します。


openssl x509 -in ca.crt -text

 

上のコマンドを実行すると、生成した証明書の内容が表示されますので、以下のテキストが含まれていることを確認します。

X509v3 extensions:
    X509v3 Basic Constraints:
        CA:TRUE

これで認証局用の秘密鍵(ca.key)と証明書(ca.crt)が揃いました。

VPNサーバ機用の秘密鍵と証明書の生成

VPNサーバ機用の鍵ペアを生成します。

まずは、VPNサーバ機用の秘密鍵(server.key)を生成します。 鍵のビット長は2048ビットとします。


cd /etc/openvpn
openssl genrsa -out server.key 2048
chmod 400 server.key

 

次に、VPNサーバ機用の秘密鍵(server.key)からVPNサーバ機用の証明書要求(server.csr)を生成します。


openssl req -new -key server.key -out server.csr

 

上のコマンドを実行すると、入力を求められますので、以下のように入力します。

入力内容

(未入力)
(未入力)
(未入力)
(未入力)
(未入力)
server
(未入力)
(未入力)
(未入力)
  
入力内容の6行目の Common Name には、鍵ペアごとに個別に指定する必要があります。

続いて、VPNサーバ機用の証明書要求(server.csr)からVPNサーバ機用の証明書(server.crt)を生成します。 署名には、認証局の秘密鍵(ca.key)を使用します。


openssl x509 -in server.csr -out server.crt -req -CA ca.crt -CAkey ca.key -days 3650 -extfile openssl-server.cnf

 

続いて、生成した証明書の内容を確認します。


openssl x509 -in server.crt -text

 

上のコマンドを実行すると、生成した証明書の内容が表示されますので、以下のテキストが含まれていることを確認します。

X509v3 extensions:
    X509v3 Basic Constraints:
        CA:FALSE
    X509v3 Key Usage:
        Digital Signature, Key Encipherment
    X509v3 Extended Key Usage:
        TLS Web Server Authentication

最後に、生成した証明書を検証します。 検証とは、生成した証明書が認証局の秘密鍵(ca.key)によって署名されたものかどうかを確認する作業です。


openssl verify -CAfile ca.crt server.crt

 
  
上記コマンドの結果が server.crt: OK と表示されれば検証は成功です。

これでVPNサーバ機用の秘密鍵(server.key)と証明書(server.crt)が揃いました。

DHパラメータの生成

DHパラメータを生成します。 鍵のビット長は2048ビットとします。


cd /etc/openvpn
openssl dhparam -out dh2048.pem 2048

 

上の作業により、DHパラメータが生成されます。 DHパラメータは、共通鍵を安全ではない経路を通して受け渡すための仕組みである『DH鍵交換方式』で利用されます。

DDH鍵交換方式が必要な理由については付録 - OpenVPNにDH鍵交換方式が必要な理由 -を参照してください。

VPNクライアント機(支社)用の秘密鍵と証明書の作成

VPNクライアント機(支社)用の鍵ペアを生成します。

まずは、VPNクライアント機(支社)用の秘密鍵(clientl.key)を生成します。 鍵のビット長は2048ビットとします。


cd /etc/openvpn
openssl genrsa -out clientl.key 2048
chmod 400 clientl.key

 
  
clientlの最後の文字は英字 L(エル) の小文字です。 "LAN to LAN"から命名しました。

次に、VPNクライアント機(支社)用の秘密鍵(clientl.key)からVPNクライアント機(支社)用の証明書要求(clientl.csr)を生成します。


openssl req -new -key clientl.key -out clientl.csr

 

上のコマンドを実行すると、入力を求められますので、以下のように入力します。

入力内容

(未入力)
(未入力)
(未入力)
(未入力)
(未入力)
clientl
(未入力)
(未入力)
(未入力)

続いて、VPNクライアント機(支社)用の証明書要求(clientl.csr)からVPNクライアント機(支社)用の証明書(clientl.crt)を生成します。 署名には、認証局の秘密鍵(ca.key)を使用します。


openssl x509 -in clientl.csr -out clientl.crt -req -CA ca.crt -CAkey ca.key -days 3650 -extfile openssl-clientl.cnf

 

続いて、生成した証明書の内容を確認します。


openssl x509 -in clientl.crt -text

 

上のコマンドを実行すると、生成した証明書の内容が表示されますので、以下のテキストが含まれていることを確認します。

X509v3 extensions:
    X509v3 Basic Constraints:
        CA:FALSE
    X509v3 Key Usage:
        Digital Signature
    X509v3 Extended Key Usage:
        TLS Web Client Authentication

最後に、生成した証明書を検証します。 検証とは、生成した証明書が認証局の秘密鍵(ca.key)によって署名されたものかどうかを確認する作業です。


openssl verify -CAfile ca.crt clientl.crt

 
  
上記コマンドの結果が clientl.crt: OK と表示されれば検証は成功です。

これでVPNクライアント機(支社)用の秘密鍵(clientl.key)と証明書(clientl.crt)が揃いました。

VPNクライアント機(出先)用の秘密鍵と証明書の作成

VPNクライアント機(出先)用の鍵ペアを生成します。

まずは、VPNクライアント機(出先)用の秘密鍵(clientr.key)を生成します。 鍵のビット長は2048ビットとします。


cd /etc/openvpn
openssl genrsa -out clientr.key 2048
chmod 400 clientr.key

 
  
clientrの最後の文字は英字 R(アール) の小文字です。 "Remote"から命名しました。

次に、VPNクライアント機(出先)用の秘密鍵(clientr.key)からVPNクライアント機(出先)用の証明書要求(clientr.csr)を生成します。


openssl req -new -key clientr.key -out clientr.csr

 

上のコマンドを実行すると、入力を求められますので、以下のように入力します。

入力内容

(未入力)
(未入力)
(未入力)
(未入力)
(未入力)
clientr
(未入力)
(未入力)
(未入力)

続いて、VPNクライアント機(出先)用の証明書要求(clientr.csr)からVPNクライアント機(出先)用の証明書(clientr.crt)を生成します。 署名には、認証局の秘密鍵(ca.key)を使用します。


openssl x509 -in clientr.csr -out clientr.crt -req -CA ca.crt -CAkey ca.key -days 3650 -extfile openssl-clientr.cnf

 

続いて、生成した証明書の内容を確認します。


openssl x509 -in clientr.crt -text

 

上のコマンドを実行すると、生成した証明書の内容が表示されますので、以下のテキストが含まれていることを確認します。

X509v3 extensions:
    X509v3 Basic Constraints:
        CA:FALSE
    X509v3 Key Usage:
        Digital Signature
    X509v3 Extended Key Usage:
        TLS Web Client Authentication

最後に、生成した証明書を検証します。 検証とは、生成した証明書が認証局の秘密鍵(ca.key)によって署名されたものかどうかを確認する作業です。


openssl verify -CAfile ca.crt clientr.crt

 
  
上記コマンドの結果が clientr.crt: OK と表示されれば検証は成功です。

これでVPNクライアント機(出先)用の秘密鍵(clientr.key)と証明書(clientr.crt)が揃いました。

TLS認証鍵の生成

TLS認証鍵(HMAC認証用共有鍵)(ta.key)を生成します。


cd /etc/openvpn
openvpn --genkey --secret ta.key

 
  
生成したTLS認証鍵は、VPNクライアント機にも配置する必要があります(後ほど配布します)。

TLS認証鍵は、OpenVPNが送受信する全てのパケットにHMAC署名を付加するための鍵です。 署名が一致しないパケットは即座に破棄されます。

署名が一致するかどうかの確認だけであるため、公開鍵方式である証明書の検証よりも高速に処理することができます。

結果、早期にパケットが適正か不正かを判断することができるため、DoS攻撃によりサービス提供が不能になる可能性を大幅に減らすことができます。

OpenVPNの設定

OpenVPNの設定を行います。

OpenVPNの設定ファイルの作成

OpenVPNの設定ファイルである/etc/openvpn/server.confファイルを作成します。

以下の要領で/etc/openvpn/server.confファイルを作成します。

  1. dev tap0
  2. link-mtu 1400
  3. proto tcp
  4. port 443

  5. server-bridge <自IP> <Mask> <開始> <終了>
  6. client-to-client
  7. keepalive 10 120

  8. ca ca.crt
  9. cert server.crt
  10. key server.key
  11. dh dh2048.pem
  12. tls-auth ta.key 0
  13. cipher BF-CBC

  14. comp-lzo

  15. user nobody
  16. group nogroup
  17. persist-key
  18. persist-tun

  19. status openvpn-status.log
  20. log /etc/openvpn/openvpn.log
  21. verb 3
 

それぞれの設定項目の意味は以下の通りです。

編集内容 補足
dev tap0

仮想LANカードのデバイス(Windowsでのネットワークアダプタにあたる)を選択します。 tunであればルーティングモードとして、tapであればブリッジモードとして動作します。

ブリッジモードで動作させるためtap0とします。

※"tap"と記述すると、"tap0"、"tap1"のように順にデバイスが探されます
※確実にデバイスを指定するため"tap0"と記述しています
link-mtu 1400

MTU値(最大伝送単位)を指定します。 OpenVPNは、このサイズでパケットの送受信を行います。 MTU値が契約しているインターネット回線のMTU値よりも大きくなるとパケットが分断化され、通信速度が大幅に低下します。

パケットの分断化を防ぐため、やや小さめな1400を指定しています。

proto tcp

通信プロトコルにTCPを利用するかUDPを利用するかを選択します。 TCPはパケットの紛失や順序の逆転などを検出・補正できるため確実に通信できますがUDPよりも通信速度が遅くなります。 一方、UDPは高速ですが通信品質が悪い場合には正常に通信を行えません。

通信品質の悪い環境でも安定するようTCPに変更します。

port 443

OpenVPNがTCP/IP通信に使用するポート番号を設定します。

デフォルトの1194ポートでは、出先(ビジネスホテルなど)のルータを超えられない可能性があるため、HTTPSで一般的に使用されている443に変更します。

server-bridge <自IP> <Mask> <開始> <終了>

ブリッジモードで動作させる場合に必要となる設定項目です。

VPNサーバ機のIPアドレスとサブネットマスク、およびVPNクライアントに割り当てるIPアドレスの範囲を指定します。

<自IP>には、VPNサーバ機の物理LANカードのIPアドレスを指定します。 <Mask>には、サブネットマスクを指定します。 <開始>と<終了>には、VPNクライアント機の仮想LANカードに割り当てるIPアドレスの範囲を指定します。

client-to-client

VPNクライアント同士が通信できるようにするかどうかを設定します。

VPNクライアント機(出先)からVPNクライアント機(支社)へ接続できるよう有効にします。

keepalive 10 120

通信相手が生存しているかを確認するためのpingの送信間隔(秒)および待機時間(秒)を指定します。

10秒ごとにpingを送り、120秒応答がなければ切断します。

ca ca.crt

認証局(CA)の証明書のファイル名を指定します。

cert server.crt

自身の証明書のファイル名を指定します。

key server.key

自身の暗号鍵のファイル名を指定します。

dh dh2048.pem

DHパラメータのファイル名を指定します。

tls-auth ta.key 0

TLS認証を有効にするかどうかと、認証に使用するTLS認証鍵を指定します。

TLS認証を有効にし、生成したTLS認証鍵のファイル名を指定します。

cipher BF-CBC

共通鍵暗号のアルゴリズムを選択します。 Blowfishは堅牢で高速、Triple-DESは強度が弱いDESを補強するための一時しのぎ的なもの、AESは現在主流のアルゴリズムです。 パフォーマンス優先であればBF-CBC(Blowfish)を、暗号強度優先であればAES-256-CBCとします。

処理能力の低い古いPCでもVPNサーバ機/クライアント機として活用することができるようBlowfishを選択します。

comp-lzo

LZO(Lempel-Ziv-Oberhumer)による圧縮を有効にするかどうかを指定します。 インターネット回線が高速でない場合には、圧縮を有効にすることでVPN通信速度が速くなる可能性があります。

有効にします。

user nobody
group nogroup

OpenVPNを実行するユーザとグループを指定します。 OpenVPNはL2TP/IP-Sec方式のような管理者権限は必要なく、一般権限で動作させることができます。

デメリットはないためnobody/nogroupで動作させます。 nobody/nobobyではなくnobody/nogroupであることに注意してください。

persist-key
persist-tun

VPNクライアント機との再接続時に、秘密鍵の再読み込みやトンネルデバイスの再オープンを行わないようにするかどうかを指定します。

有効にします。

status openvpn-status.log

ステータスファイル名を設定します。

ステータスファイルには、接続されているVPNクライアント機のリストが書き出されます。

log /etc/openvpn/openvpn.log

ログファイルの出力方法とログファイル名を設定します。 logはシステム起動時に消去されるログを、log-appendは永久に追加され続けるログを出力します。 logとlog-appendの両方を有効にすることはできません。

システム起動時にログがクリアされるようlogを選択し、出力ログファイル名はopenvpn.logとします。

verb 3

ログファイルへ出力するメッセージの詳細さを0から9の10段階で指定します。 0を指定すると致命的なエラーが発生した場合にのみメッセージが出力されます。 9を指定すると最も詳細なメッセージが出力されます。

通常の運用に最適な3を設定します。

ブリッジ接続のための設定

続いて、仮想LANカードと物理LANカードがブリッジ接続されるよう設定を行います。

システム構成図(ブリッジ接続)
システム構成図(ブリッジ接続)

上図の赤線の部分がブリッジ接続する箇所で、物理LANカード(LAN側)と仮想LANカード(VPNトンネル側)がブリッジ接続されます。 ブリッジ接続により、本社と支社の間のパケットがVPNクライアント機(支社)とVPNサーバ機を経由することができるようになります。

例えば、PC-AからPC-DへのパケットがVPNクライアント機(支社)とVPNサーバ機を経由してPC-Dまで届きます。

VPNクライアント機(支社)は別途作業を実施しますので、ここではVPNサーバ機のみを対象とします。

ブリッジ接続開始用シェルスクリプトファイルの作成

ブリッジ接続開始用のシェルスクリプトファイルである/etc/openvpn/bridge-startファイルを作成します。

以下の要領で/etc/openvpn/bridge-startファイルを作成します。

  1. #!/bin/sh

  2. br="br0"
  3. tap="tap0"
  4. eth="eth0"
  5. eth_ip="<VPNサーバ機のIPアドレス>"
  6. eth_netmask="255.255.255.0"
  7. eth_broadcast="<ブロードキャストアドレス>"

  8. for t in $tap; do
  9. openvpn --mktun --dev $t
  10. done

  11. brctl addbr $br
  12. brctl addif $br $eth

  13. for t in $tap; do
  14. brctl addif $br $t
  15. done

  16. for t in $tap; do
  17. ifconfig $t 0.0.0.0 promisc up
  18. done

  19. ifconfig $eth 0.0.0.0 promisc up

  20. ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast

  21. route add default gw <本社LAN側のルータのIPアドレス> br0
 

ブリッジ接続終了用シェルスクリプトファイルの作成

ブリッジ接続終了用のシェルスクリプトファイルである/etc/openvpn/bridge-stopファイルを作成します。

以下の要領で/etc/openvpn/bridge-stopファイルを作成します。

  1. #!/bin/sh

  2. br="br0"
  3. tap="tap0"

  4. ifconfig $br down
  5. brctl delbr $br

  6. for t in $tap; do
  7. openvpn --rmtun --dev $t
  8. done
 

パーミッションの付与

作成したブリッジ接続開始用のシェルスクリプトファイルおよびブリッジ接続終了用のシェルスクリプトファイルに実行許可を与えます。


chmod 755 /etc/openvpn/bridge-start
chmod 755 /etc/openvpn/bridge-stop

 

OpenVPNの起動ファイルの編集

OpenVPNの起動ファイルである/etc/init.d/openvpnファイルを編集します。

  
OS起動時に、/etc/init.d/openvpnが実行されるのは、システム設定画面(setupコマンドで実行)のServicesで、OPENVPNをオンにしたためです。

この起動ファイルは、OpenVPNを起動/停止する機能は持っていますが、ブリッジ接続開始用のシェルスクリプトファイルおよびブリッジ接続終了用のシェルスクリプトファイルを呼び出していません

よって、OpenVPN起動直前に、

  1. bridge-start

が、OpenVPN停止直後に、

  1. bridge-stop

が呼び出されるよう修正を行う必要があります。

以下の要領で/etc/init.d/openvpnファイルを編集します。

編集内容 補足
${DAEMON} --daemon `basename ...(省略)
  ↓(修正)
/etc/openvpn/bridge-start
${DAEMON} --daemon `basename ...(省略)

OpenVPNの起動直前にbridge-startが呼び出されるよう変更します。

killproc ${DAEMON}
  ↓(修正)
killproc ${DAEMON}
/etc/openvpn/bridge-stop

OpenVPNの停止直後にbridge-stopが呼び出されるよう変更します。

パケット転送の許可

パケット転送を許可するため、Linuxのカーネルパラメータの設定ファイルである/etc/sysctl.confファイルを編集します。

以下の要領で/etc/sysctl.confファイルを編集します。

編集内容 補足
  ↓(追加) ファイルの末尾に追加する
# Allow Forward Packet
net.ipv4.ip_forward = 1

パケットの転送の許可/禁止を設定します。 1で許可、0で禁止となります。

本案件では、OpenVPNをブリッジモードで動作させます。 つまり、VPNサーバ機とVPNクライアント機(支社)では、物理LANカードと仮想LANカードがブリッジ接続されます。

これは、VPNサーバ機とVPNクライアント機(支社)がブリッジ(仮想スイッチングハブ)として振る舞うことを意味しており、他のPCや機器に宛てられたパケットを通過させる必要があります。

そのため、パケット転送を有効にしています。

この設定を実施しなければ拠点間VPNは実現できません。

  

生成した鍵の複製

生成した、

  1. 認証局証明書(/etc/openvpn/ca.crt)
  2. TLS認証鍵(/etc/openvpn/ta.key)
  3. クライアント証明書(/etc/openvpn/clientl.crt)
  4. クライアント秘密鍵(/etc/openvpn/clientl.key)
  5. クライアント証明書(/etc/openvpn/clientr.crt)
  6. クライアント秘密鍵(/etc/openvpn/clientr.key)

を、

  1. 作業用USBフラッシュメモリ

に複製してください。

  
なお、上記ファイルはVPNサーバ機にも残しておいてください。 移動ではなく、複製してください。
  

設定の保存

UDEVの識別子ファイルを削除します。


rm /etc/udev/rules.d/*

 

続けて、設定情報をUSBフラッシュメモリに保存します。


save-config

 

これにより、設定情報がUSBフラッシュメモリに保存されます。

  
Do you still want to save? (y/n) というメッセージに y と答えると保存されます。
  
CDから起動した場合は、設定情報の格納用のUSBフラッシュメモリに設定情報が保存されます。
  
USBフラッシュメモリから起動した場合は、起動用のUSBフラッシュメモリに設定情報が保存されます。

以上で、VPNサーバ機での作業は終了となります。 続けて、VPNクライアント機(支社)での作業を行います。

 
メニュー