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="root@example.co.jp"
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
iroute 192.168.0.0 255.255.255.0
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/
にコピー
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(レイテンシ、スループット)
あとがき
疲れた。