OpenVPNで拠点間L2接続


OpenVPNで拠点間L2接続を行う方法

拠点間をVPNで繋げたいけど、DHCPサーバを別途作りたくない&リレーサーバとか面倒、ルータ越えが面倒なアプリがある等、別セグメントにしたくないあなたへ。

ネットワーク図と解説

Server側は固定IP16プラン、Client側はアドレス不定接続とした環境において、拠点間をL2VPNした時の構成を想定しています。

OpenVPN機はDebianです

上記の通り192.168.0.0/24が拠点をまたがってあたかもひとつのスイッチにつながっているように見えます。
(10.0.0.239/28はグローバルアドレスだと思ってください)

  • OpenVPN機の物理ポート数
    今回の構成は、Client側は1ポート、Server側は2ポートを使用しています。
    TIPS: Server側で1ポートのみ、逆にClientで2ポート使う構成も可能ですので、機器や既存のネットワーク制限回避が比較的簡単です。
    1ポート構成ならば、既存のネットワークへ「ポン付け」するのも簡単でしょう。
  • 192.168.0.201に設定するdefault gateway
    冒頭でも説明したとおり単一のセグメントとなります。
    例えば192.168.0.201の機器に設定するdefault gatewayは192.168.0.109... ではありません
    192.168.0.200と通信するだけなら192.168.0.201のdefault gatewayは (=設定する必要なし)が正解です。

その他、アイデア

  • Client機にPPPoE接続接続させるようにすれば、Routerが不要になります。
  • Server機のtapデバイスを増やせば、接続拠点を増やすことができます。

設定

> Server側

$ sudo apt-get install bridge-utils openvpn easy-rsa

注: Debianはeasy-rsaがありません。openvpnの中に入っています。

証明書作成

$ sudo su -
# cp -r /usr/share/easy-rsa/ /etc/openvpn/
# cd /etc/openvpn/easy-rsa
# cat << EOT >> vars 
export KEY_COUNTRY="JP"
export KEY_PROVINCE="Tokyo"
export KEY_CITY="Chiyoda-ku"
export KEY_ORG="CorpName"
export KEY_EMAIL="[email protected]"
export KEY_OU="OUName"
EOT
# source ./vars
# ./clean-all
# ./build-ca  >>ダイアログはEnterで進める
# ./build-key-server server  >>ダイアログはEnterもしくはYで進める
# ./build-dh  >>数分かかります
# ./build-key client  >>ダイアログはEnterもしくはYで進める
# exit

注: Debianでは
# cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /etc/openvpn/としてください

$ sudo mkdir /etc/openvpn/ccd
/etc/openvpn/ccd/client
iroute 192.168.0.0 255.255.255.0
/etc/openvpn/tap0.conf
dev tap0

port 1194
tun-mtu 1400
mssfix 1280
fragment 1280

server-bridge
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key
dh /etc/openvpn/easy-rsa/keys/dh2048.pem

keepalive 10 60
comp-lzo
persist-key
persist-tun

client-config-dir ccd
route 192.168.0.0 255.255.255.0

verb 3

> Client側

$ sudo apt-get install bridge-utils openvpn
$ sudo mkdir -p /etc/openvpn/keys
$ sudo chmod 700 /etc/openvpn/keys

Server側で生成した/etc/openvpn/easy-rsa/keys/{ca.crt,client.crt,client.key}をClient側の/etc/openvpn/keys/にコピー

/etc/openvpn/tap0.conf
dev tap0

tun-mtu 1400
mssfix 1280
fragment 1280

client

remote 10.0.0.234 1194
nobind

ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/client.crt
key /etc/openvpn/keys/client.key

comp-lzo
persist-key
persist-tun
keepalive 10 60

verb 3

起動/再接続等の運用

起動など

$ sudo service openvpn start|stop|reload|restart

注意: OpenVPNの接続越しにOpenVPN自体の設定変更をするときは、接続が切れたりすることがあるので原則として行わないのが吉です。
この辺、いい方法が無いのでしょうか。。。nohupとかでなんとかなるのかな?

ログ

/var/log/daemon.log

再接続

OpenVPNの/etc/openvpn/*.conf内のkeepaliveで設定
再接続に要する時間は、概ねkeepaliveの設定時間通りです。

転ばぬ先の杖

br0にアドレスを割り当てている関係上、brctlコマンドの使い方によってはssh接続等ができなくなり、いわゆる詰んだ状態となります。
→ 対策: シリアル接続できるようにしておきましょう

パフォーマンス

TODO(レイテンシ、スループット)

あとがき

疲れた。