ユーザ用ツール

サイト用ツール


openvpn

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

openvpn.txt · 最終更新: 2016/03/31 14:05 by 127.0.0.1