IDCFクラウド openvpn による LAN to LAN 接続

IDCFクラウドで不意の障害に見舞われることが増え始めたので、もう少しまともな運用を考える。たまたま自分でアクセスしたときに障害に気付くような状況をまずは改善する。IDCFクラウドのリソースはケチケチで運用しているので、自宅のサーバからクラウド側のサーバを監視するのが理想的。できればウェブ系の監視だけでなく、サーバごとのリソースウォッチも行いたいので、自宅から個々のサーバ、あるいはそのサーバ内のコンテナにアクセスできるように設定したい。そこでVPNの導入を検討してみる。

VPN接続は以前GMOクラウドでも利用していたが、そのときはクラウド側のサーバ1台ごとに自宅のLANに接続させていた。このVPN経路を使って自宅のchef serverからクラウド側のサーバをセットアップしていたんだけど、GMOクラウドはサーバごとに1つのGIPをもらえたので、この構造で困ることはなかった。今はchef serverからchef zeroに切り替えたとはいえ、クラウド側のサーバやコンテナを全て自宅のchef zeroからセットアップするので、クラウド側から自宅のchef zeroコンテナが見える必要がある。IDCFクラウドはGIPが1つしかないので、chefから個々のサーバへの経路も必要となる。つまり双方向のLANが見えないといけない。

いわゆるLAN to LANな接続なんだけど、これなら監視も自宅からできるようになるので便利。自宅のブロードバンドルータにもVPN機能があったり、IDCFクラウドにもVPN機能があったりするが、諸事情により今回はLANLAN to LANができるかどうかわからなかったので、Linuxを使ってopenvpnで接続することにした。ぐぐって見つけたサイトを参考にして設定を準備。自宅側もクラウド側もCentOS7上に専用のlxcコンテナを用意。lxcコンテナはホストOSのkernelパラメータを引き継ぐので、ホストOS側で『net.ipv4.ip_forward=1』を設定して反映。自宅側コンテナを以下のように設定。

yum install openvpn
openvpn --genkey --secret /etc/openvpn/vpn.key
mkdir /dev/net
mknod /dev/net/tun c 10 200
vi /etc/openvpn/server.conf
    :
port 1194
proto udp
dev tun
remote crowd.domain.com
local 192.168.0.11
ifconfig 10.0.8.1 10.0.8.2
float
persist-tun
persist-local-ip
comp-lzo
secret /etc/openvpn/vpn.key
user nobody
group nobody
status /var/log/openvpn-status.log
log-append /var/log/openvpn.log
verb 3
keepalive 10 60

systemctl enable openvpn@server
systemctl start openvpn@server

続いて、クラウド側。

yum install openvpn
openvpn --genkey --secret /etc/openvpn/vpn.key
mkdir /dev/net
mknod /dev/net/tun c 10 200
vi /etc/openvpn/server.conf
    :
port 1194
proto udp
dev tun
remote home.domain.com
local 10.0.0.11
float
ifconfig 10.0.8.2 10.0.8.1
persist-tun
persist-local-ip
comp-lzo
secret /etc/openvpn/vpn.key
user nobody
group nobody
status /var/log/openvpn-status.log
log-append /var/log/openvpn.log
verb 3
keepalive 10 60

systemctl enable openvpn@server
systemctl start openvpn@server

これでvpn接続は確立した。実際の疎通にはstatic routeが必要となる。自宅側はブロードバンドルータに設定が出来たので、それでクラウド側の全サーバへ接続が可能となった。クラウド側もルータへのstatic route設定で終わりにしたかったが、どうやら設定は無理そう。各サーバにstatic routeを設定する必要があるので、nmcliで以下のように設定。ここで使っているconnection名はkickstartで設定した場合のデフォルトのものなので、個々の設定に合わせて修正して下さい。

nmcli c m "Bridge connection br0" ipv4.routes "192.168.0.0/24 10.0.0.11"

nmcliがない場合は以下のようなファイルを直接置いておけば、起動時にstatic routeが設定される。

vi /etc/sysconfig/network-scripts/route-eth0
    :
ADDRESS0=192.168.0.0
NETMASK0=255.255.255.0
GATEWAY0=10.0.0.11

これで、互いのLAN上のサーバへ直接接続できるようになった。しかし、vpnサーバのみが何故か対抗のLANに対して通信できない。tcpdumpして確認してみると、vpnサーバのみトンネル用の10.0.8.xをソースIPとしてしまうため、帰りの経路を見つけられないようだった。そこでstatic routeで10.0.8.0/29のgatewayをvpnサーバとする設定を追加。これで、双方のLAN上のサーバがそれぞれに通信できるようになった。うーん、なかなか便利。これがゴールってわけではないので、このVPN経路を使って、次回は監視サーバを準備する。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)