VPNサーバー構築(OpenVPN)

最終更新日: 2014.02.19

<<トップページ <<新着情報 <<サイト内検索 <<CentOSで自宅サーバー構築 <<Scientific Linuxで自宅サーバー構築

■概要

OpenVPN(日本語)を使用してSSL-VPN方式のインターネットVPNを構築し、外部からOpenVPN経由でLANに安全に接続できるようにする。なお、VPNクライアントはWindowsマシンとする。

【前提とするネットワークイメージ】


【前提とするネットワーク条件】
LANネットワークアドレス:192.168.1.0/24
VPNサーバーIPアドレス:192.168.1.2
VPN用仮想ネットワークアドレス:10.8.0.0/24※
VPNサーバー仮想IPアドレス:10.8.0.1※

※VPNでは仮想のプライベートIPアドレスをサーバー/クライアントともに割当てて、その仮想アドレスでVPN通信を行うが、ここでは、元々のLAN内プライベートIPアドレス(192.168.1.X)を指定して対象ホストへアクセスできるようにする。


■OpenVPNインストール(サーバー側)

[root@fedora ~]# yum -y install openvpn ← OpenVPNインストール

■OpenVPN設定(サーバー側)

(1)CA証明書・秘密鍵作成
[root@fedora ~]# cp -r /usr/share/openvpn/easy-rsa/2.0/ /etc/openvpn/easy-rsa ← 証明書/鍵作成用ディレクトリをコピー

[root@fedora ~]# cd /etc/openvpn/easy-rsa/ ← 証明書/鍵作成用ディレクトリへ移動

[root@fedora easy-rsa]# vi vars ← 証明書/鍵作成用環境変数設定ファイル編集
export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"
↓
export KEY_COUNTRY="JP" ← サーバー所在地(国名)を指定(例:JP)
export KEY_PROVINCE="Kanagawa" ← サーバー所在地(都道府県名)を指定(例:Kanagawa)
export KEY_CITY="Kawasaki" ← サーバー所在地(市区町村名)を指定(例:Kawasaki)
export KEY_ORG="fedorasrv.com" ← サーバー名を指定
export KEY_EMAIL="root@fedorasrv.com" ← サーバー管理者メールアドレスを指定

[root@fedora easy-rsa]# source vars ← 証明書/鍵作成用環境変数設定ファイル内容をシステムに反映
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys

[root@fedora easy-rsa]# ./clean-all ← 証明書/鍵作成先ディレクトリ初期化※OpenVPNインストール後最初の1回のみ

[root@fedora easy-rsa]# ./build-ca ← 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]: ← 空ENTER
State or Province Name (full name) [Kanagawa]: ← 空ENTER
Locality Name (eg, city) [Kawasaki]: ← 空ENTER
Organization Name (eg, company) [fedorasrv.com]: ← 空ENTER
Organizational Unit Name (eg, section) []: ← 空ENTER
Common Name (eg, your name or your server's hostname) [fedorasrv.com CA]: ← 空ENTER
Email Address [root@fedorasrv.com]: ← 空ENTER

[root@fedora easy-rsa]# cp keys/ca.crt /etc/openvpn/ ← CA証明書をOpenVPN設定ファイル格納ディレクトリへコピー
※CA秘密鍵は後述するサーバー証明書・秘密鍵作成時、クライアント証明書・秘密鍵作成時のみ使用するのでコピー不要

(2)サーバー証明書・秘密鍵作成
[root@fedora easy-rsa]# ./build-key-server server ← サーバー証明書・秘密鍵作成
Generating a 1024 bit RSA private key
.......++++++
.++++++
writing new private key to 'server.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]: ← 空ENTER
State or Province Name (full name) [Kanagawa]: ← 空ENTER
Locality Name (eg, city) [Kawasaki]: ← 空ENTER
Organization Name (eg, company) [fedorasrv.com]: ← 空ENTER
Organizational Unit Name (eg, section) []: ← 空ENTER
Common Name (eg, your name or your server's hostname) [server]: ← 空ENTER
Email Address [root@fedorasrv.com]: ← 空ENTER

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ← 空ENTER
An optional company name []: ← 空ENTER
Using configuration from /usr/share/openvpn/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'JP'
stateOrProvinceName   :PRINTABLE:'Kanagawa'
localityName          :PRINTABLE:'Kawasaki'
organizationName      :PRINTABLE:'fedorasrv.com'
commonName            :PRINTABLE:'server'
emailAddress          :IA5STRING:'root@fedorasrv.com'
Certificate is to be certified until Nov 15 13:36:57 2016 GMT (3650 days)
Sign the certificate? [y/n]:y ← y応答


1 out of 1 certificate requests certified, commit? [y/n]y ← y応答
Write out database with 1 new entries
Data Base Updated

[root@fedora easy-rsa]# cp keys/server.crt /etc/openvpn/ ← サーバー証明書をOpenVPN設定ファイル格納ディレクトリへコピー

[root@fedora easy-rsa]# cp keys/server.key /etc/openvpn/ ← サーバー秘密鍵をOpenVPN設定ファイル格納ディレクトリへコピー

(3)DH(Diffie Hellman)パラメータ作成
[root@fedora easy-rsa]# ./build-dh ← DHパラメータ作成
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
※時間がかかる

[root@fedora easy-rsa]# cp keys/dh1024.pem /etc/openvpn/ ← DHパラメータをOpenVPN設定ファイル格納ディレクトリへコピー

(4)証明書廃止リスト作成
将来的にクライアント証明書を廃止できるようにするため、証明書廃止リストを作成する。
※証明書廃止リストは、実際にクライアント証明書を作成してから廃止を行わないと作成できないので、ダミーのクライアント証明書をいったん作成&廃止することにより証明書廃止リストを作成する
[root@fedora easy-rsa]# ./build-key dmy ← ダミーのクライアント証明書作成
Generating a 1024 bit RSA private key
..++++++
...............................................++++++
writing new private key to 'dmy.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]: ← 空ENTER
State or Province Name (full name) [Kanagawa]: ← 空ENTER
Locality Name (eg, city) [Kawasaki]: ← 空ENTER
Organization Name (eg, company) [fedorasrv.com]: ← 空ENTER
Organizational Unit Name (eg, section) []: ← 空ENTER
Common Name (eg, your name or your server's hostname) [dmy]: ← 空ENTER
Email Address [root@fedorasrv.com]: ← 空ENTER

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ← 空ENTER
An optional company name []: ← 空ENTER
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'JP'
stateOrProvinceName   :PRINTABLE:'Kanagawa'
localityName          :PRINTABLE:'Kawasaki'
organizationName      :PRINTABLE:'fedorasrv.com'
commonName            :PRINTABLE:'dmy'
emailAddress          :IA5STRING:'root@fedorasrv.com'
Certificate is to be certified until Dec  2 07:48:44 2016 GMT (3650 days)
Sign the certificate? [y/n]:y ← y応答


1 out of 1 certificate requests certified, commit? [y/n]y ← y応答
Write out database with 1 new entries
Data Base Updated

[root@fedora easy-rsa]# vi openssl.cnf ← OpenSSL設定ファイル編集
#[ pkcs11_section ] ← 行頭に#を追加してコメントアウト
#engine_id = pkcs11 ← 行頭に#を追加してコメントアウト
#dynamic_path = /usr/lib/engines/engine_pkcs11.so ← 行頭に#を追加してコメントアウト
#MODULE_PATH = $ENV::PKCS11_MODULE_PATH ← 行頭に#を追加してコメントアウト
#PIN = $ENV::PKCS11_PIN ← 行頭に#を追加してコメントアウト
#init = 0 ← 行頭に#を追加してコメントアウト
※上記はクライアント証明書廃止時に以下のようなエラーメッセージが出力されてしまうことの対処
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
error on line 282 of config file '/etc/openvpn/easy-rsa/openssl.cnf'
25472:error:0E065068:configuration file routines:STR_COPY:variable has no value:conf_def.c:629:line 282
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
error on line 282 of config file '/etc/openvpn/easy-rsa/openssl.cnf'
25473:error:0E065068:configuration file routines:STR_COPY:variable has no value:conf_def.c:629:line 282
cat: crl.pem: そのようなファイルやディレクトリはありません
client1.crt: /C=JP/ST=Kanagawa/L=Kawasaki/O=fedorasrv.com/CN=client1/emailAddress=root@fedorasrv.com
error 3 at 0 depth lookup:unable to get certificate CRL

[root@fedora easy-rsa]# ./revoke-full dmy ← ダミーのクライアント証明書廃止
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Revoking Certificate 0B.
Data Base Updated
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
dmy.crt: /C=JP/ST=Kanagawa/L=Kawasaki/O=fedorasrv.com/CN=dmy/emailAddress=root@fedorasrv.com
error 23 at 0 depth lookup:certificate revoked

[root@fedora easy-rsa]# cp keys/crl.pem /etc/openvpn/ ← 証明書廃止リストをOpenVPN設定ファイル格納ディレクトリへコピー

[root@fedora easy-rsa]# cd ← 証明書/鍵作成用ディレクトリを抜ける

(5)OpenVPN設定
[root@fedora ~]# openvpn --genkey --secret /etc/openvpn/ta.key ← TLS認証鍵をOpenVPN設定ファイル格納ディレクトリへ作成

[root@fedora ~]# cp /usr/share/doc/openvpn-2.*/sample-config-files/server.conf /etc/openvpn/
 ← OpenVPN設定ファイルをサンプルよりコピー

[root@fedora ~]# vi /etc/openvpn/server.conf ← OpenVPN設定ファイル編集
dev tun ← VPNインタフェースとしてTUNを指定(デフォルト)

server 10.8.0.0 255.255.255.0 ← VPNクライアント割当てアドレス範囲として10.8.0.0/24を指定(デフォルト)

;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
push "route 192.168.1.0 255.255.255.0" ← 追加(LAN(例:192.168.1.0/24)へのルートをVPNサーバー経由にする)

tls-auth ta.key 0 # This file is secret ← 行頭の;を削除してコメント解除(TLS認証有効化)

user nobody ← 行頭の;を削除してコメント解除(OpenVPN実行権限を下げる)
group nobody ← 行頭の;を削除してコメント解除(OpenVPN実行権限を下げる)

log-append  /var/log/openvpn.log ← 行頭の;を削除してコメント解除(ログを/var/log/openvpn.logに記録する)

management localhost 7505 ← 最終行へ追加(管理インタフェースの有効化※後述)

crl-verify crl.pem ← 最終行へ追加(証明書廃止リストの有効化)

(6)VPNインタフェース用ファイアウォール自動設定
[root@fedora ~]# vi /etc/openvpn/openvpn-startup ← OpenVPN起動時実行スクリプト新規作成
#!/bin/bash

# VPNインタフェースiptablesルール削除スクリプト実行※必須
/etc/openvpn/openvpn-shutdown

# VPNサーバーからの送信を許可※必須
iptables -I OUTPUT -o tun+ -j ACCEPT
iptables -I FORWARD -o tun+ -j ACCEPT

# VPNクライアントからVPNサーバーへのアクセスを許可する場合
iptables -I INPUT -i tun+ -j ACCEPT

# VPNクライアントからLANへのアクセスを許可する場合
# (例としてVPNクライアントから192.168.1.0/24へのアクセスを許可する場合)
# ※192.168.1.0/24側のファイアウォール等でVPNクライアント(10.8.0.0/24)からのアクセスを許可すること
iptables -I FORWARD -i tun+ -d 192.168.1.0/24 -j ACCEPT

# VPNクライアントからLAN内特定マシンのみへのアクセスを許可する場合
# (例としてVPNクライアントから192.168.1.3へのアクセスを許可する場合)
# ※192.168.1.3側のファイアウォール等でVPNクライアント(10.8.0.0/24)からのアクセスを許可すること
iptables -I FORWARD -i tun+ -d 192.168.1.3 -j ACCEPT

[root@fedora ~]# chmod +x /etc/openvpn/openvpn-startup ← OpenVPN起動時実行スクリプトへ実行権限付加

(7)VPNインタフェース用ファイアウォール自動設定解除
[root@fedora ~]# vi /etc/openvpn/openvpn-shutdown ← OpenVPN停止時実行スクリプト新規作成
#!/bin/bash

# VPNインタフェース(tun+)用iptablesルール削除関数
delete() {
    rule_number=`iptables -L $target --line-numbers -n -v|grep tun.|awk '{print $1}'|sort -r`
    for num in $rule_number
    do
        iptables -D $target $num
    done
}

# VPNインタフェース(tun+)用iptables受信ルール削除
target='INPUT'
delete

# VPNインタフェース(tun+)用iptables転送ルール削除
target='FORWARD'
delete

# VPNインタフェース(tun+)用iptables送信ルール削除
target='OUTPUT'
delete

[root@fedora ~]# chmod +x /etc/openvpn/openvpn-shutdown ← OpenVPN停止時実行スクリプトへ実行権限付加

(8)OpenVPNログローテーション設定
[root@fedora ~]# vi /etc/logrotate.d/openvpn ← OpenVPNログローテーション設定ファイル新規作成
/var/log/openvpn.log {
    missingok
    notifempty
    sharedscripts
    postrotate
        /etc/rc.d/init.d/openvpn restart 2>&1 > /dev/null || true
    endscript
}

■OpenVPN起動(サーバー側)

(1)OpenVPN起動
[root@fedora ~]# vi /etc/rc.d/init.d/openvpn ← OpenVPN起動スクリプト編集
        echo 1 > /proc/sys/net/ipv4/ip_forward ← 行頭の#を削除してコメント解除(パケット転送有効化)

[root@fedora ~]# /etc/rc.d/init.d/openvpn start ← OpenVPN起動
openvpn を起動中:                                          [  OK  ]

[root@fedora ~]# chkconfig openvpn on ← OpenVPN自動起動設定

(2)ファイアウォール設定
ルーター側で、UDPの1194番ポートへのアクセスをサーバーに転送するようにする。
ルーターがLinuxの場合のファイアウォール設定はこちらを参照

サーバー側で、UDPの1194番ポートへのアクセスを許可するようにする。
ファイアウォール設定はこちらを参照

サーバー側で、VPNインタフェース用ファイアウォールを設定する。
ファイアウォール設定はこちらを参照

(3)LANゲートウェイにVPNサーバーを追加※VPNサーバーがLANゲートウェイ(ルーター)以外の場合
ルーター側で、宛先がVPN(例:10.8.0.0/24)のアクセスはVPNサーバー(例:192.168.1.2)を経由するようにルートを追加する。
※ルーターがLinuxの場合は以下を参照
[root@Router ~]# echo "any net 10.8.0.0 netmask 255.255.255.0 gw 192.168.1.2" >> /etc/sysconfig/static-routes
 ← 10.8.0.0/24向けルートを192.168.1.2とする設定を追加

[root@Router ~]# /etc/rc.d/init.d/network reload ← ネットワーク再起動(上記ルート設定反映)

[root@Router ~]# route ← ルート追加確認
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
・・・・
10.8.0.0        192.168.1.2     255.255.255.0   UG    0      0        0 eth0 ← 追加されたルート
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
169.254.0.0     *               255.255.0.0     U     0      0        0 eth0
・・・・

■OpenVPNインストール(クライアント側)

OpenVPNダウンロードページからOpenVPNをダウンロードしてインストールする。
※インストール時、「ハードウェアのインストール」警告メッセージが表示されるが、「続行」ボタンを押下

■OpenVPN設定(クライアント側)

(1)クライアント証明書・秘密鍵作成※サーバー側作業
[root@fedora ~]# cd /etc/openvpn/easy-rsa/ ← 証明書/鍵作成用ディレクトリへ移動

[root@fedora easy-rsa]# source vars ← 証明書/鍵作成用環境変数設定ファイル内容をシステムに反映
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys

[root@fedora easy-rsa]# ./build-key-pass client1 ← クライアント名client1※のクライアント証明書・秘密鍵作成
※クライアント名は一意であること=既に作成済のクライアント名と重複しないこと
Generating a 1024 bit RSA private key
....++++++
...++++++
writing new private key to 'client1.key'
Enter PEM pass phrase: ← 任意のパスフレーズ応答
Verifying - Enter PEM pass phrase: ← 任意のパスフレーズ応答(確認)
-----
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]: ← 空ENTER
State or Province Name (full name) [Kanagawa]: ← 空ENTER
Locality Name (eg, city) [Kawasaki]: ← 空ENTER
Organization Name (eg, company) [fedorasrv.com]: ← 空ENTER
Organizational Unit Name (eg, section) []: ← 空ENTER
Common Name (eg, your name or your server's hostname) [client1]: ← 空ENTER
Email Address [root@fedorasrv.com]: ← 空ENTER

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ← 空ENTER
An optional company name []: ← 空ENTER
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'JP'
stateOrProvinceName   :PRINTABLE:'Kanagawa'
localityName          :PRINTABLE:'Kawasaki'
organizationName      :PRINTABLE:'fedorasrv.com'
commonName            :PRINTABLE:'client1'
emailAddress          :IA5STRING:'root@fedorasrv.com'
Certificate is to be certified until Dec  2 03:48:57 2016 GMT (3650 days)
Sign the certificate? [y/n]:y ← y応答


1 out of 1 certificate requests certified, commit? [y/n]y ← y応答
Write out database with 1 new entries
Data Base Updated

(2)CA証明書、クライアント証明書・秘密鍵、TLS認証鍵設置※クライアント側作業
サーバー側からCA証明書(/etc/openvpn/ca.crt)、クライアント証明書(/etc/openvpn/easy-rsa/keys/client1.crt)、クライアント秘密鍵(/etc/openvpn/easy-rsa/keys/client1.key)、TLS認証鍵(/etc/openvpn/ta.key)をクライアント側へ持ち込み、設定ファイル格納フォルダ(C:\Program Files\OpenVPN\config)へ格納する。
※CA証明書、クライアント証明書、クライアント秘密鍵、TLS認証鍵をクライアント側へ持ち込む際は、フロッピーディスク、USBメモリ等の可搬媒体経由または、SCPやSFTP等の暗号化されたネットワーク経由等の安全な経路で持ち込むこと

(3)OpenVPN設定※クライアント側作業
クライアント設定ファイルサンプル(C:\Program Files\OpenVPN\sample-config\client.ovpn)を設定ファイル格納フォルダ(C:\Program Files\OpenVPN\config)へコピーする。

クライアント設定ファイル(C:\Program Files\OpenVPN\config\client.ovpn)編集
remote my-server-1 1194
↓
remote fedorasrv.com 1194 ← VPNサーバー名を指定

cert client.crt
↓
cert client1.crt ← クライアント証明書ファイル名を指定

key client.key
↓
key client1.key ← クライアント秘密鍵ファイル名を指定

ns-cert-type server ← 行頭の;を削除してコメント解除("Man-in-the-Middle"攻撃対策)

tls-auth ta.key 1 ← 行頭の;を削除してコメント解除(TLS認証有効化)

■OpenVPN確認※クライアント側作業

(1)VPN接続
タスクバー上のOpenVPN GUIアイコンをダブルクリック

パスフレーズ応答※クライアント証明書作成時に応答したパスフレーズ

OpenVPN GUIアイコンが黄色(接続中状態)⇒緑色(接続済状態)表示になることを確認

(2)VPN疎通確認
【VPNサーバーへアクセスを許可している場合】
C:\>ping 192.168.1.2 ← VPNクライアントからVPNサーバー(例:192.168.1.2)へpingが通ること

Pinging 192.168.1.2 with 32 bytes of data:

Reply from 192.168.1.2: bytes=32 time=283ms TTL=64
Reply from 192.168.1.2: bytes=32 time=272ms TTL=64
Reply from 192.168.1.2: bytes=32 time=266ms TTL=64
Reply from 192.168.1.2: bytes=32 time=271ms TTL=64

Ping statistics for 192.168.1.2:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 266ms, Maximum = 283ms, Average = 273ms

【LANへアクセスを許可している場合】
C:\>ping 192.168.1.3 ← VPNクライアントからLAN内他サーバー(例:192.168.1.3)へpingが通ること

Pinging 192.168.1.3 with 32 bytes of data:

Reply from 192.168.1.3: bytes=32 time=1485ms TTL=62
Reply from 192.168.1.3: bytes=32 time=262ms TTL=62
Reply from 192.168.1.3: bytes=32 time=255ms TTL=62
Reply from 192.168.1.3: bytes=32 time=260ms TTL=62

Ping statistics for 192.168.1.3:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 255ms, Maximum = 1485ms, Average = 565ms

(3)VPN切断
タスクバー上のOpenVPN GUIアイコンをダブルクリックしてDisconnectボタン押下

■VPNクライアントからのアクセス許可

VPNクライアントがVPN通信を行う場合はVPN用の仮想アドレス(10.8.0.0/24)で通信を行うので、VPNクライアントからアクセスしたいマシン側のファイアウォールや各アプリケーションのアクセス制限等で、VPNクライアントアドレス(10.8.0.0/24)からのアクセスを許可するように設定しておく。

(1)VPNクライアントからSambaへアクセスしたい場合
[root@fedora ~]# vi /etc/samba/smb.conf ← Samba設定ファイル編集
   hosts allow = 192.168.1. 127. 10.8.0. ← アクセス許可アドレスにVPNを追加

[root@fedora ~]# /etc/rc.d/init.d/smb restart ← Samba再起動

(2)TCP Wrapperによるアクセス制限対象外とする場合
[root@fedora ~]# echo "ALL: 10.8.0." >> /etc/hosts.allow ← 10.8.0.Xからのアクセスを許可

■VPNクライアントに固定IPアドレスを割当てる場合

外部から会社LANへVPN接続する場合等では、VPNクライアントごとにアクセス先マシンを制限したい場合がある。その場合は、VPNクライアントに固定IPアドレスを割当て、IPアドレスごとにファイアウォールでアクセス先マシンを制限するようにする。

例として、クライアント名client1に固定IPアドレス10.8.0.5を割当て、10.8.0.5からは192.168.1.3へのみアクセスを許可するようにする。

(1)OpenVPN設定
[root@fedora ~]# vi /etc/openvpn/server.conf ← OpenVPN設定ファイル編集
client-config-dir ccd ← 行頭の;を削除してコメント解除(クライアント毎設定格納ディレクトリの有効化)

[root@fedora ~]# mkdir /etc/openvpn/ccd ← クライアント毎設定格納ディレクトリ作成

[root@fedora ~]# /etc/rc.d/init.d/openvpn restart ← OpenVPN再起動
openvpn を停止中:                                          [  OK  ]
openvpn を起動中:                                          [  OK  ]

(2)client1固定IPアドレス割当て
[root@fedora ~]# vi /etc/openvpn/ccd/client1 ← client1設定ファイル新規作成
ifconfig-push 10.8.0.5 10.8.0.6 ← 固定IPアドレス10.8.0.5を割当てる※
※10.8.0.5と10.8.0.6の5と6の部分は以下の各組み合わせから指定すること(例えば、10.8.0.9と10.8.0.10と指定すると10.8.0.9が割当てられる)
ただし、10.8.0.1と10.8.0.2の組合せはVPNサーバーのアドレスなので指定しないこと

[ 1, 2] [ 5, 6] [ 9, 10] [ 13, 14] [ 17, 18]
[ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38]
[ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58]
[ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78]
[ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]
[101,102] [105,106] [109,110] [113,114] [117,118]
[121,122] [125,126] [129,130] [133,134] [137,138]
[141,142] [145,146] [149,150] [153,154] [157,158]
[161,162] [165,166] [169,170] [173,174] [177,178]
[181,182] [185,186] [189,190] [193,194] [197,198]
[201,202] [205,206] [209,210] [213,214] [217,218]
[221,222] [225,226] [229,230] [233,234] [237,238]
[241,242] [245,246] [249,250] [253,254]


(3)client1用ファイアウォール設定
[root@fedora ~]# iptables -I FORWARD -i tun+ -s 10.8.0.5 -d 192.168.1.3 -j ACCEPT
 ← 10.8.0.5から192.168.1.3へのアクセスを許可

[root@fedora ~]# echo "iptables -I FORWARD -i tun+ -s 10.8.0.5 -d 192.168.1.3 -j ACCEPT" >> /etc/openvpn/openvpn-startup
 ← 上記ファイアウォール設定をOpenVPN起動時実行スクリプトへ追加

これで、client1の証明書を使用してVPN接続したクライアントには固定IPアドレス10.8.0.5が割当てられ、LAN内の192.168.1.3へのみアクセスができるようになる。
なお、クライアント設定ファイルが存在しない場合はVPNサーバーが空きIPアドレスを割当てるので、固定/非固定混在が可能。

■VPNクライアントの削除

なんらかの理由(VPN通信要件がなくなった、または、証明書のパスフレーズを忘れた等※)で特定のVPNクライアントからのVPN接続を廃止したい場合は、該当VPNクライアントが使用しているクライアント証明書を廃止すればよい。
※廃止したクライアント名で証明書を再作成することができるので、パスフレーズを忘れてしまった場合は、いったん証明書を廃止後に同じクライアント名でクライアント証明書を再作成すればよい

(1)クライアント証明書廃止
クライアント証明書を廃止して、該当クライアント証明書を使用したVPN接続をできないようにする。
[root@fedora ~]# cd /etc/openvpn/easy-rsa/ ← 証明書/鍵作成用ディレクトリへ移動

[root@fedora easy-rsa]# source vars ← 証明書/鍵作成用環境変数設定ファイル内容をシステムに反映

[root@fedora easy-rsa]# ./revoke-full client1 ← client1のクライアント証明書廃止
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Revoking Certificate 04.
Data Base Updated
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
client1.crt: /C=JP/ST=Kanagawa/L=Kawasaki/O=fedorasrv.com/CN=client1/emailAddress=root@fedorasrv.com
error 23 at 0 depth lookup:certificate revoked

[root@fedora easy-rsa]# /bin/cp keys/crl.pem /etc/openvpn/ ← 証明書廃止リストを所定のディレクトリへ上書きコピー

(2)接続中クライアントの強制切断
クライアント証明書を廃止しても該当クライアントが接続中であった場合はそのまま継続して通信できてしまうので、それも強制的に切断したい場合は以下の手順で切断する。
[root@fedora ~]# telnet localhost 7505 ← OpenVPN管理インタフェース起動
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
>INFO:OpenVPN Management Interface Version 1 -- type 'help' for more info
status ← VPN接続状況確認
OpenVPN CLIENT LIST
Updated,Tue Nov 28 19:28:49 2006
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
client1,124.211.3.180:1617,6882,7144,Tue Nov 28 19:26:53 2006 ← client1が接続中
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
10.8.0.253,client1,124.211.3.180:1617,Tue Nov 28 19:28:41 2006
GLOBAL STATS
Max bcast/mcast queue length,0
END
kill client1 ← client1強制切断
SUCCESS: common name 'client1' found, 1 client(s) killed
status ← VPN接続状況確認
OpenVPN CLIENT LIST
Updated,Tue Nov 28 19:29:05 2006
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
GLOBAL STATS
Max bcast/mcast queue length,0
END
exit ← OpenVPN管理インタフェース終了
Connection closed by foreign host.




▲このページのトップへ戻る

LPIロゴ Copyright© 2004-2017 fallenangels, All rights reserved.
ご自由にリンクしてください(連絡は不要です)
本ページへのご意見・ご要望、誤字・脱字・リンク切れ等のご連絡はこちらからお願いします