OpenVPN-2.0.5 ルーティングモード/証明書を使う [FC4]
作成 : 2006/02/07
OpenVPN 公開鍵を使う
共通鍵を使うなら、OpenVPN-2.0.5 共通鍵を使うを参照。
証明書を使ってVPN接続してみる。 Fedora Coreでの実験したときの記録だが、Windowsでもほとんど同じやり方。 環境は下図のような感じ。 接続を開始するほうがクライアントで、待っているほうがサーバ。
+---+ +---+ +---+
|PC1| |PC2| |PC3|
+-+-+ +-+-+ +-+-+
| | |
192.168.0.0/24 --+-+---+-----+--
|
+----------------+ | +---+ +----------------+
| OpenVPN Server +-+----------+ R +------------+ OpenVPN Client |
+----------------+ +---+ +----------------+
eth0(192.168.0.1) eth0(192.168.1.1)
論理的には下図のような構成かな。
+---+ +---+ +---+
|PC1| |PC2| |PC3|
+-+-+ +-+-+ +-+-+
| | |
--+-+---+-----+-- 192.168.0.0/24
|
| +------------------------------+ +------------------------------+
| +------+ +------+ +------+ +------+
+---+ eth0 +----------------+ tun0 +--------------+ tun0 +----------------+ eth0 +
+------+ OpenVPN Server +------+ +------+ OpenVPN Client +------+
+------------------------------+ +------------------------------+
192.168.0.1 172.16.0.1 172.16.0.2 192.168.1.1
Fedora Coreへのインストール
OpenVPN-2.0.5 インストールを参照。 サーバになるPCとクライアントになるPCの両方にインストールしておく。
CA・証明書・秘密鍵・証明書失効リスト
ここからCA、証明書・秘密鍵、証明書失効リストをOpenVPNパッケージに付属のスクリプトを使って作っていく。 もちろん、opensslコマンドで作ってもよい(opensslコマンドを参照)が、付属スクリプトを使うと簡単。
環境変数を設定(サーバ側)
/usr/share/openvpn/easy-rsaディレクトリに移動する。 varsファイルに環境変数が記述してあるので、適当に修正する(そのままでもちゃんと動く)。 varsファイルを実行して、環境変数を設定する。
# cd /usr/share/openvpn/easy-rsa # . vars NOTE: when you run ./clean-all, I will be doing a rm -rf on /usr/share/openvpn/easy-rsa/keys Windowsでは、C:\Program Files\OpenVPN\easy-rsaフォルダに移動して > init-config.bat > vars.bat のようにする
CAを作成(サーバ側で実行)
最初に一度だけ、clean-allスクリプトを実行する。 実行すると、既存のCAは削除されるので注意すること。
# ./clean-all Windowsでは、 > clean-all.bat のようにする
build-caスクリプトを実行して、CAを作成する。 Common Nameとか聞いてくるけど、全部省略してもとりあえず通る。 /usr/share/openvpn/easy-rsa/keysディレクトリにCAの証明書(ca.crt)・秘密鍵(ca.key)が作成される。 秘密鍵は関係ない人からアクセスされないよう、rootのみ読み書き可のようなパーミッションにしておく。
# ./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]: (Enter) State or Province Name (full name) [NA]: (Enter) Locality Name (eg, city) [BISHKEK]: (Enter) Organization Name (eg, company) [OpenVPN-TEST]: (Enter) Organizational Unit Name (eg, section) []: (Enter) Common Name (eg, your name or your server's hostname) []: (Enter) Email Address [me@myhost.mydomain]: (Enter) Windowsでは、 > build-ca.bat のようにする C:\Program Files\OpenVPN\config\keysフォルダにCAの証明書(ca.crt)・秘密鍵(ca.key)が作成される
サーバ証明書・秘密鍵を作成(サーバ側で実行)
build-key-serverスクリプトを実行して、サーバ証明書と秘密鍵を作成する。 引数にファイル名を指定してCommon Nameだけちゃんと入力すれば、あとは省略してもとりあえず通る。 /usr/share/openvpn/easy-rsa/keysディレクトリにサーバ証明書(xxxx.crt)・秘密鍵(xxxx.key)が作成される。 秘密鍵は関係ない人からアクセスされないよう、rootのみ読み書き可のようなパーミッションにしておく。
# ./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) [KG]: (Enter) State or Province Name (full name) [NA]: (Enter) Locality Name (eg, city) [BISHKEK]: (Enter) Organization Name (eg, company) [OpenVPN-TEST]: (Enter) Organizational Unit Name (eg, section) []: (Enter) Common Name (eg, your name or your server's hostname) []: OpenVPN Server <---Common Nameはちゃんと入力する Email Address [me@myhost.mydomain]: (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/openssl.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'KG' stateOrProvinceName :PRINTABLE:'NA' localityName :PRINTABLE:'BISHKEK' organizationName :PRINTABLE:'OpenVPN-TEST' commonName :PRINTABLE:'OpenVPN Server' emailAddress :IA5STRING:'me@myhost.mydomain' Certificate is to be certified until Jan 24 12:33:16 2016 GMT (3650 days) Sign the certificate? [y/n]: y 1 out of 1 certificate requests certified, commit? [y/n] y Write out database with 1 new entries Data Base Updated Windowsでは、 > build-key-server.bat server のようにする C:\Program Files\OpenVPN\config\keysフォルダにサーバ証明書(xxxx.crt)・秘密鍵(xxxx.key)が作成される
[Linux] クライアント秘密鍵と証明書要求を作成(クライアント側で実行)
/usr/share/openvpn/easy-rsaディレクトリに移動する。 varsファイルに環境変数が記述してあるので、適当に修正する(そのままでもちゃんと動く)。 varsファイルを実行して、環境変数を設定する。
# cd /usr/share/openvpn/easy-rsa # . vars NOTE: when you run ./clean-all, I will be doing a rm -rf on /usr/share/openvpn/easy-rsa/keys
最初に一度だけ、clean-allスクリプトを実行する。 実行すると、既存の鍵は削除されるので注意すること。
# ./clean-all
build-reqスクリプト(Windowsパッケージにはない)を実行して、クライアント秘密鍵と証明書要求を作成する。 替わりにbuild-req-passスクリプト(Windowsパッケージにはない)を使うと、パスフレーズで保護された証明書を作ることができる。 /usr/share/openvpn/easy-rsa/keysディレクトリにクライアント秘密鍵(xxxx.key)・証明書要求(xxxx.csr)が作成される。 秘密鍵は関係ない人からアクセスされないよう、rootのみ読み書き可のようなパーミッションにしておく。 証明書要求は、サーバに渡して署名してもらう。
# ./build-req client1 <---引数にファイル名を指定する Generating a 1024 bit RSA private key ...............++++++ ..............++++++ writing new private key to 'client1.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 Client 1 <---Common Nameはちゃんと入力する Email Address [me@myhost.mydomain]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
[Linux] クライアント証明書に署名して証明書を作成(サーバ側で実行)
/usr/share/openvpn/easy-rsa/keyディレクトリに、クライアントから渡された証明書要求をコピーする。 sign-reqスクリプト(Windowsパッケージにはない)を実行して、クライアント証明書要求に署名する。 /usr/share/openvpn/easy-rsa/keysディレクトリにクライアント証明書(xxxx.crt)が作成される。 クライアント証明書はクライアントに渡す。
# ./build-req client1 <---引数にファイル名を指定する Using configuration from /usr/share/openvpn/easy-rsa/openssl.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'KG' stateOrProvinceName :PRINTABLE:'NA' localityName :PRINTABLE:'BISHKEK' organizationName :PRINTABLE:'OpenVPN-TEST' commonName :PRINTABLE:'OpenVPN Client 1' emailAddress :IA5STRING:'me@myhost.mydomain' Certificate is to be certified until Feb 21 11:43:19 2016 GMT (3650 days) Sign the certificate? [y/n]: y 1 out of 1 certificate requests certified, commit? [y/n] y Write out database with 1 new entries Data Base Updated
[Windows(Linuxでも可)] クライアント証明書・秘密鍵を作成(サーバ側で実行)
本来であれば、クライアント側で秘密鍵を作成して、サーバ側(CA)で証明書を発行する。 スクリプトを使うと、サーバ側でクライアント証明書・秘密鍵を作り、クライアントへ送ることになる。 秘密鍵の取り扱いにはくれぐれも注意すること。
build-keyスクリプトを実行して、クライアント証明書と秘密鍵を作成する。 引数にファイル名を指定してCommon Nameだけちゃんと入力すれば、あとは省略してもとりあえず通る。 /usr/share/openvpn/easy-rsa/keysディレクトリにクライアント証明書(xxxx.crt)・秘密鍵(xxxx.key)が作成される。 証明書と秘密鍵をクライアントへ送り、証明書だけ残して秘密鍵は消してしまう。
# ./build-key client1 <---引数にファイル名を指定する Generating a 1024 bit RSA private key ..................................++++++ ............................++++++ writing new private key to 'client1.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]: (Enter) State or Province Name (full name) [NA]: (Enter) Locality Name (eg, city) [BISHKEK]: (Enter) Organization Name (eg, company) [OpenVPN-TEST]: (Enter) Organizational Unit Name (eg, section) []: (Enter) Common Name (eg, your name or your server's hostname) []: OpenVPN Client 1 <---Common Nameはちゃんと入力する Email Address [me@myhost.mydomain]: (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/openssl.cnf DEBUG[load_index]: unique_subject = "yes" Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'KG' stateOrProvinceName :PRINTABLE:'NA' localityName :PRINTABLE:'BISHKEK' organizationName :PRINTABLE:'OpenVPN-TEST' commonName :PRINTABLE:'OpenVPN Client 1' emailAddress :IA5STRING:'me@myhost.mydomain' Certificate is to be certified until Jan 24 12:33:47 2016 GMT (3650 days) Sign the certificate? [y/n]: y 1 out of 1 certificate requests certified, commit? [y/n] y Write out database with 1 new entries Data Base Updated Windowsでは、 > build-key.bat client1 のようにする C:\Program Files\OpenVPN\config\keysフォルダにクライアント証明書(xxxx.crt)・秘密鍵(xxxx.key)が作成される
DHパラメータを作成(サーバ側で実行)
build-dhスクリプトを実行して、Diffie-Hellmanパラメータを作成する。 /usr/share/openvpn/easy-rsa/keysディレクトリにDHパラメータ(dhxxxx.pem、xxxxは環境変数KEY_SIZEで指定した鍵の長さ)が作成される。 DHパラメータは関係ない人からアクセスされないよう、rootのみ読み書き可のようなパーミッションにしておく。
# ./build-dh Generating DH parameters, 1024 bit long safe prime, generator 2 This is going to take a long time ................................. Windowsでは、 > build-dh.bat のようにする C:\Program Files\OpenVPN\config\keysフォルダにDHパラメータ(dhxxxx.pem)が作成される
証明書失効リストを作成(サーバ側で実行)
make-crlスクリプト(Windowsパッケージにはない)を実行して、証明書失効リストcrl.pemを作成する。 実際に証明書を失効させるときは、revoke-fullスクリプトを実行して証明書失効リストを作成することができる。
# . make-crl crl.pem
Using configuration from /usr/share/openvpn/easy-rsa/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
Windowsパッケージにはmake-crlスクリプトがないので、opensslコマンドで証明書失効リストを作成する。
# openssl ca -gencrl -out /usr/share/openvpn/keys/crl.pem -config openssl.cnf
サーバ側の設定ファイル(サーバ側で実行)
/etc/openvpn/keysディレクトリを作成して、そこにCA証明書ca.crt、サーバ証明書server.crt・秘密鍵server.key、DHパラメータdh1024.pem、証明書失効リストcrt.pemをコピーする (Windowsでは、C:\Program Files\OpenVPN\config\keysフォルダを作成して、そこにCA証明書、サーバ証明書・秘密鍵、DHパラメータ、証明書失効リストをコピーする)。 秘密鍵とDHはrootだけアクセスできるようにする。
/etc/openvpnディレクトリに、拡張子confの適当な名前のファイルを作る (Windowsでは、C:\Program Files\OpenVPN\configフォルダに、拡張子ovpnの適当な名前のファイルを作る)。 仮に、server.confとしておく。 これにサーバの設定を書く。
# /etc/openvpn/server.conf # サーバの設定 # tunデバイスを使って、レイヤ3のVPN接続をする dev tun # プロトコルにはTCPを使う # UDPを使うときは、proto udpとする proto tcp-server # 1194番ポート(デフォルト)で待つ # root権限で動作させない場合、特権ポートは使えない(WindowsではOK) port 1194 # サーバとクライアントで使用するセグメントを指定する # 下の設定では、サーバに172.16.0.1/32が割り当てられ、クライアントには172.16.0.6/30、172.16.0.10/30、...が割り当てられる # IPアドレスはDHCPサーバからもらうような感じ server 172.16.0.0 255.255.255.0 # CA証明書を指定する # Windowsでは、ディレクトリの区切りの\はエスケープして\\と書く ca "/etc/openvpn/keys/ca.crt" # サーバ証明書を指定する cert "/etc/openvpn/keys/server.crt" # サーバ秘密鍵を指定する key "/etc/openvpn/keys/server.key" # DHパラメータを指定する dh "/etc/openvpn/keys/dh1024.pem" # CRLはユーザアクセスのたび参照されるので、chrootするときはパスに注意 # パーミッションもopenvpnユーザがアクセスできるようにすること crl-verify "/keys/crl.pem" # 同じCommon Nameのクライアント証明書を許容する # ひとつのクライアント証明書で複数クライアントから接続する場合とか # duplicate-cn # 複数クライアントが接続している場合、クライアント同士の通信を許容する # client-to-client # どのユーザの権限でOpenVPNを動作させるか指定する # パッケージインストール時、openvpnユーザも作成されている # Windowsでは無効 user openvpn # どのグループの権限でOpenVPNを動作させるか指定する # パッケージインストール時、openvpnグループも作成されている # Windowsでは無効 group openvpn # このオプションを指定すると、起動時(のroot権限で動作しているとき)にしかtunデバイスをオープンしない persist-tun # このオプションを指定すると、起動時(のroot権限で動作しているとき)にしか鍵ファイルを読み込まない persist-key # /etc/openvpnディレクトリにchrootする chroot "/etc/openvpn" # サーバ背後のLANへのルーティングをクライアントにプッシュする #push "route 192.168.0.0 255.255.255.0" # サーバへのルーティングをプッシュ # VPN接続をするためのパケットがVPNトンネルを通るようなルーティングの指定をしてはいけない #route 192.168.0.1 255.255.255.255 X.X.X.X # クライアントのデフォルトルートをVPNにするよう、プッシュする push "redirect-gateway def1" # tls-authも使用できる # 鍵は openvpn --genkey --secret tls.key で作成する # オプションの最後の"0"は、サーバ側であることを示す # tls-auth "/etc/openvpn/keys/tls.key" 0
OpenVPNサーバは、クライアントが切断するとき、SIGUSR1を受信して再起動する。 このとき、tunデバイスを一度クローズして再オープンするのだが、tunデバイス/dev/net/tunはrootユーザとrootグループしかアクセスできない。 このため、userオプションでroot以外のユーザを指定すると、Permission Deniedでサーバのプロセスは終了してしまう。 persist-tunオプションを指定すると、プロセス起動時にroot権限で動作しているときしかtunデバイスにアクセスしないため、これを回避できる。
persist-keyオプションを指定すると、プロセス起動時にroot権限で動作しているときしか鍵を読み込まない。 プロセス起動時とchrootした後で鍵の絶対パスが異なるため、このオプションを指定する。 ただし、証明書失効リストだけはクライアントが接続してくるたび(つまりchrootした後)読み込まれるようなので、chrootした後の絶対パスで指定しないとエラーになる。
クライアント側の設定ファイル(クライアント側で実行)
/etc/openvpn/keysディレクトリを作成して、そこにサーバからもらってきたCA証明書ca.crt、クライアント証明書client1.crt・秘密鍵client1.keyをコピーする (Windowsでは、C:\Program Files\OpenVPN\config\keysフォルダを作成して、そこにCA証明書、クライアント証明書・秘密鍵をコピーする)。 秘密鍵はrootだけアクセスできるようにする。
/etc/openvpnディレクトリに、拡張子confの適当な名前のファイルを作る (Windowsでは、C:\Program Files\OpenVPN\configフォルダに、拡張子ovpnの適当な名前のファイルを作る)。 仮に、client.confとしておく。 これにクライアントの設定を書く。
# /etc/openvpn/client.conf # クライアントの設定 # OpenVPNのクライアント # IPアドレスはOpenVPNサーバからもらう client # tunデバイスを使って、レイヤ3のVPN接続をする dev tun # プロトコルにはTCPを使う # UDPを使うときは、proto udpとする proto tcp-client # 1194番ポート(デフォルト)で待つ # root権限で動作させない場合、特権ポートは使えない(WindowsではOK) port 1194 remote 192.168.0.1 # CA証明書を指定する # Windowsでは、ディレクトリの区切りの\はエスケープして\\と書く ca "/etc/openvpn/keys/ca.crt" # クライアント証明書を指定する cert "/etc/openvpn/keys/client1.crt" # クライアント秘密鍵を指定する key "/etc/openvpn/keys/client1.key" # サーバが提示する証明書が"nsCertType = server"でないと受け入れない ns-cert-type server # どのユーザの権限でOpenVPNを動作させるか指定する # パッケージインストール時、openvpnユーザも作成されている # Windowsでは無効 user openvpn # どのグループの権限でOpenVPNを動作させるか指定する # パッケージインストール時、openvpnグループも作成されている # Windowsでは無効 group openvpn # /etc/openvpnディレクトリにchrootする chroot "/etc/openvpn" # tls-authも使用できる # 鍵はサーバで作成したものをもらう # オプションの最後の"1"は、クライアント側であることを示す tls-auth "/etc/openvpn/keys/tls.key" 1
クライアント側では、persist-tunオプションやpersist-keyオプションはいらないと思う。
OpenVPNを起動(サーバ側で実行)
OpenVPNを起動する
# openvpn --config /etc/openvpn/server.conf Windowsでは、xxxx.ovpnファイルを右クリックして"Start OpenVPN on this config file"をクリックする。 Tue Feb 7 22:51:09 2006 OpenVPN 2.0.5 i386-redhat-linux-gnu [SSL] [LZO] [EPOLL] built on Jan 5 2006 Tue Feb 7 22:51:09 2006 WARNING: --keepalive option is missing from server config Tue Feb 7 22:51:09 2006 Diffie-Hellman initialized with 1024 bit key Tue Feb 7 22:51:09 2006 Control Channel Authentication: using '/etc/openvpn/keys/tls.key' as a OpenVPN static key file Tue Feb 7 22:51:09 2006 Outgoing Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication Tue Feb 7 22:51:09 2006 Incoming Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication Tue Feb 7 22:51:09 2006 TLS-Auth MTU parms [ L:1544 D:168 EF:68 EB:0 ET:0 EL:0 ] Tue Feb 7 22:51:10 2006 TUN/TAP device tun0 opened Tue Feb 7 22:51:10 2006 /sbin/ip link set dev tun0 up mtu 1500 Tue Feb 7 22:51:10 2006 /sbin/ip addr add dev tun0 local 172.16.0.1 peer 172.16.0.2 Tue Feb 7 22:51:10 2006 /sbin/ip route add 172.16.0.0/24 via 172.16.0.2 Tue Feb 7 22:51:10 2006 Data Channel MTU parms [ L:1544 D:1450 EF:44 EB:135 ET:0 EL:0 AF:3/1 ] Tue Feb 7 22:51:10 2006 chroot to '/etc/openvpn' and cd to '/' succeeded Tue Feb 7 22:51:10 2006 GID set to openvpn Tue Feb 7 22:51:10 2006 UID set to openvpn Tue Feb 7 22:51:10 2006 Listening for incoming TCP connection on [undef]:1194 Tue Feb 7 22:51:10 2006 TCPv4_SERVER link local (bound): [undef]:1194 Tue Feb 7 22:51:10 2006 TCPv4_SERVER link remote: [undef] Tue Feb 7 22:51:10 2006 MULTI: multi_init called, r=256 v=256 Tue Feb 7 22:51:10 2006 IFCONFIG POOL: base=172.16.0.4 size=62 Tue Feb 7 22:51:10 2006 MULTI: TCP INIT maxclients=1024 maxevents=1028 Tue Feb 7 22:51:10 2006 Initialization Sequence Completed クライアントが接続してくるまで待つ Tue Feb 7 22:53:19 2006 MULTI: multi_create_instance called Tue Feb 7 22:53:19 2006 Re-using SSL/TLS context Tue Feb 7 22:53:19 2006 Control Channel MTU parms [ L:1543 D:168 EF:68 EB:0 ET:0 EL:0 ] Tue Feb 7 22:53:19 2006 Data Channel MTU parms [ L:1543 D:1450 EF:43 EB:4 ET:0 EL:0 ] Tue Feb 7 22:53:19 2006 Local Options hash (VER=V4): 'c413e92e' Tue Feb 7 22:53:19 2006 Expected Remote Options hash (VER=V4): 'd8421bb0' Tue Feb 7 22:53:19 2006 TCP connection established with 192.168.1.1:4614 Tue Feb 7 22:53:19 2006 TCPv4_SERVER link local: [undef] Tue Feb 7 22:53:19 2006 TCPv4_SERVER link remote: 192.168.1.1:4614 Tue Feb 7 22:53:19 2006 192.168.1.1:4614 TLS: Initial packet from 192.168.1.1:4614, sid=b74ef2c9 08bd14b8 Tue Feb 7 22:53:20 2006 192.168.1.1:4614 CRL CHECK OK: /C=KG/ST=NA/L=BISHKEK/O=OpenVPN-TEST/emailAddress=me@myhost.mydomain Tue Feb 7 22:53:20 2006 192.168.1.1:4614 VERIFY OK: depth=1, /C=KG/ST=NA/L=BISHKEK/O=OpenVPN-TEST/emailAddress=me@myhost.mydomain Tue Feb 7 22:53:20 2006 192.168.1.1:4614 CRL CHECK OK: /C=KG/ST=NA/O=OpenVPN-TEST/CN=OpenVPN_Client_1/emailAddress=me@myhost.mydomain Tue Feb 7 22:53:20 2006 192.168.1.1:4614 VERIFY OK: depth=0, /C=KG/ST=NA/O=OpenVPN-TEST/CN=OpenVPN_Client_1/emailAddress=me@myhost.mydomain Tue Feb 7 22:53:20 2006 192.168.1.1:4614 Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key Tue Feb 7 22:53:20 2006 192.168.1.1:4614 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication Tue Feb 7 22:53:20 2006 192.168.1.1:4614 Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key Tue Feb 7 22:53:20 2006 192.168.1.1:4614 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication Tue Feb 7 22:53:20 2006 192.168.1.1:4614 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 1024 bit RSA Tue Feb 7 22:53:20 2006 192.168.1.1:4614 [OpenVPN_Client_1] Peer Connection Initiated with 192.168.1.1:4614 Tue Feb 7 22:53:20 2006 OpenVPN_Client_1/192.168.1.1:4614 MULTI: Learn: 172.16.0.6 -> OpenVPN_Client_1/192.168.1.1:4614 Tue Feb 7 22:53:20 2006 OpenVPN_Client_1/192.168.1.1:4614 MULTI: primary virtual IP for OpenVPN_Client_1/192.168.1.1:4614: 172.16.0.6 Tue Feb 7 22:53:21 2006 OpenVPN_Client_1/192.168.1.1:4614 PUSH: Received control message: 'PUSH_REQUEST' Tue Feb 7 22:53:21 2006 OpenVPN_Client_1/192.168.1.1:4614 SENT CONTROL [OpenVPN_Client_1]: 'PUSH_REPLY,route 192.168.0.0 255.255.255.0,route 172.16.0.1,ifconfig 172.16.0.6 172.16.0.5' (status=1) クライアントとの接続確立 クライアントが切断 Tue Feb 7 22:55:19 2006 OpenVPN_Client_1/192.168.1.1:4614 Connection reset, restarting [-1] Tue Feb 7 22:55:19 2006 OpenVPN_Client_1/192.168.1.1:4614 SIGUSR1[soft,connection-reset] received, client-instance restarting Tue Feb 7 22:55:19 2006 TCP/UDP: Closing socket クライアントが接続してくるまで待つ
終了するときは、Ctrl+C (Windowsの場合は、F4キーで終了)。
VPN接続が確立しているにもかかわらず、クライアントからサーバまたはサーバ背後のLANへ接続できない場合は、iptablesのINPUTチェインとFORWARDチェインを確認してみる。 あと、/etc/sysctl.confファイルのnet.ipv4.ip_forwardが"1"になっていることを確認する。
OpenVPNを起動(クライアント側で実行)
OpenVPNを起動する
# openvpn --config /etc/openvpn/client.conf Windowsでは、xxxx.ovpnファイルを右クリックして"Start OpenVPN on this config file"をクリックする。 Tue Feb 7 23:13:17 2006 OpenVPN 2.0.5 i386-redhat-linux-gnu [SSL] [LZO] [EPOLL] built on Jan 5 2006 Tue Feb 7 23:13:17 2006 WARNING: you are using user/group/chroot without persist-key/persist-tun -- this may cause restarts to fail Tue Feb 7 23:13:17 2006 Control Channel Authentication: using '/etc/openvpn/keys/tls.key' as a OpenVPN static key file Tue Feb 7 23:13:17 2006 Outgoing Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication Tue Feb 7 23:13:17 2006 Incoming Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication Tue Feb 7 23:13:17 2006 Control Channel MTU parms [ L:1543 D:168 EF:68 EB:0 ET:0 EL:0 ] Tue Feb 7 23:13:17 2006 Data Channel MTU parms [ L:1543 D:1450 EF:43 EB:4 ET:0 EL:0 ] Tue Feb 7 23:13:17 2006 Local Options hash (VER=V4): 'd8421bb0' Tue Feb 7 23:13:17 2006 Expected Remote Options hash (VER=V4): 'c413e92e' Tue Feb 7 23:13:17 2006 NOTE: chroot will be delayed because of --client, --pull, or --up-delay Tue Feb 7 23:13:17 2006 NOTE: UID/GID downgrade will be delayed because of --client, --pull, or --up-delay Tue Feb 7 23:13:17 2006 Attempting to establish TCP connection with 192.168.0.1:1194 Tue Feb 7 23:13:17 2006 TCP connection established with 192.168.0.1:1194 Tue Feb 7 23:13:17 2006 TCPv4_CLIENT link local: [undef] Tue Feb 7 23:13:17 2006 TCPv4_CLIENT link remote: 192.168.0.1:1194 Tue Feb 7 23:13:17 2006 TLS: Initial packet from 192.168.0.1:1194, sid=ff6ef3b2 9bea9843 Tue Feb 7 23:13:17 2006 VERIFY OK: depth=1, /C=KG/ST=NA/L=BISHKEK/O=OpenVPN-TEST/emailAddress=me@myhost.mydomain Tue Feb 7 23:13:17 2006 VERIFY OK: nsCertType=SERVER Tue Feb 7 23:13:17 2006 VERIFY OK: depth=0, /C=KG/ST=NA/O=OpenVPN-TEST/CN=OpenVPN_Server/emailAddress=me@myhost.mydomain Tue Feb 7 23:13:17 2006 Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key Tue Feb 7 23:13:17 2006 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication Tue Feb 7 23:13:17 2006 Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key Tue Feb 7 23:13:17 2006 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication Tue Feb 7 23:13:17 2006 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 1024 bit RSA Tue Feb 7 23:13:17 2006 [OpenVPN_Server] Peer Connection Initiated with 192.168.0.1:1194 Tue Feb 7 23:13:18 2006 SENT CONTROL [OpenVPN_Server]: 'PUSH_REQUEST' (status=1) Tue Feb 7 23:13:18 2006 PUSH: Received control message: 'PUSH_REPLY,route 192.168.3.0 255.255.255.0,route 172.16.0.1,ifconfig 172.16.0.6 172.16.0.5' Tue Feb 7 23:13:18 2006 OPTIONS IMPORT: --ifconfig/up options modified Tue Feb 7 23:13:18 2006 OPTIONS IMPORT: route options modified Tue Feb 7 23:13:18 2006 TUN/TAP device tun0 opened Tue Feb 7 23:13:18 2006 /sbin/ip link set dev tun0 up mtu 1500 Tue Feb 7 23:13:18 2006 /sbin/ip addr add dev tun0 local 172.16.0.6 peer 172.16.0.5 Tue Feb 7 23:13:18 2006 /sbin/ip route add 192.168.0.0/24 via 172.16.0.5 Tue Feb 7 23:13:18 2006 /sbin/ip route add 172.16.0.1/32 via 172.16.0.5 Tue Feb 7 23:13:18 2006 chroot to '/etc/openvpn' and cd to '/' succeeded Tue Feb 7 23:13:18 2006 GID set to openvpn Tue Feb 7 23:13:18 2006 UID set to openvpn Tue Feb 7 23:13:18 2006 Initialization Sequence Completed サーバとの接続確立 サーバから切断 Tue Feb 7 23:15:47 2006 event_wait : Interrupted system call (code=4) Tue Feb 7 23:15:47 2006 TCP/UDP: Closing socket Tue Feb 7 23:15:47 2006 Closing TUN/TAP interface Tue Feb 7 23:15:47 2006 SIGINT[hard,] received, process exiting
終了するときは、Ctrl+C (Windowsの場合は、F4キーで終了)。
サーバ起動時にOpenVPNも起動(サーバ・クライアントとも)
chkconfigを使って、サーバ起動時に開始するサービスとして登録する。
# chkconfig openvpn on
サーバ起動時に/etc/init.d/openvpnスクリプトが実行される。 このスクリプトは、/etc/openvpnディレクトリにあるxxxx.confファイルを*すべて*読み込む。 ログは、/var/log/messagesを見ること。
Windowsの場合は、"OpenVPN Service"サービスの"スタートアップの種類"を"自動"に設定する。 C:\Program Files\OpenVPN\configフォルダにあるxxxx.ovpnファイルを*すべて*読み込む。 ログは、C:\Program Files\OpenVPN\log\xxxx.logを見ること。
特権ポートで待つように見せかけるための設定(サーバ側)
サーバ側の設定ファイルで書いたように、OpenVPNは特権ポートを使うことができない。 しかし、イントラネットから外部へのアクセスが80番ポート宛や443番ポート宛だけに制限されていることがある。 この場合、iptablesなどでポートフォワーディングしなければならない。
# /etc/sysconfig/iptablesに追加
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -i eth0 -p tcp -d 192.168.0.1 --dport 443 -j DNAT --to-destination 192.168.0.1:1194