Top / Network / VPN / OpenVPNでSSL-VPN環境を構築する

最近はルータなどにもVPN機能がついているヤツがあって、外部からセキュアにアクセス可能!なんてのをちょくちょく見かけます。うちも外部から自宅のNASにアクセスできたら便利だなーと思って、うちのFedoraにVPNを入れてみました。OpenVPNなんで、正確にはSSL-VPNですね。

構成:

サーバ側のネットワーク: 192.168.0.0/24
VPNサーバ(兼、ブリッジ機能、CA認証局): 192.168.0.3
VPNクライアントのIP範囲 192.168.0.150〜160

として話を進めます。

ライブラリのインストール

openvpn,sysfsutils,bridge-utils,lzo をyumでインストールします。

[root@www etc]# yum install openvpn
 Package                 Arch       Version          Repository        Size
 openvpn                 i386       2.1-0.19.rc4.fc7  fedora            356 k
[root@www ~]# yum install sysfsutils
 sysfsutils              i386       2.1.0-1.fc7      fedora             39 k
[root@www ~]# yum install bridge-utils
 bridge-utils            i386       1.1-2            fedora             28 k
[root@www ~]# yum install lzo
 lzo                     i386       2.02-2.fc6       fedora             63 k
[root@www ~]#

設定の追加

[root@www ~]# cp -pfr /usr/share/doc/openvpn-2.1/sample-scripts/openvpn.init /etc/openvpn/
[root@www ~]# cp -pfr /usr/share/doc/openvpn-2.1/sample-scripts/bridge-start /etc/openvpn/
[root@www ~]# cp -pfr /usr/share/doc/openvpn-2.1/sample-scripts/bridge-stop  /etc/openvpn/
[root@www ~]# chmod 755 /etc/openvpn/*

server.confの修正

[root@www ~]# vi /etc/openvpn/server.conf

内容は以下の通り

# 通信に使用するプロトコル及びポート番号の指定
port 5000
proto udp

# 使用する仮想ネットワークデバイスの指定
dev tap0

# CA証明書、サーバ証明書、サーバ秘密鍵、DH鍵のパス指定
# ※パス指定は、絶対パスまたはserver.confの設置ディレクトリからの相対パスでの指定
ca   /etc/openvpn/easy-rsa/2.0/keys/ca.crt
cert /etc/openvpn/easy-rsa/2.0/keys/server.crt
key  /etc/openvpn/easy-rsa/2.0/keys/server.key
dh   /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem

# OpenVPNサーバをブリッジモードで起動させるための設定
# 書式:server-bridge [OpenVPNサーバのアドレス] [ネットマスク] [クライアントに割り振るアドレス範囲]
server-bridge 192.168.0.3 255.255.255.0 192.168.0.150 192.168.0.160

# クライアントにサーバ側ネットワークへの経路を伝えるための設定
# 書式:push “route [OpenVPNサーバ側のネットワークアドレス] [ネットマスク]”
push "route 192.168.0.0 255.255.255.0"

# クライアント同士の通信を可能にするための設定
client-to-client

# VPN接続間の生存確認のための設定
keepalive 10 120

# パケット転送の際にLZO圧縮を有効にする
comp-lzo

# OpenVPNデーモン起動ユーザ・グループの指定 ※Windowsシステム以外設定可能
user nobody
group nobody

# VPNが落ちた場合の再接続設定
persist-key
persist-tun

# ステータスログのパス指定
status /var/log/openvpn-status.log

# ログのパス指定
log /var/log/openvpn.log
log-append /var/log/openvpn.log

# ログの詳細レベルの指定
verb 3

# OpenVPN管理インターフェイスの起動設定
management localhost 7505

bridge-startの修正

[root@www ~]# vi /etc/openvpn/bridge-start

[root@www usr]# diff /usr/share/doc/openvpn-2.1/sample-scripts/bridge-start /etc/openvpn/bridge-start 
18c18
< eth_ip="192.168.8.4"
---
> eth_ip="192.168.0.3"
20c20
< eth_broadcast="192.168.8.255"
---
> eth_broadcast="192.168.0.255"
[root@www usr]# 

IPフォワードの設定

[root@www ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@www ~]# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1 <-ココを1にします

ネットワークの起動時に、bridgeの有効化、OpenVPNサーバの起動

/etc/openvpn/bridge-start
/etc/openvpn/openvpn.init start

という記述を、/etc/init.d/network の

touch /var/lock/subsys/network

の直後に追記します。

ネットワークの停止時に、、OpenVPNサーバの停止、bridgeの無効化

/etc/openvpn/openvpn.init stop
/etc/openvpn/bridge-stop

という記述を、/etc/init.d/network の stopステートメントの先頭に追記します。

証明書と秘密鍵の配置。。

変数の定義

次にSSL通信のServer・Clientの証明書、署名のためのCAの証明書などを作成します。作成はOpenVPN付属のツールで行います。

[root@www openvpn]# cp -pfr /usr/share/openvpn/easy-rsa /etc/openvpn/
[root@www openvpn]# cd /etc/openvpn/easy-rsa/2.0/
[root@www 2.0]# mkdir keys

[root@www 2.0]# view vars

以下の箇所を編集します。

export KEY_COUNTRY="JP"
export KEY_PROVINCE="Tokyo"
export KEY_CITY="Bunkyo"
export KEY_ORG="Masatom in"
export KEY_EMAIL="hogehoge@hogehoge.com"
[root@www 2.0]# source vars
[root@www 2.0]# echo $KEY_DIR
/etc/openvpn/easy-rsa/2.0/keys <-変数が定義された

CAの証明書と秘密鍵の作成。

まずはCAの証明書、秘密鍵を作成します。

[root@www 2.0]# ./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) [JP]:
State or Province Name (full name) [Tokyo]:
Locality Name (eg, city) [Bunkyo]:
Organization Name (eg, company) [Masatom in]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [Masatom in CA]:
Email Address [hogehoge@hogehoge.com]:
[root@www 2.0]# 
[root@www 2.0]# ls -lrt keys/
合計 8
-rw------- 1 root root  887 2008-06-24 01:19 ca.key
-rw-r--r-- 1 root root 1245 2008-06-24 01:19 ca.crt
[root@www 2.0]#

以上で、CA局の証明書と秘密鍵ができました。

サーバの証明書・秘密鍵の作成

次に、サーバの証明書、秘密鍵の作成です。

[root@www 2.0]# ./build-key-server server
[root@www 2.0]# ls -lrt keys/
合計 16
-rw------- 1 root root  887 2008-06-24 01:19 ca.key
-rw-r--r-- 1 root root 1245 2008-06-24 01:19 ca.crt
-rw-r--r-- 1 root root  891 2008-06-24 01:21 server.key
-rw-r--r-- 1 root root  676 2008-06-24 01:21 server.csr
[root@www 2.0]#

参考にさせていただいているサイトの説明では、この時点で証明書(*.crt)ができると書いてあるのですが、どうもエラーが出てるのか、証明書要求(*.csr)しかできないようです。

仕方がないので、手動で先のCAの秘密鍵で署名を行います。署名の方法についてはCA局としてCSRに署名するを参照してください。

署名によって、

[root@www 2.0]# ls -lrt keys
合計 36
-rw------- 1 root root  887 2008-06-24 01:19 ca.key
-rw-r--r-- 1 root root 1245 2008-06-24 01:19 ca.crt
-rw-r--r-- 1 root root  891 2008-06-24 01:26 server.key
-rw-r--r-- 1 root root  676 2008-06-24 01:26 server.csr
-rw-r--r-- 1 root root 2621 2008-06-24 01:33 server.crt <-署名付き証明書
-rw-r--r-- 1 root root    3 2008-06-24 01:33 ca.db.serial
-rw-r--r-- 1 root root   21 2008-06-24 01:33 ca.db.index.attr
-rw-r--r-- 1 root root  109 2008-06-24 01:33 ca.db.index
drwxr-xr-x 2 root root 4096 2008-06-24 01:33 ca.db.certs
[root@www 2.0]#

署名付き証明書ができました。

2008/06/25追記。flyman のおもちゃ箱 - PhotoLog : OpenVPN by flymanにもありますとおり、source ./vars して ./clean-all してから、CAの作成からやり直すとうまくいくようです。確かにうまくいきました*1

Diffie Hellmanのパラメタ作成

[root@www 2.0]# ./build-dh
[root@www 2.0]# ls -lrt keys
合計 40
......
-rw-r--r-- 1 root root  245 2008-06-24 01:35 dh1024.pem
[root@www 2.0]#

以上

クライアントの証明書・秘密鍵の作成

[root@www 2.0]# ./build-key-pass client1
Generating a 1024 bit RSA private key
....................................................++++++
........................++++++
writing new private key to 'client1.key'
Enter PEM pass phrase:     <-クライアントで鍵を活性化するためのパスワード
Verifying - Enter PEM pass phrase:
[root@www 2.0]# ls -lrt keys
合計 48
.....
-rw-r--r-- 1 root root  963 2008-06-24 01:37 client1.key
-rw-r--r-- 1 root root  676 2008-06-24 01:37 client1.csr
[root@www 2.0]#

これも証明書要求しかないので、CAの鍵で署名します。

[root@www 2.0]# cd keys
[root@www keys]#  /tmp/mod_ssl-2.8.30-1.3.39/pkg.contrib/sign.sh  client1.csr
[root@www keys]# cd ..
[root@www 2.0]# ls -lrt keys
合計 56
-rw-r--r-- 1 root root  963 2008-06-24 01:37 client1.key
-rw-r--r-- 1 root root  676 2008-06-24 01:37 client1.csr
-rw-r--r-- 1 root root 2626 2008-06-24 01:39 client1.crt <-署名付き証明書
[root@www 2.0]#

以上でサーバの環境設定は完了です。

client1.key
client1.crt
ca.crt

はクライアント側に配置する必要があるので、特にclient1.keyに関しては安全な経路でクライアントに配布するようにしてください。

また、余計なファイルはセキュリティ上問題なので、削除しておきます。

[root@www 2.0]# cd keys
[root@www keys]# rm *.csr
[root@www keys]# rm client1.*

サーバ上には

[root@www keys]# ls -lrt
合計 52
-rw------- 1 root root  887 2008-06-25 16:29 ca.key
-rw-r--r-- 1 root root 1245 2008-06-25 16:29 ca.crt
-rw------- 1 root root  887 2008-06-25 16:29 server.key
-rw-r--r-- 1 root root 3908 2008-06-25 16:29 server.crt
-rw-r--r-- 1 root root  245 2008-06-25 16:30 dh1024.pem
-rw-r--r-- 1 root root 3786 2008-06-25 16:30 02.pem

これらくらいになりました。最終的な正しい構成はOpenVPN 2.0 HOWTO Japanese Translationの「鍵ファイル」という項に詳しく記載されています。

ココは本当は、クライアントで証明書要求(*.csr)を作成し、サーバに送信し、署名してもらった証明書(*.crt)を受信するが、正しいです。本来秘密鍵はクライアント側で作成するのがセキュアです。

クライアントの設定

OpenVPNで構築するリモートアクセス環境 に従って、クライアント環境をセットアップします。

関連リンク


この記事は

選択肢 投票
おもしろかった 25  
そうでもない 1  
  • CentOSには標準のyumのリポジトリではOpenVPNが提供されてないようで、RPMforgeリポジトリ導入(RPMforge) - CentOSで自宅サーバー構築 で新たなリポジトリを追加しないとダメなようですね。 -- きの? 2008-10-21 (火) 11:38:20
  • 環境によっては、 /etc/openvpn/easy-rsa/2.0/ 内のchmod 755 が必要かもしれない。 -- きの? 2008-10-21 (火) 12:47:34

Top / Network / VPN / OpenVPNでSSL-VPN環境を構築する

現在のアクセス:24793


*1 clean-allしたら中にindex.txtとかができるみたいですが、それがないと署名時にエラーになるようです

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-11-15 (火) 09:40:21 (2881d)