OpenVPNはオープンソースのVPNソフトであり、本家はhttp://openvpn.net/にある。 (おそらく)2.1より有料のAccess Serverというものが提供されている。オープンソース版とAccess Serverの違いは以下であると思われる。
- メニューの「Community Software」からダウンロードできる。もちろんソース付で、無料で無制限の利用が可能。
- 「Access Server Downloads」などからダウンロードできる。ソースはついていない。Free Licenseを取得することにより、クライアント2つまでは同時接続できる。それ以上は、クライアント一つについて5ドル必要。
Access Serverの良い点としては、
- サーバ設定をウェブによって行うことができる。設定内容はややこしいので簡単ではないが、少なくともオープンソース版で設定ファイルを記述するよりは楽。
- Windows用GUIクライアントをダウンロードすることができる。同ウェブから接続設定済みのGUIクライアントをダウンロードすることができるので、これをインストールすれば設定不要でただちに接続することができる。
Linuxをクライアントとして使う場合には、相変わらずLinux用のパッケージをインストールし、設定ファイルを指定しなければならないのだが、これも以前に比べて簡略化されている。
対象とする環境
ここでは、Access Serverを使って、以下のような環境を作成することを目的とする。
- ルータの内側のLAN内にある一つのサーバ(CentOS)に、インターネット上のWindowsマシンからアクセスする。
- クライアントとするWindowsマシンは同時に二つまでとする。したがって、料金はかからない。
- ルータの内側のLAN内にあるサーバ以外のマシンにはアクセスできなくてもよい。また、二つのクライアントの間で相互にアクセスできる必要はない。OpenVPNにはこのようなオプション設定があるが、ほとんどの場合は不要である。ともあれ、外にあるWindowsマシンからサーバにアクセスできればよい。
- 認証はPAMとするので、あらかじめLinuxサーバ側にアクセスを行うユーザを登録し、そのパスワードを設定しておく必要がある。Access Serverには他にLDAPやRADIUSをサポートしているが、とりあえず最も簡単な方法を選択する。
- VPNサーバのプロトコルはTCPとし、UDPは使わない。UDPの方が転送効率が良いらしいが、どうしてもUDPで接続することができなかったため。
- 設定用のウェブUIは設定時のみに外からアクセスできるようにし、クライアントが接続できることを確認したらつぶしておく。
「Windowsクライアントからサーバへのアクセス」が何を意味するかと言えば、これはインターネットを介しているにも関わらず、あたかも同じLAN上にクライアントとサーバマシンが存在しているかのようにアクセスが可能ということになる。
テスト上の注意点としては、以下がある。
- サーバに設定する「Hostname or IP Adress」としてはグローバルなものでなければならない。すなわち、固定IPアドレスか、あるいはダイナミックDNSの場合はドメイン名が必要である。
- 接続テストはインターネット上からしかできない(ようだ)。Access Serverのインストールはサーバと同じLAN内のマシンから行うケースが多いと思われるが、少なくとも接続テストは外から行う必要がある(ルータがヘアピンNATの場合はできるかもしれない)。
- ルータのポート(デフォルトでは1194)に穴をあけて、リクエストをサーバに転送する必要がある。以下ではTCPとしているが、UDPも使ってみたい場合は両方。
ただし、設定ウェブはサーバと同じLAN内でも使用できる。
ダウンロード
http://openvpn.net/に行って、ユーザ登録し、Access Serverをダウンロードする。CentOSの場合には4と5にそれぞれ32ビット・64ビットの選択肢がある。
さらに、License KeyにてFree Licenseを取得しておく、これはハイフンで区切られた12桁の文字列で、Access Serverに入力するとActivateするようである。「Get Another Free License Key」でいくつでも作成することができるが、これは複数のサーバを作成したい場合にのみ意味がある。一つのサーバに複数のFree Licenseを入力しても最大で2クライアントしか扱うことはできない。
サーバのインストール
Access Serverのダウンロードページに「System Administrator Guide」というPDFが用意されているし、「Installation Overview」と「QuickStart Guide」というメニューからも簡単なインストール方法と設定手順が記述されている。
要するにダウンロードしたrpmをインストールし、/usr/local/openvpn_as/bin/ovpn-initというスクリプトを実行して、初期設定を行うということである。ここで初期設定した内容によって、設定とクライアントプログラムダウンロードを行うウェブアプリにアクセスすることができる。
初期設定の内容は、このウェブアプリにて後から変更することができるのだが、しかし設定を行った後でダウンロードしたクライアントプログラムは設定変更すると動作しなくなる点には注意する。
初期設定
/usr/local/openvpn_as/bin/ovpn-initスクリプトを実行すると、数々の質問がされるのでそれに答える。 ただし、これはほとんど設定ウェブにアクセスできるようにすることが目的で、そちらで設定を行わないとVPNサーバは正しく動作しない。
[root@neo ~]# /usr/local/openvpn_as/bin/ovpn-init OpenVPN Access Server Initial Configuration Tool ------------------------------------------------------ OpenVPN Access Server End User License Agreement (OpenVPN-AS EULA) 1. Copyright Notice: OpenVPN Access Server License; Copyright (c) 2009-2010 OpenVPN Technologies, Inc.. All rights reserved. "OpenVPN" is a trademark of OpenVPN Technologies, Inc. 2. Redistribution of OpenVPN Access Server binary forms and documents, are permitted provided that redistributions of OpenVPN Access Server binary forms and documents must reproduce the above copyright notice. 3. You agree not to reverse engineer, decompile, disassemble, modify, translate, make any attempt to discover the source code of this software, or create derivative works from this software. 4. The OpenVPN Access Server is bundled with other open source software components, some of which fall under different licenses. By using OpenVPN or any of the bundled components, you agree to be bound by the conditions of the license for each respective component. See /usr/local/openvpn_as/license.txt in the Access Server distribution for more info. 5. THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL OPENVPN TECHNOLOGIES, INC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Please enter 'yes' to indicate your agreement [no]: yes <----------- イエス Once you provide a few initial configuration settings, OpenVPN Access Server can be configured by accessing its Admin Web UI using your Web browser. Please specify the network interface and IP address to be used by the Admin Web UI: (1) all interfaces: 0.0.0.0 (2) eth0: 192.168.233.100 Please enter the option number from the list above (1-2). > Press Enter for default [2]: 1 <-------------------------------- どちらを選んでも大差はない Please specify the port number for the Admin Web UI. > Press ENTER for default [943]: <------------------------------- 不都合なければデフォルト Please specify the TCP port number for the OpenVPN Daemon > Press ENTER for default [1194]: <------------------------------ 不都合なければデフォルト Should client traffic be routed by default through the VPN? > Press ENTER for default [yes]: no <----------------------------- これはnoにしておく。※1 Should RFC1918 private subnets be accessible to clients by default? > Press ENTER for default [yes]: no <----------------------------- 今回必要なし。noにする To initially login to the Admin Web UI, you must use a username and password that successfully authenticate you with the host UNIX system (you can later modify the settings so that RADIUS or LDAP is used for authentication instead). You can login to the Admin Web UI as 'root' with your existing root password or specify a different user account to use for this purpose. If you choose to use a non-root account, you can create a new user account or specify an existing user account. Do you wish to login as 'root'? > Press ENTER for default [yes]: no <----------------------------- 一応root以外にする > Specify the username for an existing user or for the new user account: ysugimura <-- ユーザ名入力 Note: This user already exists. > Please specify your OpenVPN-AS license key (or leave blank to specify later): <--- 後で設定 Initializing OpenVPN... Writing as configuration file... Perform sa init... Wiping any previous userdb... Creating default profile... Modifying default profile... Adding new user to userdb... Modifying new user as superuser in userdb... Getting hostname... Hostname: XXXXXXXXXX Preparing web certificates... Getting web user account... Adding web group account... Adding web user account... Adding web group... Adjusting license directory ownership... Initializing userdb... Generating init scripts... Generating PAM config... Generating init scripts auto command... Starting openvpnas... NOTE: Your system clock must be correct for OpenVPN Access Server to perform correctly. Please ensure that your time and date are correct on this system. Initial Configuration Complete! You can now continue configuring OpenVPN Access Server by directing your Web browser to this URL: https://192.168.233.100:943/admin Login as "ysugimura" with the same password used to authenticate to this UNIX host. See the Release Notes for this release at: http://www.openvpn.net/access-server/rn/openvpn_as_1_3_5.html
※1「Should client traffic be routed by default through the VPN?」の設定
「no」にすると「split tunneling」を許す設定になる。つまり、おそらく多くが期待する通り、対象サーバに対するリクエストのみが対象サーバに送信され、他のサーバへのリクエストは直接そのサーバに送られる。例えば、クライアントからのwww.google.comへのwebアクセスは直接的にgoogleに送られる。
「yes」にすると、デフォルトのrouteが対象サーバになる。 例えば、www.google.comへのwebアクセスも対象サーバに送られ、サーバ内で処理された後その応答が対象サーバから返されることになる。 なぜ、このような設定があるかと言うと、クライアントを踏み台にして対象サーバへ外部からアクセスされることを阻止するためである。
クライアントはセキュアに対象サーバに接続しているものの、そのクライアントが悪意のあるサーバと自由に接続している状態であると、悪意サーバがクライアントを踏み台にして対象サーバにアクセスする可能性があるということらしい。
ウェブによる設定
上で指定された(例の場合は、https://192.168.233.100:943/admin)にブラウザからアクセスする。このときブラウザに「証明書が変だ」と言われるが例外として追加して構わない(プロトコルはhttpではなく、httpsであることに注意)。
設定ウェブの使っている証明書は、いわゆる「オレオレ証明書」であって、単に通信を暗号化する役割しか果たしていない。
ここで最低限設定する必要があるのは以下(それぞれ設定画面の左側メニューをクリック)。
License
OpenVPN本家で取得したFree Licenseを入力する。複数入力できるようになっているが、Free Licenseを複数入力しても全く意味がない。一つにしておく。
Server Network Settings
「Hostname or IP Address」が「192.168.233.100」等になっているので、これをグローバルなものに変更する。
- 固定IPの場合は、IPアドレスかそのドメイン名
- ダイナミックDNSの場合は、そのドメイン名
「Service Forwarding」のチェックを二つともはずす。
「Save Settings」をクリックする。
VPN Settings
デフォルトで、10.8.0.0/24になっているネットワークアドレスとマスクを、もし好みがあれば変更する。 おそらく複数のサーバにOpenVPNを入れてアクセスしたい場合は、これを変更する必要がある。
「Save Settings」をクリック。
上記を設定したら、「Status Overview」にて「Start the Server」をクリックする。
※上記の設定は、最新バージョンでは変更されている。初期状態では、
- Dynamic IP Address Network
- Static IP Adoress Network(Optional)
- Group Default IP Addoress Network(Optional)
等にわかれているが、Dynamic IP Address Networkを 「10.8.0.0」「24」等にすればよいと思われる。
クライアントからの接続準備
クライアントから接続するには、以下のいずれかを準備する。
- クライアントがWindowsの場合はGUIアプリケーション
- クライアントがLinuxの場合は、client.ovpnという設定ファイルと、openvpn-2.1のインストール。
以下では、Windowsの場合を説明する。まず、サーバ設定を行った同じウェブサイトに/adminなしでアクセスする。たとえば、
とする。そこから「Windows Installer」をダウンロードし、これをインストールする。
実際の接続
インストールしたWindowsクライアントを起動し、ユーザ名・パスワードの入力を行うと、サーバに接続する。 接続すると「10.8.0.2」とか「10.8.0.3」などというアドレスが表示されるが、これはクライアント側のアドレスである。 サーバ側のアドレスは(デフォルトでは)「10.8.0.1」になるので注意。
インターネットに直接接続しているネットワークインターフェースの場合
これまではサーバがルータの内側にあることを前提にしていた。この場合、ルータがファイアウォールとなっているので、特にサーバ自体のファイアウォールの設定は不要であった。
これに対し、例えば専用レンタルサーバなど、ネットワークインターフェースがただ一つで、それがインターネットに直接接続している場合はどうするか?次のようにファイアウォール(iptables)を設定すればよいかと思われる(まだ試してはいない)。
- 物理的なネットワークインターフェースについては1194ポート(とSSHやHTTP等の必要なポート)以外のパケットはすべて破棄する。
- tun/tapインターフェースについてはすべて許可する。
クライアントからのリクエストは1194ポートを通じてOpenVPNに転送され、OpenVPNはその正当性を確認した後にtunあるいはtapの仮想的なインターフェースに送られる。このため、tun/tapインターフェースについてはセキュアであることがわかっているので、このインターフェースについてはフィルタリングする必要がない。
OpenVPN-ASが勝手にiptablesをいじる件について
OpenVPN-ASサーバは起動するとiptablesを勝手に呼び出して「適切に」設定する。 この件については以下にドキュメントがある。
How to disable iptables modification by Access Server
しかし、この設定を行ってもWeb UIを無効にすることはできない模様。 confdbaツールにどのようなキーを与えればWeb UIの有効・無効を制御できるのか一切不明。 condba自体のマニュアルがどこにも存在しない。