事前共有鍵(PSK)を用いた単純なOpenVPNの設定

さくらVPSOpenVPNサーバにしました。サーバ環境はDebian(sid)(d:id:rigarash:20101010#1286695769)です。クライアントは最大で1台のみの接続(私のノートPCからのみ)であり、OpenSSLのCA運用に自信がないので、事前共有鍵(Pre-Shared Key, PSK)を利用しました。これは、出張の時などに安全な通信を行うためのもので、クライアント(DebianWindows)からの通信がすべてさくらVPS経由になるようにします。

サーバ側の設定

まず、openvpnをインストールします。

$ sudo -H aptitude install openvpn

次に、事前共有鍵(/etc/openvpn/winclient.key)を生成します。

$ sudo -H openvpn --genkey --secrett /etc/openvpn/winclient.key

作成したサーバ設定ファイル(/etc/openvpn/winclient.conf)は以下の通りです。一応権限をnobody/nogroupに落としています。オプションの説明は、openvpn(8)に書いてあります。

$ cat /etc/openvpn/winclient.conf
port 1194
proto udp
dev tun
ifconfig 192.168.200.1 192.168.200.2
user nobody
group nogroup
persist-key
persist-tun
secret /etc/openvpn/winclient.key
status /etc/openvpn/winclient.log

OpenVPNをifup/ifdownできるようにします。ip_forwardの設定と、NATの設定が必要になります。

$ cat /etc/network/interfaces
...
## OpenVPN(winclient)
auto tun_winclient
iface tun_winclient inet manual
        pre-up iptables -t nat -A POSTROUTING -s 192.168.200.2/32 -j MASQUERADE
        openvpn winclient
        post-down iptables -t nat -D POSTROUTING -s 192.168.200.2/32 -j MASQUERADE
$ cat /etc/default/openvpn
...
AUTOSTART="none"
...
$ cat /etc/sysctl.conf
...
net.ipv4.ip_forward=1
...

クライアント(Windows Vista (x64))の設定

私がWindows Vista (x64)ユーザのため、他の環境でテストしてませんが、Windows XP以降ならあまり変わらないはずです。UACがあるので少し面倒でした。
まず、OpenVPNのサイト(Community Downloads | OpenVPN)から、"OpenVPN Community Software Windows Client Download"をダウンロードして、インストールします。
次に、メモ帳を管理者権限で起動して、以下の内容をC:\Program Files (x86)\OpenVPN\config\winclient.ovpnとして保存します。

remote XXX.XXX.XXX.XXX
port 1194
proto udp
dev tun
ifconfig 192.168.200.2 192.168.200.1
redirect-gateway bypass-dhcp bypass-dns def1
persist-key
persist-tun
secret winclient.key
status winclient.log

同様にC:\Program Files (x86)\OpenVPN\config\winclient.keyをサーバから持ってきます。鍵ファイルの改行コードはCR+LFに変換しておきました。(しないと動かないかどうかは未検証)
最後に、OpenVPN GUIを管理者権限で起動して、右クリック->"Connect"が成功すればOK。

クライアント(Debian)の設定

まず、openvpnをインストールします。

$ sudo -H aptitude install openvpn

クライアント側の設定ファイル(/etc/openvpn/winclient.conf)を作成します。redirect-gatewayが肝で、サーバ側に通信を振ってくれます。なお、私はローカルにunbound(DNSキャッシュサーバ)を立てているので必要ないのですが、一般的には、DNSの設定(/etc/resolv.confの処理等)が必要になります(未検証)。

$ cat /etc/openvpn/winclient.conf
remote XXX.XXX.XXX.XXX
port 1194
proto udp
dev tun
ifconfig 192.168.200.2 192.168.200.1
redirect-gateway def1
secret /etc/openvpn/winclient.key
status /etc/openvpn/winclient.log

次に、サーバ側で作成した/etc/openvpn/winclient.keyをローカルに準備(コピー)します。パーミッションは0600に合わせましょう。

$ ls -lAFi /etc/openvpn
...
269219 -rw-r--r-- 1 root root  432 2010-10-12 11:12 winclient.conf
269145 -rw------- 1 root root  636 2010-10-12 06:12 winclient.key
...

クライアント側でもifup/ifdownを利用することにします。クライアント側ではiptablesの設定は必要ないため、単純です。

$ cat /etc/network/interfaces
...
## OpenVPN(winclient)
auto tun_winclient
iface tun_winclient inet manual
        openvpn winclient
$ cat /etc/default/openvpn
...
AUTOSTART="none"
...