====== 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 ====
[[https://play.google.com/store/apps/details?id=net.openvpn.openvpn&hl=ja|OpenVPN Connect]]をインストールして利用する。
SDカードに、クライアント用の鍵一式および、ovpnファイルをコピーしておく。
アプリを起動したら、メニューからImportでSDカード内のovpnファイルを指定すると、接続が利用可能になる。
あとはConnect / Disconnectをするだけで、VPNを利用できる。
==== iOS ====
[[https://itunes.apple.com/jp/app/openvpn-connect/id590379981?mt=8|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
-----BEGIN CERTIFICATE-----
...snip...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
...snip...
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
...snip...
-----END PRIVATE KEY-----
-----BEGIN OpenVPN Static key V1-----
...snip...
-----END OpenVPN Static key V1-----
[[start]]