====== 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]]