「VyOSにSerfを入れてフルメッシュVPNをメンテナンスレスでやってみる試み」の版間の差分

提供: もみあげうぃき
移動: 案内検索
(ちょっと整形)
22行: 22行:
 
いまのところ、AmazonWebServices(AWS)での動かし方を書いておきます。
 
いまのところ、AmazonWebServices(AWS)での動かし方を書いておきます。
  
VyOS 1.0.4 amd64 with Serf FullmeshVPN alpha (HVM) - ami-e5abf6e4 というAMIを探してLaunchします。
+
=== まずはLaunchボタンから ===
現状は、TokyoRegionのみに準備してます。
+
* VyOS 1.0.4 amd64 with Serf FullmeshVPN alpha (HVM) - ami-e5abf6e4 というAMIを探してLaunchします。
必要な方は、AMIからLaunch後にAMIを作成して、別リージョンにコピーしてお使いください。
+
** 現状は、TokyoRegionのみに準備してます。必要な方は、AMIからLaunch後にAMIを作成して、別リージョンにコピーしてお使いください。
※AMI作成前に、
+
 
 +
※別リージョン用のAMIを作成する方は、AMI作成前に、
 +
<pre>
 
configure  
 
configure  
 
delete interfaces ethernet eth0 hw-id
 
delete interfaces ethernet eth0 hw-id
 
commit
 
commit
 
save
 
save
 +
</pre>
 
を行ってください。
 
を行ってください。
 
行わないと、コピーしたAMIからLaunchしても、
 
行わないと、コピーしたAMIからLaunchしても、
 
MACアドレスが変更になって、SSH接続できなくなります。
 
MACアドレスが変更になって、SSH接続できなくなります。
  
Launch時に、UserDataに以下を設定します。
+
=== VPN設定情報 ===
 
+
* Launch時に、UserDataに以下を設定します。
 +
<pre>
 
例:
 
例:
 
PREKEY,aaabbbPREKEY22cccddd
 
PREKEY,aaabbbPREKEY22cccddd
43行: 47行:
 
DISPNAME,VyOSSerf1-Tokyo
 
DISPNAME,VyOSSerf1-Tokyo
 
LOCALNET,10.15.0.0/16
 
LOCALNET,10.15.0.0/16
 +
</pre>
 +
** PREKEY (必須)
 +
*** IPSec接続用のPreSharedKeyです。
 +
*** 特に他のNodeと合わせる必要はありません。
 +
** SERFKEY (必須)
 +
*** SerfのEncription用のKeyです。
 +
*** このKeyをもとにSerfにJoinし暗号化を行うので(たぶん)、他のNodeと合わせる必要があります。
 +
*** KeyはどっかのマシンにSerfを入れて、 serf keygen コマンドで生成したものを使ってください。
 +
** JOINIP (必須)
 +
*** Join先のNodeのIPアドレスです。
 +
*** 基本的にはGlobalIPアドレスになりますが、まず最初のNodeを立ち上げるときには、 127.0.0.1 で大丈夫です。
 +
** ROLE (任意)
 +
*** まだ実装してませんが、将来的にはこのROLEに応じてVPNの接続グループを分ける予定
 +
** DISPNAME (任意)
 +
*** 表示用の名前です。
 +
*** 各種表示される部分に出てくる名前になります。実際のNode名、マシン名、NameTagと全然違ってもOKです。
 +
** LOCALNET (任意)
 +
*** IPSec接続先ノードに対して自分の裏にいるネットワークを教えるためにCIDRを書きます。
 +
*** 省略すると、自分のSubnetを指定したことになります。
 +
*** AWSの場合は、VPCのNetworkAddressを書くと、そのVPC全体へのRoutingをPeerに伝播させることができます。
 +
*** また、自分の裏にさらにSubnetがいる場合は、もう少し大きく 10.0.0.0/10 とかも書けます。
 +
*** いまのところ1つのCIDRしか書けません・・・
  
PREKEY (必須)
+
=== 他のAWS設定 ===
IPSec接続用のPreSharedKeyです。
+
* セキュリティグループ
特に他のNodeと合わせる必要はありません。
+
** IPSecとSerfのプロトコルが通るようにしてください。
 +
*** UDP 500
 +
*** ESP
 +
*** TCP/UDP 7946
 +
** あたりを開ければよいかと思いますが、良くわからん方は、とりあえずフルオープン!で後で閉じて行きましょう。逆に。
  
SERFKEY (必須)
+
* Source / Dest Check
SerfのEncription用のKeyです。
+
** Launch後は、速やかにインスタンスの、 Source / Dest Check を Disable にします。
このKeyをもとにSerfにJoinし暗号化を行うので(たぶん)、
+
他のNodeと合わせる必要があります。
+
  
JOINIP (必須)
+
=== VPNだから相手がいないとね☆ ===
Join先のNodeのIPアドレスです。
+
* あとは、同様の手順で2台以上動かすと、勝手にフルメッシュVPNが構築されちゃうっていう寸法です!
基本的にはGlobalIPアドレスになりますが、
+
まず最初のNodeを立ち上げるときには、
+
127.0.0.1
+
で大丈夫です。
+
  
ROLE (任意)
+
== Serfで構築する利点 ==
まだ使ってませんが、将来的にはこのROLEに応じてVPNの接続グループを分ける予定
+
*どれか1つのNodeのGlobalIPを知っていればそれでOK!万事休す!
 
+
**なぜJOINするのか?そこにNODEがあるから。
DISPNAME (任意)
+
* あとはほとんど気にしなくてよい
表示用の名前です。
+
* 全VPNルータを設定しなくてもよい
各種表示される部分に出てくる名前になります。
+
* 逆に、いつ切断してもOK
実際のNode名、マシン名、NameTagと全然違ってもOKです。
+
 
+
LOCALNET (任意)
+
IPSec接続先ノードに対して自分の裏にいるネットワークを教えるためにCIDRを書きます。
+
省略すると、自分のSubnetを指定したことになります。
+
AWSの場合は、VPCのNetworkAddressを書くと、そのVPC全体へのRoutingを伝播させることができます。
+
また、自分の裏にさらにSubnetがいる場合は、もう少し大きく
+
10.0.0.0/10
+
とかも書けます。
+
 
+
セキュリティグループ
+
 
+
IPSecとSerfのプロトコルが通るようにしてください。
+
UDP 500
+
ESP
+
TCP/UDP 7946
+
あたりを開ければよいかと思いますが、良くわからん方は、とりあえずフルオープン!で後で閉じて行きましょう。逆に。
+
 
+
Launch後は、速やかに、
+
インスタンスの、 Source / Dest Check を Disable にします。
+
 
+
あとは、同様の手順で2台以上動かすと、勝手にフルメッシュVPNが構築されちゃうっていう寸法です!
+
 
+
== なにが利点か ==
+
 
+
なにが利点か
+
・どれか1つのGlobalIPを知っていればそれでOK!万事休す!
+
なぜJOINするのか?そこにNODEがあるから。
+
・あとはほとんど気にしなくてよい
+
・全VPNルータを設定しなくてもよい
+
・逆に、いつ切断してもOK
+
 
※悪いことにはマスクがかかっています
 
※悪いことにはマスクがかかっています
  
今後の予定
+
== 今後の予定 ==
・同一セグメント内に2台以上いた場合は勝手に冗長構成にする⇒AWSのIAM RoleとRouteTableを使えばたぶんすぐできる
+
* 同一セグメント内に2台以上いた場合は勝手に冗長構成にする⇒AWSのIAM RoleとRouteTableを使えばたぶんすぐできる
・ROLEによる複数フルメッシュVPN群の作成⇒フルメッシュVPN群同士をつなぐのも!
+
* ROLEによる複数フルメッシュVPN群の作成⇒フルメッシュVPN群同士をつなぐのも!
・同一セグメントも気にしないでつなぎたい⇒L2TPv3も組み合わせる?
+
* 同一セグメントも気にしないでつなぎたい⇒L2TPv3も組み合わせる?
 
+
 
+
課題
+
・セキュリティ
+
 Serfのencryptionのみなので・・・VyOSのFirewallで対応?最初のjoin先は手動で開ける、他はjoinメッセージを受けたら対象GlobalIPを開ける???う~ん。。。
+
・品質
+
 本番環境への適用に向けて、もう少し安定するようにしたい雰囲気!
+
  
 +
== 現状の課題 ==
 +
* セキュリティ
 +
** Serfのencryptionのみなので・・・VyOSのFirewallで対応?最初のjoin先は手動で開ける、他はjoinメッセージを受けたら対象GlobalIPを開ける???う~ん。。。
 +
* 品質
 +
** 本番環境への適用に向けて、もう少し安定するようにしたい雰囲気!
 +
** コマンドが重複してたりとか、謎のsleep入れてたりとか・・・
  
== おまけ ==
+
== AWS以外でもたぶん動きます ==
  
スクリプトは全体的に、ただのテキスト処理をひたすらやっている、vbashのシェルスクリプトです。
+
* スクリプトは全体的に、ただのテキスト処理をひたすらやっている、vbashのシェルスクリプトです。
/opt/serf に全体的に入っています。
+
* /opt/serf に全体的に入っています。
/opt/serf/bin/getinfo.sh にて、AWSのUserDataやMetaDataから情報を取得する処理を行っているので、そこのAWS依存部分を書き換えれば他のクラウドや他の仮想化環境でも動くはず!(たぶん)
+
* /opt/serf/bin/getinfo.sh にて、AWSのUserDataやMetaDataから情報を取得する処理を行っているので、そこのAWS依存部分を書き換えれば他のクラウドや他の仮想化環境でも動くはず!(たぶん)
  
/opt/serf/etc/webmonitor/ に、作ったフルメッシュVPNの状態を可視化するもどきのサンプルページが入っているので、適当なWebServerでそこを見れるようにすれば、なんとなくグラフっぽくなるかも?!
+
== SerfによるMonitoringとか ==
どっかのNodeで
+
* /opt/serf/etc/webmonitor/ に、このSerfで作ったフルメッシュVPNの状態を可視化するもどきのサンプルページが入っているので、適当なWebServerでそこを見れるようにすれば、なんとなくグラフっぽくなるかも?!
 +
* どっかのNodeで
 +
<pre>
 
cd /opt/serf/bin ; ./updateconcheck.sh &
 
cd /opt/serf/bin ; ./updateconcheck.sh &
 +
</pre>
 
しておくと、serf queryでVPN接続したmember間のlatency(rtt)をとって返してくれたものを、Web用のデータにします。
 
しておくと、serf queryでVPN接続したmember間のlatency(rtt)をとって返してくれたものを、Web用のデータにします。
  
 +
== 発表資料とか ==
 
[https://speakerdeck.com/yaggy/build-fullmesh-vpn-by-vyos-with-serf-vyos-users-meeting-japan-number-1-lt VyOS Users Meeting Japan #1 にてLTさせていただくスライドはこちら!]
 
[https://speakerdeck.com/yaggy/build-fullmesh-vpn-by-vyos-with-serf-vyos-users-meeting-japan-number-1-lt VyOS Users Meeting Japan #1 にてLTさせていただくスライドはこちら!]

2014年7月26日 (土) 15:00時点における版

経緯

AWS上で、複数Regionを一つの固まりと見せるようにするためスター型風トポロジでVyattaにてVPNを構築し運用していてとっても便利でした。 しかし!あたりまえですが、接続が集中しているVyattaが落ちると、そこから先の経路が全滅します。あたりまえですが!あたりまえですが! Failoverするようにしても、やっぱり一時的に全滅は痛い・・・

そこで!やっぱ、フルメッシュでつないだ方がよくね? でも、、、トンネルの数!!!拠点増えた時めんどい?! 15台のVyattaをつなぐと、トンネルの数は、15x(15-1)/2=。。。

あれ?こういう時にSerfって使うんじゃないの?

ということで!

作ってみた感じ(アルファ版)

とりあえず、GitHubの使い方がいまいちわからないので、AWSにAMIを用意してみました。 GitHubのこと、誰か口頭で教えてください!

動かし方

いまのところ、AmazonWebServices(AWS)での動かし方を書いておきます。

まずはLaunchボタンから

  • VyOS 1.0.4 amd64 with Serf FullmeshVPN alpha (HVM) - ami-e5abf6e4 というAMIを探してLaunchします。
    • 現状は、TokyoRegionのみに準備してます。必要な方は、AMIからLaunch後にAMIを作成して、別リージョンにコピーしてお使いください。

※別リージョン用のAMIを作成する方は、AMI作成前に、

configure 
delete interfaces ethernet eth0 hw-id
commit
save

を行ってください。 行わないと、コピーしたAMIからLaunchしても、 MACアドレスが変更になって、SSH接続できなくなります。

VPN設定情報

  • Launch時に、UserDataに以下を設定します。
例:
PREKEY,aaabbbPREKEY22cccddd
SERFKEY,6UIpjHbohEyOETGiuNqgNQ==
ROLE,vpngrp1
JOINIP,127.0.0.1
DISPNAME,VyOSSerf1-Tokyo
LOCALNET,10.15.0.0/16
    • PREKEY (必須)
      • IPSec接続用のPreSharedKeyです。
      • 特に他のNodeと合わせる必要はありません。
    • SERFKEY (必須)
      • SerfのEncription用のKeyです。
      • このKeyをもとにSerfにJoinし暗号化を行うので(たぶん)、他のNodeと合わせる必要があります。
      • KeyはどっかのマシンにSerfを入れて、 serf keygen コマンドで生成したものを使ってください。
    • JOINIP (必須)
      • Join先のNodeのIPアドレスです。
      • 基本的にはGlobalIPアドレスになりますが、まず最初のNodeを立ち上げるときには、 127.0.0.1 で大丈夫です。
    • ROLE (任意)
      • まだ実装してませんが、将来的にはこのROLEに応じてVPNの接続グループを分ける予定
    • DISPNAME (任意)
      • 表示用の名前です。
      • 各種表示される部分に出てくる名前になります。実際のNode名、マシン名、NameTagと全然違ってもOKです。
    • LOCALNET (任意)
      • IPSec接続先ノードに対して自分の裏にいるネットワークを教えるためにCIDRを書きます。
      • 省略すると、自分のSubnetを指定したことになります。
      • AWSの場合は、VPCのNetworkAddressを書くと、そのVPC全体へのRoutingをPeerに伝播させることができます。
      • また、自分の裏にさらにSubnetがいる場合は、もう少し大きく 10.0.0.0/10 とかも書けます。
      • いまのところ1つのCIDRしか書けません・・・

他のAWS設定

  • セキュリティグループ
    • IPSecとSerfのプロトコルが通るようにしてください。
      • UDP 500
      • ESP
      • TCP/UDP 7946
    • あたりを開ければよいかと思いますが、良くわからん方は、とりあえずフルオープン!で後で閉じて行きましょう。逆に。
  • Source / Dest Check
    • Launch後は、速やかにインスタンスの、 Source / Dest Check を Disable にします。

VPNだから相手がいないとね☆

  • あとは、同様の手順で2台以上動かすと、勝手にフルメッシュVPNが構築されちゃうっていう寸法です!

Serfで構築する利点

  • どれか1つのNodeのGlobalIPを知っていればそれでOK!万事休す!
    • なぜJOINするのか?そこにNODEがあるから。
  • あとはほとんど気にしなくてよい
  • 全VPNルータを設定しなくてもよい
  • 逆に、いつ切断してもOK

※悪いことにはマスクがかかっています

今後の予定

  • 同一セグメント内に2台以上いた場合は勝手に冗長構成にする⇒AWSのIAM RoleとRouteTableを使えばたぶんすぐできる
  • ROLEによる複数フルメッシュVPN群の作成⇒フルメッシュVPN群同士をつなぐのも!
  • 同一セグメントも気にしないでつなぎたい⇒L2TPv3も組み合わせる?

現状の課題

  • セキュリティ
    • Serfのencryptionのみなので・・・VyOSのFirewallで対応?最初のjoin先は手動で開ける、他はjoinメッセージを受けたら対象GlobalIPを開ける???う~ん。。。
  • 品質
    • 本番環境への適用に向けて、もう少し安定するようにしたい雰囲気!
    • コマンドが重複してたりとか、謎のsleep入れてたりとか・・・

AWS以外でもたぶん動きます

  • スクリプトは全体的に、ただのテキスト処理をひたすらやっている、vbashのシェルスクリプトです。
  • /opt/serf に全体的に入っています。
  • /opt/serf/bin/getinfo.sh にて、AWSのUserDataやMetaDataから情報を取得する処理を行っているので、そこのAWS依存部分を書き換えれば他のクラウドや他の仮想化環境でも動くはず!(たぶん)

SerfによるMonitoringとか

  • /opt/serf/etc/webmonitor/ に、このSerfで作ったフルメッシュVPNの状態を可視化するもどきのサンプルページが入っているので、適当なWebServerでそこを見れるようにすれば、なんとなくグラフっぽくなるかも?!
  • どっかのNodeで
cd /opt/serf/bin ; ./updateconcheck.sh &

しておくと、serf queryでVPN接続したmember間のlatency(rtt)をとって返してくれたものを、Web用のデータにします。

発表資料とか

VyOS Users Meeting Japan #1 にてLTさせていただくスライドはこちら!