ユーザ用ツール

OpenVPN

概要

OpenVPNは、VPNの実装の一つである。 モバイル環境等からのアクセスをVPN化することで、よりセキュアに、かつ、特定の国や場所からアクセス出来ないサービスへのアクセスを可能にし、また、家庭内のLANへのスムースなアクセスを実現することが可能となる。

導入

OpenVPNを利用するには、サーバー側の設定および、アクセスするクライアント側の設定が必要となる。

OpenSSHを利用した、鍵の作成および、VPNとLANの間のルーティングの設定が必要となるので、それなりの手間がかかる。

構成

WAN -- [ルータ] -- LAN -- [OpenVPNサーバ] -- VPN
               192.168.100.0/24            192.168.200.0/24
     udp 1194 -> NAT ->  192.168.100.2:1194 

ネットワークの構成は上のようであるとする。サーバーはBBルータを介してインターネットに接続し、LANは192.168.100.0/24 のアドレス空間を持つ。OpenVPNサーバは192.168.100.2で、1194/udp で待ち受ける。BBルータは192.168.100.2:1194 へのNATを行って、外部からリクエストがサーバへ通るようにしておく。

サーバ側

前提条件

サーバ側は、トンネルデバイス(/dev/net/tun)が存在していることが、条件となる。そうでない場合は適切にカーネルをリビルドする必要があるが、基本的に Vine Linux 6.3/Debian GNU/Linux 7(Wheezy)のどちらでも、この点は問題は無かったので、多くのディストリビューションでそのまま利用可能であろう。

あとは、OpenVPNのパッケージをインストールしておく。

鍵の作成

OpenVPNのパッケージには大抵easy-rsaという鍵作成を手伝ってくれるツールが同梱されている。Vine Linuxの場合は、

/usr/share/openvpn/easy-rsa/2.0

に配置されている。このままこの場所で作業するのではなく、次のようにして適当な作業場所を用意して行う。

# cd /usr/share/openvpn/easy-rsa/2.0
# make DESTDIR=~/openvpn install
...
# cd ~/openvpn

以下の作業は、~/openvpn で行う。

作成する鍵は全部で、Diffie Hellmanパラメータ、CA(認証局)、サーバー鍵、TLS鍵および、クライアント毎の鍵になる。

鍵生成の前には必ず作業ディレクトリで varsを読み込む。(読み込まないと文句を言われる)

# cd ~/openvpn
# source ./vars

全てに先立ち鍵をクリアする。これは、全く新規の場合だけ行う。CA鍵などを作成したあとでやると全てが無になるので注意する。

# ./clean-all

次にDiffie Hellmanパラメータを作成。

# ./build-dh

次にCA鍵を作成。質問には真面目に答える。(以下はあくまでサンプル)

# ./build-ca
Country Name (2 letter code) []:JP
State or Province Name (full name) []:Kanagawa
Locality Name (eg, city) []:Yokohama
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:www.example.com
Name []:.
Email Address []:example@example.com

続いてサーバー鍵を生成する。質問は同じくきちんと答える。

# ./build-key-server server
Country Name (2 letter code) []:JP
State or Province Name (full name) []:Kanagawa
Locality Name (eg, city) []:Yokohama
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:www.example.com
Name []:.
Email Address []:example@example.com
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: 
An optional company name []:
 
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y

最後にTLS鍵を生成して、サーバ側に必要な鍵の生成(初回のみ)は完了。

# openvpn --genkey --secret keys/ta.key

これだけ、easy-rsaによるラップがないので注意。

生成された鍵は、適当な場所にまとめる必要がある。ここでは /etc/openvpn/certs と /etc/openvpn/private に置くことにする。

# mkdir /etc/openvpn/certs
# mkdir /etc/openvpn/private
# chmod 755 /etc/openvpn/certs
# chmod 700 /etc/openvpn/private
# cd ~/openvpn/keys
# install -o root -g root -m 0644 ca.crt server.crt dh1024.pem /etc/openvpn/certs
# install -o root -g root -m 0600 server.key /etc/openvpn/private

設定ファイル

ひな形が /usr/shares/doc/openvpn-2.1.3/sample-config-files/server.conf にあるので、これを /etc/openvpn にコピーして改変する。

# cp /usr/share/doc/openvpn-2.1.3/sample-config-files/server.conf /etc/openvpn

ポイントだけ以下に列記する。

port 1194
proto udp # tcpにすればTCPも使える
dev tun
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/server.crt
key /etc/openvpn/private/server.key
dh /etc/openvpn/certs/dh1024.pem
server 192.168.200.0 255.255.255.0         # VPNのアドレス空間
push "route 192.168.100.0. 255.255.255.0"  # LANへのルーティング情報
push "dhcp-option DNS 192.168.100.3"       # LAN 内のDNS1
push "dhcp-option DNS 192.168.100.4"       # LAN 内のDNS2
tls-auth /etc/openvpn/private/ta.key 0
cipher AES-128-CBC
comp-lzo
user nobody
group nobody
status /var/log/openvpn-status.log
log-append /var/log/openvpn.log
verb 3
management localhost 7505

あとは、起動するだけである。

# service openvpn start

必要に応じて、自動起動するようにする

# service openvpn on

ルーティング

NATを有効にするには、/proc/sys/net/ipv4/ip_forward に 1 を書き込む必要がある。

# echo 1 > /proc/sys/net/ipv4/ip_forward

但し、この値はリブートする度に元に戻ってしまうので、恒常的にONにする場合は、/etc/sysctl.conf の中に、

net.ipv4.ip_forward = 1

と書いておけばよい。

ルーティングは以下のようにする。

# iptables -A INPUT -p udp --dport 1194 -j ACCEPT
# iptables -A INPUT -i tun+ -j ACCEPT
# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A FORWARD -i tun+ -j ACCEPT
# iptables -A FORWARD -m state --state NEW -o eth0 -j ACCEPT
# iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -m state --state NEW -o eth0 -j ACCEPT
# iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -o eth0 -j MASQUERADE

動作が確認できたら、保存しておく。

# service iptables save
# service iptables restart

クライアント側

共通・鍵および設定ファイルの作成

クライアント鍵は、サーバ上でeasy-rsaを利用して作成する。 質問には適切に回答すること。

# cd ~/openvpn
# source ./vars
# ./build-key client01
Country Name (2 letter code) []:JP
State or Province Name (full name) []:Kanagawa
Locality Name (eg, city) []:Yokohama
Organization Name (eg, company) []:.
Organizational Unit Name (eg, section) []:.
Common Name (eg, your name or your server's hostname) [client01]:
Name []:.
Email Address []:example@example.com
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

適当なディレクトリに作成した鍵、及び作成済みの以下の鍵を集める。

# mkdir ~/openvpn/client01
# cd ~/openvpn/keys
# cp -p ca.crt server.crt ta.key client01.crt client01.key ~/openvpn/client01

同じディレクトリに、クライアント側の定義ファイルを作成する。

# cd ~/openvpn/client01
# vi client01.ovpn
client
tls-auth ta,key 1
dev tun
proto udp
cipher AES-128-CBC   # server と同じモノにする。
remote openvpn.example.com 1194
ca ca.crt
cert client01.crt
key client01.key
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3

UTF-8の文字コードでこれを保存しておく。

共通・鍵の失効

万が一、クライアント鍵が不正に利用された場合、それを失効させることが可能である。

# cd ~/openvpn
# source ./vars
# ./revoke-full client01
# cd keys
# install -o root -g root -m 0644 crl.pem /etc/openvpn/certs

失効ファイルを作成したら、/etc/server.conf に次の行を追加する。(追加済みならそのまま)

crl-verify /etc/openvpn/certs/crl.pem

サーバは再起動しておく。

# service openvpn restart

Windows

Linux

Android

OpenVPN Connectをインストールして利用する。

SDカードに、クライアント用の鍵一式および、ovpnファイルをコピーしておく。

アプリを起動したら、メニューからImportでSDカード内のovpnファイルを指定すると、接続が利用可能になる。

あとはConnect / Disconnectをするだけで、VPNを利用できる。

iOS

OpenVPN Connectをインストールして利用する。

iTunesからovpnファイルを取り込む方法が一般的だが、何らかの方法で取り込んだ、ovpnファイルを、OpenVPN Connectに読み込ませることで利用することも出来る。

iOS版は、鍵ファイルが別ファイルに分割されているとうまく扱えないので、鍵ファイルを全てovpnファイルに取り込んだ形のファイルを用意する必要がある。

tls-auth, ca, key, 及びcert の各行は全て削除して、代わりに、XMLライクな記述で、鍵ファイルの中身を取り込んでおく。

tls-auth の最後の1は key-direction で指定する。

この内容のovpnファイルを取り込めばiOSでもVPNが利用可能になる。

client
key-direction 1
dev tun
proto udp
remote openvpn.example.com 1194
cipher AES-128-CBC
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3

<ca>
-----BEGIN CERTIFICATE-----
...snip...
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
...snip...
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
...snip...
-----END PRIVATE KEY-----
</key>
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
...snip...
-----END OpenVPN Static key V1-----
</tls-auth>

start

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also, you acknowledge that you have read and understand our Privacy Policy. If you do not agree, please leave the website.

More information