OPEN VPNの構築   合計:
昨日:
今日:

更新日:2011/11/17

ホームへ戻る
OpenVPNとはSSL-VPNを実現する代表的なアプリケーションの一つです。標準では暗号化および認証にOpenSSLを利用しています。
OpenVPN 2.0 HOWTO 日本語訳に構築例が記されています。
外部のwindowsマシンからVPNサーバ経由で安全にLANに接続することを目的とします。
[前提とするネットワーク条件]

LANネットワーク:              192.168.11.0/24
VPNサーバ:                    192.168.11.77
VPN用仮想ネットワークアドレス:10.8.0.0/24
VPNサーバ仮想IPアドレス:      10.8.0.1

 

 
 
◆OPEN VPNインストール(VPNサーバー) <<TOP

標準では、インストールできないようなのでRPMforgeリポジトリ導入を参照にして導入する

[root@server ~]# yum -y install openvpn ← openvpnインストール
   ・
   ・
Running Transaction
Warning: RPMDB altered outside of yum.
yum-utils-1.1.30-6.el6.noarch has missing requires of yum >= ('0', '3.2.29', None)
  Installing     : pkcs11-helper-1.08-1.el6.rf.i686                                        1/2 
  Installing     : openvpn-2.2.0-3.el6.rf.i686                                             2/2 

Installed:
  openvpn.i686 0:2.2.0-3.el6.rf                                                                

Dependency Installed:
  pkcs11-helper.i686 0:1.08-1.el6.rf                                                           

Complete!
[root@server ~]#
		  

 

◆OpenVPN設定(VPNサーバ側) <<TOP

@、CA証明書/秘密鍵の作成

[root@server ~]# cp -r /usr/share/doc/openvpn-2.2.0/easy-rsa/2.0/ /etc/openvpn/easy-rsa
         ↑ 証明書/秘密鍵作成用のディレクトリをコピーする

[root@server ~]# cd /etc/openvpn/easy-rsa/ ← 証明書/秘密鍵作成のディレクトリへ移動する

[root@server easy-rsa]# chmod +x * ← ディレクトリ内のスクリプトに実行権限付与

[root@server 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"
export KEY_PROVINCE="Kanagawa"
export KEY_CITY="Kawasaki"
export KEY_ORG="arisonsvr.org"
export KEY_EMAIL="admin@arisonsvr.org"

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

[root@server easy-rsa]# ./clean-all ← 証明書/秘密鍵作成先ディレクトリ初期化

[root@server 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) [arisonsvr.org]: ← 空ENTER

Organizational Unit Name (eg, section) []: ← 空ENTER

Common Name (eg, your name or your server's hostname) [arisonsvr.org CA]: ← 空ENTER

Name []: ← 空ENTR

Email Address [root@arisonsvr.org]: ← 空ENTER

[root@server easy-rsa]# cp keys/ca.crt /etc/openvpn/ ← CA証明書を所定のところにコピー

A、サーバ証明書/秘密鍵の作成

[root@server 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) [arisonsvr.org]: ← 空ENTER  

Organizational Unit Name (eg, section) []: ← 空ENTER

Common Name (eg, your name or your server's hostname) [server]: ← 空ENTER

Name []: ← 空ENTER
Email Address [root@arisonsvr.org]: ← 空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:'arisonsvr.org'
commonName            :PRINTABLE:'server'
emailAddress          :IA5STRING:'admin@arisonsvr.org'
Certificate is to be certified until Apr 12 03:58:52 2019 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@server easy-rsa]# cp keys/server.crt /etc/openvpn/ ← サーバー証明書を所定のディレクトリにコピー

[root@server easy-rsa]# cp keys/server.key /etc/openvpn/ ← サーバー秘密鍵を所定のディレクトリにコピー
    

B、DH(Diffie Hellman)パラメータ作成

[root@server easy-rsa]# ./build-dh ← DHパラメータ作成


Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
......+.............+......................+.................................+.......+...
....+......+...............+.............+...............................................
.....................+......++*++*++*

[root@server easy-rsa]# cp keys/dh1024.pem /etc/openvpn/ ← DHパラメータを所定のディレクトリへコピー

    

C、証明書廃止リストの作成

証明書を廃止できるように、証明書廃止リストを作成する。そのために、まず、ダミーのクライアント証明書を作成する。

[root@server 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) [arisonsvr.org]: ← 空ENTER
Organizational Unit Name (eg, section) []: ← 空ENTER
Common Name (eg, your name or your server's hostname) [dmy]:← 空ENTER 
Name []: ← 空EENTER
Email Address [root@arisonsvr.org]: ← 空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:'arisonsvr.org'
commonName            :PRINTABLE:'dmy'
emailAddress          :IA5STRING:'admin@arisonsvr.org'
Certificate is to be certified until Apr 12 05:28:11 2019 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@server easy-rsa]# vi openssl.cnf ← openvpn設定ファイル編集
   ・
   ・

[ engine_section ]
#
# If you are using PKCS#11
# Install engine_pkcs11 of opensc (www.opensc.org)
# And uncomment the following
# verify that dynamic_path points to the correct location
#
#pkcs11 = pkcs11_section

#[ 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 ← コメントアウト

[root@server easy-rsa]# ./revoke-full dmy ← ダミーのクライアント証明書を廃止

Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Revoking Certificate 02.
Data Base Updated
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
dmy.crt: /C=JP/ST=Kanagawa/L=Kawasaki/O=arisonsvr.org/CN=dmy/emailAddress=admin@arisonsvr.org
error 23 at 0 depth lookup:certificate revoked

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

D、OpenVPNの設定

[root@server easy-rsa]# cd ← カレントディレクトリに移動する

[root@server ~]# openvpn --genkey --secret /etc/openvpn/ta.key ← TLS認証鍵を作成

[root@server ~]# cp /usr/share/doc/openvpn-2.2.0/sample-config-files/server.conf /etc/openvpn/ 
        ↑ 設定ファイルのサンプルを所定のディレクトリにコピー

[root@server ~]# vi /etc/openvpn/server.conf ← 設定ファイルの編集

# "dev tun" will create a routed IP tunnel,
# "dev tap" will create an ethernet tunnel.
# Use "dev tap0" if you are ethernet bridging
# and have precreated a tap0 virtual interface
# and bridged it with your ethernet interface.
# If you want to control access policies
# over the VPN, you must create firewall
# rules for the the TUN/TAP interface.
# On non-Windows systems, you can give
# an explicit unit number, such as tun0.
# On Windows, use "dev-node" for this.
# On most systems, the VPN will not function
# unless you partially or fully disable
# the firewall for the TUN/TAP interface.
;dev tap
dev tun ← VPNインタフェースとしてtunを指定

# Configure server mode and supply a VPN subnet
# for OpenVPN to draw client addresses from.
# The server will take 10.8.0.1 for itself,
# the rest will be made available to clients.
# Each client will be able to reach the server
# on 10.8.0.1. Comment this line out if you are
# ethernet bridging. See the man page for more info.
server 10.8.0.0 255.255.255.0 ← VPNクライアントアドレスの指定

# Push routes to the client to allow it
# to reach other private subnets behind
# the server.  Remember that these
# private subnets will also need
# to know to route the OpenVPN client
# address pool (10.8.0.0/255.255.255.0)
# back to the OpenVPN server.
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
push "route 192.168.11.0 255.255.255.0" ← 自宅LANのアドレスへの経由をVPNサーバーとする
   ↑ 上記は、当自宅LANの場合

# For extra security beyond that provided
# by SSL/TLS, create an "HMAC firewall"
# to help block DoS attacks and UDP port flooding.
#
# Generate with:
#   openvpn --genkey --secret ta.key
#
# The server and each client must have
# a copy of this key.
# The second parameter should be '0'
# on the server and '1' on the clients.
;tls-auth ta.key 0 # This file is secret
tls-auth ta.key 0  ← TLS認証を有効にする

# The maximum number of concurrently connected
# clients we want to allow.
;max-clients 100
# It's a good idea to reduce the OpenVPN
# daemon's privileges after initialization.
#
# You can uncomment this out on
# non-Windows systems.
;user nobody
;group nobody
user nobody  ← 行頭の;の削除 userの指定
group nobody ← 行頭の;の削除 groupの指定

# By default, log messages will go to the syslog (or
# on Windows, if running as a service, they will go to
# the "\Program Files\OpenVPN\log" directory).
# Use log or log-append to override this default.
# "log" will truncate the log file on OpenVPN startup,
# while "log-append" will append to it.  Use one
# or the other (but not both).
;log         openvpn.log
;log-append  openvpn.log
log-append  /var/log/openvpn.log ← logを/var/log/openvpn.logに記録する

management localhost 7505 ← 最終行へ追加、インタフェースの有効化

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

    

E、VPNインタフェース用ファイアウォール自動設定

CENTOSで自宅サーバー様のスクリプトを加工して使用しています。

[root@server ~]# 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.11.0/24へのアクセスを許可する場合)
#  192.168.11.0/24側のファイアウォール等でVPNクライアント(10.8.0.0/24)からのアクセスを許可すること
iptables -I FORWARD -i tun+ -d 192.168.11.0/24 -j ACCEPT

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


[root@server ~]# chmod +x /etc/openvpn/openvpn-startup ← 実行権限(755)付与
    

F、VPNインタフェース用ファイアウォール自動設定解除

[root@server ~]# 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@server ~]# chmod +x /etc/openvpn/openvpn-shutdown ← 実行権限付与

    

G、OpenVPNログローテーション設定

[root@server ~]# 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起動(サーバー側) <<TOP

@、OpenVpn起動

[root@server ~]# vi /etc/rc.d/init.d/openvpn ← openvpn起動スクリプトの編集


        # From a security perspective, I think it makes
        # sense to remove this, and have users who need
        # it explictly enable in their --up scripts or
        # firewall setups.

        #echo 1 > /proc/sys/net/ipv4/ip_forward
        echo 1 > /proc/sys/net/ipv4/ip_forward ← コメントアウト(パケット転送有効化)

[root@server ~]# /etc/rc.d/init.d/openvpn start ← openvpn起動
openvpn を起動中:                                          [  OK  ]
[root@server ~]# chkconfig openvpn on ← 自動起動設定

[root@server ~]# chkconfig --list openvpn ← 自動起動確認
openvpn         0:off   1:off   2:on    3:on    4:on    5:on    6:off

[root@server ~]#

A、自宅ルーターの設定

UDP1194ポートへのアクセスをVPNサーバーへ流すように設定する

B、VPNサーバで1194ポートへのアクセスを許可する

[root@server ~]# vi iptables.sh ← iptable設定スクリプトのサービス公開のところに下記を追加

# 外部からのUDP1194番ポート(OpenVPN)へのアクセスを許可
# ※OpenVPNサーバーを公開する場合のみ
iptables -A INPUT -p udp --dport 1194 -j ACCEPT

# VPNインタフェース用ファイアウォール設定
# ※OpenVPNサーバーを公開する場合のみ
[ -f /etc/openvpn/openvpn-startup ] && /etc/openvpn/openvpn-startup

C、自宅LANゲートウェイ(ルーター)にVPNサーバーを追加する

 

◆OpenVPNインストール(クライアント側) <<TOP

OpenVPNダウンロードページから最新版をダウンロードしてインストールする。もちろん、クライアント(ウィンドウズ)側に

windows vistaの場合、確認ができているのは、このページのOpenVPN 2.1_rc15 です。

◆OpenVPN設定(クライアント側) <<TOP

@、クライアントのためにクライアント証明書・秘密鍵を作成する

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

[root@server easy-rsa]# ./build-key-pass client1 ← cliant1用の証明書・秘密鍵を作成

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]: ← 空エンター
State or Province Name (full name) [Kanagawa]: ← 空エンター
Locality Name (eg, city) [Kawasaki]: ← 空エンター
Organization Name (eg, company) [arisonsvr.org]: ← 空エンター
Organizational Unit Name (eg, section) []: ← 空エンター
Common Name (eg, your name or your server's hostname) [client1]: ← 空エンター
Email Address [admin@arisonsvr.org]: ← 空エンター

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ← 空エンター
An optional company name []: ← 空エンター
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:'arisonsvr.org'
commonName            :PRINTABLE:'client1'
emailAddress          :IA5STRING:'admin@arisonsvr.org'
Certificate is to be certified until Apr 12 07:12:36 2019 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@server easy-rsa]# 

A、上記で作成されたものを含めクライアント側に証明書や鍵を格納する

サーバー側からCA証明書(/etc/openvpn/ca.crt)
クライアント証明書(/etc/openvpn/easy-rsa/keys/client1.crt)
クライアント秘密鍵(/etc/openvpn/easy-rsa/keys/client1.key)
TLS認証鍵(/etc/openvpn/ta.key)
をクライアント側へ持ち込み(winscp等を用いて暗号化して持ち込む)
設定ファイル格納フォルダ(C:\Program Files\OpenVPN\config)へ格納する。

B、openvpn設定ファイル編集(クライアント側)

クライアント設定ファイルサンプル(C:\Program Files\OpenVPN\sample-config\client.ovpn)を設定ファイル格納フォルダ(C:\Program Files\OpenVPN\config)へコピーする。そして、client.ovpnファイルを編集する(テキストエディタ等で)

remote my-server-1 1194

remote arisonsvr.org 1194 ← VPNサーバー名を指定


cert client.crt

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


key client.key

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


ns-cert-type server ← 行頭の;を削除してコメントアウト


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

 

◆OpenVpn確認 <<TOP

OpenVpn GUIをウィンドウズから起動すとタスクバーにアイコン(赤の状態)が表れる (xp)

vistaの場合は、右クリックして管理者として実行をしないとだめです。

そのアイコンをダブルクリックするか右クリックでConnectをクリックするとパスワードを聞いてくるの(アイコンは、黄色になる)で

クライアント証明書/鍵を作成したときのパスワードを入力する。(アイコンは、無事につながると緑色になる)

 

 
◆VPNクライアントからのアクセス許可 <<TOP

@、VPNクライアントからsambaにアクセスさせたい場合。

[root@server ~]#  vi /etc/samba/smb.conf ← samba設定ファイル編集	  
# This option is important for security. It allows you to restrict
# connections to machines which are on your local network. The
# following example restricts access to two C class networks and
# the "loopback" interface. For more examples of the syntax see
# the smb.conf man page
;   hosts allow = 192.168.1. 192.168.2. 127.
   hosts allow = 192.168.11. 127. 10.8.0. ← VPNのアドレスを追加する

[root@server ~]# /etc/rc.d/init.d/smb restart ← sambaの再起動

SMB サービスを停止中:                                      [  OK  ]
NMB サービスを停止中:                                      [  OK  ]
SMB サービスを起動中:                                      [  OK  ]
NMB サービスを起動中:                                      [  OK  ]

[root@server ~]# 

A、TCP Wrapperによるアクセス制限対象外とする場

[root@server ~]# echo "ALL: 10.8.0." >> /etc/hosts.allow ← 10.8.0.xからのアクセスを許可
		

上記の設定を適用することによりsambaの中身をローカルで見るかのように見ることができるようになる。

アドレスは、\\192.168.11.77(当サーバーの場合)で指定されると表れます。

 

 
◆VPNクライアントの削除 <<TOP

 

[root@server ~]# 
 
   
   
   
◆広告等 <<TOP
TOPへ

Copyright(C) 2005-2009 arisonserver. All rights reserved.