OpenVPNの設定

  • モチベーション(過去重複ネタ)
    • 現在のインターネットではネットワークをいくつものセグメントに分けて、グローバルIPアドレスとプライベートIPアドレスという分別をしてアドレスの枯渇を防いでいる。プライベートIPはインターネットから隔離されたプライベートネットワークの中でのみ有効である。ホームネットワークのような状態が身近だろう。このプライベートIPしか持てない端末がインターネットの他のPCと通信を行えるのはルータがあるからである。現在のルータはNAT機能を備えたものが主流であり、これなくしてはアドレス範囲が限られた現在のIPv4においてこれほど多様なネットワークの使い道はできい。逆を言えばアドレス範囲の設け方をケチりすぎたためにこのような面倒な状況になってしまっている(実際の真意はわからない)。ルータ自体は「WAN(Wide Area Network)側IP」と「LAN(Local Area Network)側IP」という2つのアドレスを扱い、WAN側IPに送信されてきた信号をLAN内の端末へ送信する。通信にはアプリケーションによって異なる「ポート番号」が用いられるようになっているが、ルータではWAN側からきたどのポート番号への信号を内側へ送信するかという設定ができるようになっている。これを「ポートフォワーディング」と呼んでいる。昔はIPマスカレイドなどと呼んでいた気もするがなにが違うのかは忘れた。ルータにはルータのLAN側IPアドレスへブラウザなどを使ってアクセスすると、これらの設定ができるページが見れるものが今はほとんどであろう。UPnPに対応しているルータ(これが主流ではあるが完ぺきではないらしい)であればUPnP規格に対応した命令文をプログラマティックに送信してやることもできるがこれはプログラマ向けである。ポートフォワード処理を終えルータのWAN側IPのポートフォワード済みポートへ信号を送信すれば、そのポートを開放しているLAN内のクライアントへパケットが送信される。
    • VPN(Virtual Private Network)の構築も基本的には上のような処理が前提となっているが、VPNではクライアントに仮想のIPアドレスが設定される。イメージとしてはルータのWAN側IPとポートの情報が仮想IPアドレスマッピングされるような感覚で使える。つまりグローバルIPを持たないLAN内端末へ外部からアクセスすることができるようになる」のである。正直「なんで今のインターネットはこんなことをするのが小難しいの?」と思うのが普通のユーザだろう。マニアでも最初に一度はそう思うはずだ。しかしこういうものになってしまったのである。
  • OpenVPN
    • これはオープンソースGNUライセンスのプロジェクトで、上記VPNを構築するためのアプリケーションである。UDP/TCPプロトコルに対応しており、ブリッジ接続などを行っている場合の設定もできるがこれはルータ一つを対象にした時よりも若干複雑な設定が必要となる。TCPプロトコルは実験的に実装されていたようだが、HOWTOにもそのような記述がなくなっていたような気がするので大丈夫なのだろうか。一応pingは通った。
  • 設定
    • OpenVPNでは公開鍵暗号方式を用いて認証を行っている。それらの作成や配置方法についてはHOWTOに書いてあるとおりでよい。はまったところだけ解説をしておく。コロンが先頭についているものはコメントアウト

■サーバ側設定ファイル

;local a.b.c.d
port 1194
proto tcp
;proto udp
;dev tap
dev tun
;dev-node MyTap
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
push "route 192.168.0.0 255.255.255.0" // クライアントもしくはサーバの存在するサブネットを指定してやらないとルーティングしてくれない
;push "route 192.168.20.0 255.255.255.0"
;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
;learn-address ./script
;push "redirect-gateway"
;push "dhcp-option DNS 10.8.0.1"
;push "dhcp-option WINS 10.8.0.1"
;client-to-client
;duplicate-cn
keepalive 10 120
;tls-auth ta.key 0 # This file is secret
;cipher BF-CBC        # Blowfish (default)
;cipher AES-128-CBC   # AES
;cipher DES-EDE3-CBC  # Triple-DES
comp-lzo
;max-clients 100
;user nobody
;group nobody
persist-key
persist-tun
status openvpn-status.log
;log         openvpn.log
;log-append  openvpn.log
verb 3
;mute 20
    • ルーティングの設定のところの説明がよくわからなかったのでほおっておいたらそこが原因でルーティングしてくれておらずはまった。クライアントがサーバの後ろにあるサブネットにアクセスできるように、そのサブネットのアドレス範囲を教えてやれということ。またサーバ後方のサブネットの端末に別のサブネットにあるOpenVPNクライアントの仮想IPアドレス範囲を教えてやる場合にも使用する。あとの部分はプロトコルの設定、ポート番号等をクライアントの設定と合わせてやれば問題ないだろう。クライアント設定ファイル内ではルータのWAN側アドレス(ホスト名の場合が一般的だろう)を正確に設定するようにする。
    • ルータのWAN側IPアドレスはころころ変わるので(そういうもの)、IPアドレスとして扱うのではなくダイナミックDNSサービス等を利用し、ルータのWAN側IPの変化を監視するソフトウェアを常駐させアドレスの変化を監視し、常にダイナミックDNSサービスで取得したホスト名でそのルータへアクセスできるようにしておくとよいだろう。
  • Hamachi
    • 確かこれはTCPに対応していなかったように記憶している。今はどうか知らないが、TCPに対応しているということでOpenVPNを選択。
    • しかし使用するまでの簡単さという点ではHamachiが大きくリードしている。ほぼインストールするだけであとはGUIからちょこっと設定すれば動いた。素晴らしい成果である。