OpenVPN-L2IX (by nabeken)

OpenVPNを使って、L2IXをつくってみようという計画。AS 64529上で動いている OpenVPN へ接続します。
副作用として、非固定IPアドレスでも安定してピアリングできるようになります。

証明書の作り方

OpenVPNの配布物に easy-rsa というツールがあります。これはその名の通り、証明書の生成を簡単に行えるツールです。
FreeBSDでは /usr/local/share/doc/openvpn/easy-rsa にあるようです。

easy-rsa では、そのディレクトリ配下に鍵を保存するため、生成前にあらかじめ適当な場所へコピーしてください。

# cp -r /usr/local/share/doc/openvpn/easy-rsa /usr/local/etc/openvpn
# cd /usr/local/etc/openvpn/easy-rsa
# chmod +x ./vars
# /bin/sh
# . ./vars

ここまでで初期設定完了です。次は証明書署名要求を生成します。

# mkdir keys
# /bin/sh ../build-req ホスト名

証明書の各パラメータを対話的に入力するモードになります。以下の指定以外は好きな値を入れてください。
Organization Name (eg, company) :IHANet
Organizational Unit Name (eg, section) :IHANet-IX-OSAKA
Common Name (eg, your name or your server's hostname): ホスト名
証明書署名要求が keys/ホスト名.csr に生成されます。.keyが秘密鍵になります。生成されたホスト名.csr ファイル(証明書署名要求)を私までメール(nabeken at gmail.com)で送信してください。

署名したものを返信します。ファイル名はホスト名.crtになっているはずです。そのファイルを keys/ 以下へ保存してください。

# openssl dhparam -out dh1024.pem 1024

を実行して、dh1024.pem ファイルを作り、keys/ 以下へ保存してください。

# fetch http://projects.tsuntsun.net/~nabeken/ihanet-ix-ca.crt 等を実行し、keys/ 以下へ保存してください。

設定 (/usr/local/etc/openvpn/ix.conf)

tls-client
remote 60.56.118.148

port 1198
proto udp

# dev: tapデバイスの名前を指定してください (FreeBSDの場合: tap100など)
dev iha_ix0
dev-type tap

keepalive 10 120

# 適当なユーザ名に変えてください
user nobody
group nogroup

persist-key
persist-tun

verb 0

# 認証局の証明書
ca /usr/local/etc/openvpn/easy-rsa/keys/ca.crt

# 署名された証明書
cert /usr/local/etc/openvpn/easy-rsa/keys/ホスト名.crt

# 証明書の秘密鍵
key /usr/local/etc/openvpn/easy-rsa/keys/ホスト名.key

# dh パラメータ
dh /usr/local/etc/openvpn/easy-rsa/keys/dh1024.pem

# up に指定されたコマンドには引数が渡される
# cf.  # http://openvpn.net/index.php/open-source/documentation/manuals/65-openvpn-20x-manpage.html
up /usr/local/bin/ihanet_openvpn_up_iha_ix0.sh

# 最新版(2.1.r19)等だと外部コマンドを動かすのに以下の設定が必要なので、設定してください。以前のバージョンであれば設定しないでください。
script-security 2

設定できれば、openvpnを起動します。テスト目的なら、

# openvpn --config /usr/local/etc/openvpn/ix.conf --verb 4

とすれば、フォアグラウンドで起動します。tap?  が生成されているはずです。疎通確認は以下で可能です。

# ping6 -I tap? ff02::1
# ping6 -I tap? fe80::0001:0000:fc11:10
など。

Linux の up コマンドの一例

#!/bin/sh

TAP_DEV=$1
IF_ADDR="fe80::fc11:cafe:10/64"

ip link set "$TAP_DEV" up
ip addr add "$IF_ADDR" dev "$TAP_DEV"
ip link set mtu 1280 dev "$TAP_DEV"

FreeBSD の up コマンドの一例

#!/bin/sh
IFACE=$1

ifconfig $IFACE up
ifconfig $IFACE inet6 fe80::fc11:cafe:12/64
ifconfig $IFACE mtu 1280