SoftLayer仮想サーバーでVyOSの冗長化構成を勉強１-(VRRP基本構成編)

# 1. はじめに
  SoftLayerの仮想サーバーとVyOSを使ってVPN-LAN間接続、リモートアクセス接続を構築ケースがあります。
  SoftLayerでは、<font color="blue">冗長化構成が組める「ネットワークゲートウェイアプライアンス」(Vyatta6.x)</font>を提供しているので構築が可能ですが、ベアメタル基盤のため数台のサーバー利用では全体のシステムを考えた場合、<font color="red">費用面のハードルが高く</font>なるでしょう。
  また、仮想サーバーにVyOSを導入した場合、<font color="red">スタンダードイメージからもどすことができず</font>、故障の際の復旧に時間がかかります。
  今回は耐障害性を考慮しつつ、コストを少なくする事を目的に、<font color="blue">仮想サーバーにVyOSを導入しVRRPで冗長化構成の可能性をテスト</font>したいと思います。
まずは、<strong><font color="blue">VyOSでVRRP構成の基本</font></strong>から始めます。

 
# 2. VRRPについて
<strong><font color="blue">(VRRP:Virtual Router Redundancy Protocol)</font></strong>
VRRPは、<font color="blue">物理的には複数台あるルータを仮想的に1台のルータに見せる</font>ことができる技術です。
 ルータなどネットワーク機器の 冗長化構成を構築する際の機能で、RFC5798で標準化されてます。

 シスコ社の<font color="green">HSRP(Hot Standby Routing Protocol)</font>も基本的には同じ機能ですが、
VRRPの場合は、仮想IPアドレスにマスタールータの物理IPアドレスを指定することができます。
SoftLayerでVRRP用の仮想IPアドレスを入手するには、インスタンスをオーダー時についてくるプライマリーIPアドレスを使用する方法がありますが、将来インスタンスを作成するための<font color="red">予約IP</font>となっているので、お勧めしません。
>ちなみに、SoftLayerで有償版のVyttaをHA構成でオーダーすると、仮想IPは予約済みとなりますので、上記のような心配はありません。
>

また、ポータブルIPではネットワークの設定がうまくいかず、通信ができませんでした。（参考まで：パブリックポータブルIPは16ポート月額$32です。）
そこで、今回は<font color="blue">VRRPで可能な、仮想IPアドレスにマスタールータの物理IPアドレスを指定しました。</font>

 
 VRRPは複数台のルータ(複数台のVyOS)でグループを組み、VRRP仮想IPを共有します。
 各ルータは<font color="blue">「マスター(1台)」</font>と<font color="blue">「バックアップ」</font>の役割に分かれ、<font color="blue">プライオリティ値の大きなルータが「マスター」</font>となります。
 <strong><font color="blue">・マスター
 ・バックアップ</font></strong>
 
 「マスター」がダウンした際は、自動で「バックアップ」が「新マスター」に昇格します。
 
 また、ダウンした「旧マスター」が復旧した場合の切り戻しには２つの方法があります。
<font color="blue"> ・プリエンプション有効---「旧マスター」がすぐに「マスター」へ昇格
 ・プリエンプション無効---「マスター」の切り戻しは行わない</font>
 <font color="green">※通信接続状況を考慮し、自動的に切り戻しを行わない　”プリエンプション無効”をお勧めします。</font>
 
# ３. 構成について
>VyOSへの入れ替えは省略いたします。
 「SoftLayer仮想サーバにVyOSをインストールしました」の「9. ⑦ VyOSネットワークの設定」をご覧ください。
http://qiita.com/Mitsu-Murakita/items/d793250566a8e9f3562baa
>

## ３-1. 全体構成

SoftLayerの仮想インスタンスを3台オーダーしました。
<strong>・VyOS01 ------- VyOSマスタールーター
・VyOS02 ------- VyOSバックアップルーター
・WWWCent6 --- 確認用Webサーバー</strong>

![01.png](http://www.seahorse-inc.com/QIITA/VyOS-HA-1/01.png)

 ・VyOS01のPriorityを250、VyOS02のPriorityを200にしましたので、<strong>VyOS01がマスター</strong>、<strong>VyOS02がバックアップ</strong>になります。
 ・<strong>VRRP仮想PublicIP</strong>はVyOS01のeth1(161.202.158.218)、<strong>VRRP仮想PrivateIP</strong>はVyOS01のeth0(10.132.52.225)です。
・VyOS01/VyOS02の<strong>eth1をGroup200</strong>、<strong>eth0をGroup100</strong>としました。
グループは、マルチキャストパケットがどのグループに属するかを識別するために使用されます。
・確認用のWebサーバー(WWWCent6)の<font color="blue">ディフォルトゲートウェイは、VRRP仮想PrivateIP(10.132.52.225)</font>です。

![02.png](http://www.seahorse-inc.com/QIITA/VyOS-HA-1/02.png)

## ３-2. VyOS構成
 <font color="green">説明しやすいように行番号(XXX)を入れてます。実際に入力する際は入れないでください。</font>

```Command:VyOS01構成例
(001) interfaces {
(002)      ethernet eth0 {
(003)          address 10.132.52.225/26
(004)          duplex auto
(005)          hw-id 06:98:ae:8a:24:ac
(006)          smp_affinity auto
(007)          speed auto
(008)          vrrp {
(009)              vrrp-group 100 {
(010)                  advertise-interval 1
(011)                  preempt true
(012)                  priority 250
(013)                  sync-group syncgroup01
(014)                  virtual-address 10.132.52.225
(015)              }
(016)          }
(017)      }
(018)      ethernet eth1 {
(019)          address 161.202.158.218/29
(020)          duplex auto
(021)          hw-id 06:26:c9:26:4f:4d
(022)          smp_affinity auto
(023)          speed auto
(024)          vrrp {
(025)              vrrp-group 200 {
(026)                  advertise-interval 1
(027)                  preempt true
(028)                  priority 250
(029)                  sync-group syncgroup01
(030)                  virtual-address 161.202.158.218
(031)              }
(032)          }
(033)      }
(034)      loopback lo {
(035)      }
(036)  }
(037)  nat {
(038)      destination {
(039)          rule 200 {
(040)              description "1-to-1 NAT"
(041)              destination {
(042)                  address 161.202.158.218
(043)                  port 80
(044)              }
(045)              inbound-interface any
(046)              protocol tcp
(047)              translation {
(048)                  address 10.132.52.226
(049)                  port 80
(050)              }
(051)          }
(052)      }
(053)      source {
(054)          rule 200 {
(055)              description " masquerade NAT"
(056)              outbound-interface eth1
(057)              source {
(058)                  address 10.132.52.192/26
(059)              }
(060)              translation {
(061)                  address masquerade
(062)              }
(063)          }
(064)      }
(065)  }
(066)  protocols {
(067)      static {
(068)          route 10.0.0.0/8 {
(069)              next-hop 10.132.52.193 {
(070)              }
(071)          }
(072)      }
(073)  }
(074)  service {
(075)      ssh {
(076)          port 22
(077)      }
(078)  }
(079)  system {
(080)      config-management {
(081)          commit-revisions 20
(082)      }
(083)      console {
(084)          device hvc0 {
(085)              speed 9600
(086)          }
(087)      }
(088)      gateway-address 161.202.158.217
(089)      host-name vyos
(090)      login {
(091)          user root {
(092)              authentication {
(093)                  encrypted-password xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
(096)                  plaintext-password ""
(097)              }
(098)              level admin
(099)          }
(100)          user vyos {
(101)              authentication {
(102)                  encrypted-password xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
(103)                  plaintext-password ""
(104)              }
(105)              level admin
(106)          }
(107)      }
(108)      name-server 10.0.80.11
(109)      ntp {
(100)          server time.service.networklayer.com {
(111)          }
(112)      }
(113)      package {
(114)          auto-sync 1
(115)          repository community {
(116)              components main
(117)              distribution helium
(118)              password ""
(119)              url http://packages.vyos.net/vyos
(120)              username ""
(121)          }
(122)      }
(123)      syslog {
(124)          global {
(125)              facility all {
(126)                  level notice
(127)              }
(128)              facility protocols {
(129)                  level debug
(130)              }
(131)          }
(132)      }
(133)      time-zone Asia/Tokyo
(134)  }
``` 
VRRPとNATの箇所を重点に説明します。
<font color="blue">・(008)-(016):</font>eth0のVRRP設定
<font color="blue">・(009):</font>マルチキャストが届くグループを定義(この例では100)
 　vyos02のeth0と同じグループ
<font color="blue">・(010):</font>グループ内でのadvertiseパケットを送信する間隔(ディフォルト値)
<font color="blue">・(011):</font>ダウンしたマスターが障害から復旧した際、すぐに自動でマスターへ昇格するかを
設定(プリエンプション)(この例ではtrue:すぐに昇格します)
<font color="blue">・(013):</font>インスタンスのeth0/eth1のどちらかがダウンして片方が生き残った場合、バックアップへ
切り替わらないケースがある。これを防ぐためにeth0/eth1インターフェースをグループ化して管理。
（この例では「eth0/eth1」を「sysncgroup01」というグループ名で登録している）
<font color="blue">・(014):</font>プライベート側(eth0)のVRRP仮想IPアドレス。
（この例では、VRRPはマスターと同じ物理IPを登録できるので、「10.132.52.225」とした）

<font color="blue">・(024)-(032):</font>eth1のVRRP設定
<font color="blue">・(025):</font>マルチキャストが届くグループを定義(この例では200)
 　vyos02のeth1と同じグループ
<font color="blue">・(026):</font>グループ内でのadvertiseパケットを送信する間隔(デフォルト値)
<font color="blue">・(027):</font>ダウンしたマスターが障害から復旧した際、すぐに自動でマスターへ昇格するかを
設定(プリエンプション)(この例ではtrue:すぐに昇格します)
<font color="blue">・(028):</font>インスタンスのeth0/eth1のどちらかがダウンして片方が生き残った場合、バックアップへ
切り替わらないケースがある。これを防ぐためにeth0/eth1インターフェースをグループ化して管理。
（この例では「eth0/eth1」を「sysncgroup01」というグループ名で登録している）
<font color="blue">・(030):</font>プライベート側(eth0)のVRRP仮想IPアドレス。
（この例では、VRRPはマスターと同じ物理IPを登録できるので、「161.202.158.218」とした）

<font color="blue">・(037)-(065):</font>NAT設定
確認目的なので、簡易的な設定になってます。
<font color="blue">・(038)-(052):</font>destination NAT設定
パブリックVRRP仮想IP(161.202.158.218)のポート80から来たパケットを、WebサーバーのIP(10/132.52.226)のポート80に1対1変換しています。

<font color="blue">・(053)-(064):</font>sourceNAT(マスカレード)設定
今回は、インターネットから構内のWebサーバーを参照する想定なので、特に必要ない。
 
 
 
  <font color="green">説明しやすいように行番号(XXX)を入れてます。実際に入力する際は入れないでください。</font>
  
```Command:VyOS02構成例
(001)interfaces {
(002)     ethernet eth0 {
(003)         address 10.132.52.234/26
(004)         duplex auto
(005)         hw-id 06:e3:74:c6:aa:96
(006)         smp_affinity auto
(007)         speed auto
(008)         vrrp {
(009)             vrrp-group 100 {
(010)              priority 240
(011)                 sync-group syncgroup01
(012)                 virtual-address 10.132.52.225
(013)             }
(014)         }
(015)     }
(016)     ethernet eth1 {
(017)         address 161.202.158.221/29
(018)         duplex auto
(019)         hw-id 06:62:f3:35:0d:2a
(020)         smp_affinity auto
(021)         speed auto
(022)         vrrp {
(023)             vrrp-group 200 {
(024)                 priority 240
(025)                 sync-group syncgroup01
(026)                 virtual-address 161.202.158.218
(027)             }
(028)         }
(029)     }
(030)     loopback lo {
(031)     }
(032) }
(033) nat {
(034)     destination {
(035)         rule 200 {
(036)             description "1-to-1 NAT"
(037)             destination {
(038)                 address 161.202.158.218
(039)                 port 80
(040)             }
(041)             inbound-interface any
(042)             protocol tcp
(043)             translation {
(044)                 address 10.132.52.226
(045)                 port 80
(046)             }
(047)         }
(048)     }
(049)      source {
(050)          rule 200 {
(051)              description " masquerade NAT"
(052)              outbound-interface eth1
(053)              source {
(054)                  address 10.132.52.192/26
(055)              }
(056)              translation {
(057)                  address masquerade
(058)              }
(059)          }
(060)      }
(061) }
(062) protocols {
(063)     static {
(064)         route 10.0.0.0/8 {
(065)             next-hop 10.132.52.193 {
(066)             }
(067)         }
(068)     }
(069) }
(070) service {
(071)     ssh {
(072)         port 22
(073)     }
(074) }
(075) system {
(076)     config-management {
(077)         commit-revisions 20
(078)     }
(079)     console {
(080)         device hvc0 {
(081)             speed 9600
(082)         }
(083)     }
(084)     gateway-address 161.202.158.217
(085)     host-name vyos
(086)     login {
(087)         user vyos {
(088)             authentication {
(089)                 encrypted-password xxxxxxxxxxxxxxxxxxxx(090)                 plaintext-password ""
(091)             }
(092)             level admin
(093)         }
(094)     }
(095)     name-server 10.0.80.11
(096)     ntp {
(097)         server time.service.networklayer.com {
(098)         }
(099)     }
(100)     package {
(101)         auto-sync 1
(102)         repository community {
(103)             components main
(104)             distribution helium
(105)             password ""
(106)             url http://packages.vyos.net/vyos
(107)             username ""
(108)         }
(109)     }
(100)     syslog {
(111)         global {
(112)             facility all {
(113)                 level notice
(114)             }
(115)             facility protocols {
(116)                 level debug
(117)             }
(118)         }
(119)     }
(120)     time-zone Asia/Tokyo
(121) }
``` 

# 4. 動作確認
## 4-1. vyos01をリブートし、vyos02がマスターに昇格するかを確認

![03.png](http://www.seahorse-inc.com/QIITA/VyOS-HA-1/03.png)
初期状態　vyos01はMASTERr、vyos02はBACKUPを確認

![04.png](http://www.seahorse-inc.com/QIITA/VyOS-HA-1/04.png)
vyos01をリブート

![05.png](http://www.seahorse-inc.com/QIITA/VyOS-HA-1/05.png)
vyos02がBACKUPからMASTERへ昇格したことを確認。

vyos01が正常起動後
![06.png](http://www.seahorse-inc.com/QIITA/VyOS-HA-1/06.png)
プリエンプションが有効(preempt true)のため、vyos01起動後にMASTERになり、vyos02がBACKUPに移行している。

## 4-2. vyos01のeth0インターフェースをダウンさせ、vyos02がマスターに昇格するかを確認
SoftLayerポータルより、デバイスの詳細画面でeth0を切断する
![07.png](http://www.seahorse-inc.com/QIITA/VyOS-HA-1/07.png)

![08.png](http://www.seahorse-inc.com/QIITA/VyOS-HA-1/08.png)
vyos01のeth0/eth1状態が両方ともFAULTになり、eth0/eth1の「sysncgroup01」というグループでFAULTになったことを確認。
同時にvyos02がMASTERに昇格したことを確認。

## 4-3. vyos01の電源をオフにし、Web画面を確認。
まずはWebサイトにアクセスし、HTML画面が表示されることを確認。
![10.png](http://www.seahorse-inc.com/QIITA/VyOS-HA-1/10.png)

SoftLayerポータルより、vyos01電源オフ
![11.png](http://www.seahorse-inc.com/QIITA/VyOS-HA-1/11.png)

vyos02がMASTERになっていることを確認し、Webサイトにアクセス
![12.png](http://www.seahorse-inc.com/QIITA/VyOS-HA-1/12.png)
正常に表示されました。

# 5. おわりに
VRRPの状態確認コマンドは $ show vrry をはじめ色々ありますので、是非試してください。
また、セキュリティの観点よりパスワードをかける事ができます。

```Command:パスワードの設定
# set interfaces ethernet eth0 vrrp vrr-group 100 authentication password xxxx ⏎
# set interfaces ethernet eth0 vrrp vrr-group 100 authentication type plaintext-password ⏎
``` 

今回、VyOSの冗長化機能を勉強しましたが、実際にVPN－LAN間接続やリモート接続ができるかテストする予定です。