PNETlabを使ってVRRP環境を作ってみる

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

少し前、ProxmoxVE上にPNETlab環境を作ってみました。
今日はこの環境にVRRP環境を作ってみようと思います。仕事でこのあたりの技術に触れることがあり、復習がてら遊んでみます。

https://qiita.com/ohtsuka-shota/items/83299bd34bf2388cb11a

https://qiita.com/ohtsuka-shota/items/8ac082d7ebb1acbe92eb

# 作った環境
今回作った環境は以下となります。
192.168.100.0/24と200.0/24のネットワークのそれぞれの出口にVRRP設定を行います。VIPは各ネットワークの第4オクテッドが200となります。また、Masterは各ネットワークとも1側のルータとなるようにPriorityを設定しました。ルーティングプロトコルはOSPFにしています。
![image (85).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/a4f00762-25ca-5b3c-352e-bdc5aab119d0.png)


# 用語
## VRRP
Virtual Router Redundancy Protocolの略。
ざっくり書くと複数台のルータを束ねて冗長化するためのものです。
CCNAやCCNPを通じて得た知識として、デフォルトゲートウェイでこれを使うイメージが私の中で強くあります。
（ほかの場面で使うこともあるんだろうか…？）

ちょっと図に起こしてみます。
社内でも家内でもいいのですが、PC等でWebブラウジング等外部とやり取りをする時（他にも色々あるとは思いますが）基本的にはRouterを介してインターネットに接続します。以下のような図になるのですが、ルータが1台しかないと、このルータがHW障害で動かなくなった時、外部と通信ができなくなります。
![network01.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/e160c9e6-5c80-ed60-8af0-aecfca25149e.png)

VRRPはこれを回避します。
ルータを複数台用意し、それぞれに仮想的なIPアドレス（Virtual IP,VIP）を振ることで片方がお亡くなりになっても、もう一方で通信を継続することができるようになります。
![network01-ページ2.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/028c8bc0-783c-ad9d-b6a5-422d876ca462.png)

# 環境構築
## 事前準備
### PCの設定
決めておいたIPアドレスとデフォルトゲートウェイをPC起動後に設定します。デフォルトゲートウェイはVRRPで入れ込むVIPを記載します。また、このPCにVNCで接続できるように設定します。
![image (86).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/af25f161-7f46-0874-a1ad-e23c378b808e.png)
![image (87).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/8c23da9f-c7bd-0126-bc8e-9473c3971de1.png)

### サーバの設定
今回はdockerを使っています。
Telnetで接続できるように設定をします。こちらもデフォルトゲートウェイはVRRPで入れ込むVIPにあらかじめ設定しておきます。また、IPも事前に決めておいたIPを振るようにします。
![image (88).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/f8c0f9bf-b7d8-8242-7d27-b68b0dd5e288.png)
![image (89).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/a6b3e6cc-d8de-dff9-6cc7-78880b923bb5.png)

### RT系の設定
ここではRT01-1の設定しか記載しませんが、以下のように環境に併せて設定を入れます。
```
Router>enable   
Router#conf t
Router(config)#hostname RT01-1
RT01-1(config)#int e0/3
RT01-1(config-if)#ip address 192.168.100.254 255.255.255.0
RT01-1(config-if)#no shutdown
RT01-1(config)#int e0/0
RT01-1(config-if)#ip address 10.0.1.1 255.255.255.0 
RT01-1(config-if)#no shutdown
RT01-1(config-if)#exit
RT01-1(config)#exit
RT01-1#write memory
Building configuration...
[OK]
```
OSPFの設定も同様に全台に入れます。
```
RT01-1#conf t

RT01-1(config)#router ospf 1
RT01-1(config-router)#network 10.0.1.0 0.0.0.255 area 0
RT01-1(config-router)#network 192.168.100.0 0.0.0.255 area 0
RT01-1(config-router)#end

Building configuration...
[OK]
RT01-1#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area 
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       a - application route
       + - replicated route, % - next hop override

Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C        10.0.1.0/24 is directly connected, Ethernet0/0
L        10.0.1.1/32 is directly connected, Ethernet0/0
      192.168.100.0/24 is variably subnetted, 2 subnets, 2 masks
C        192.168.100.0/24 is directly connected, Ethernet0/3
L        192.168.100.254/32 is directly connected, Ethernet0/3
O     192.168.200.0/24 [110/20] via 10.0.1.2, 00:02:33, Ethernet0/0
```

## VRRPの設定
VRRPの設定を入れていきます。
参考にしているのはもちろん大ド定番「ネットワークエンジニアとして」です。

https://www.infraexpert.com/study/fhrpz07.html

### RT01側
RT01-1
```
RT01-1(config)#int e0/3
RT01-1(config-if)#vrrp 100 ip 192.168.100.200
RT01-1(config-if)#vrrp 100 priority 200
```
RT01-2
```
RT01-2(config)#int e0/3 
RT01-2(config-if)#vrrp 100 ip 192.168.100.200
RT01-2(config-if)#vrrp 100 priority 100
```
設定後stateを確認し、Master/Backupが適切に割り当てられていることを確認します。
```
RT01-1#show vrrp 
Ethernet0/3 - Group 100
  State is Master  
  Virtual IP address is 192.168.100.200
  Virtual MAC address is 0000.5e00.0164
  Advertisement interval is 1.000 sec
  Preemption enabled
  Priority is 200 
  Master Router is 192.168.100.254 (local), priority is 200 
  Master Advertisement interval is 1.000 sec
  Master Down interval is 3.218 sec
```

```
RT01-2#show vrrp
Ethernet0/3 - Group 100
  State is Backup  
  Virtual IP address is 192.168.100.200
  Virtual MAC address is 0000.5e00.0164
  Advertisement interval is 1.000 sec
  Preemption enabled
  Priority is 100 
  Master Router is 192.168.100.254, priority is 200 
  Master Advertisement interval is 1.000 sec
  Master Down interval is 3.609 sec (expires in 2.917 sec)
```

### RT02側
RT02-1
```
RT02-1(config)#int e0/3
RT02-1(config-if)#vrrp 200 ip 192.168.200.200
RT02-1(config-if)#vrrp 200 priority 200
```

RT02-2
```
RT02-2(config)#int e0/3
RT02-2(config-if)#vrrp 200 ip 192.168.200.200
RT02-2(config-if)#vrrp 200 priority 100
```
設定後stateを確認し、Master/Backupが適切に割り当てられていることを確認します。
```
RT02-1#show vrrp
Ethernet0/3 - Group 200
  State is Master  
  Virtual IP address is 192.168.200.200
  Virtual MAC address is 0000.5e00.01c8
  Advertisement interval is 1.000 sec
  Preemption enabled
  Priority is 200 
  Master Router is 192.168.200.254 (local), priority is 200 
  Master Advertisement interval is 1.000 sec
  Master Down interval is 3.218 sec
```
```
RT02-2#show vrrp
Ethernet0/3 - Group 200
  State is Backup  
  Virtual IP address is 192.168.200.200
  Virtual MAC address is 0000.5e00.01c8
  Advertisement interval is 1.000 sec
  Preemption enabled
  Priority is 100 
  Master Router is 192.168.200.254, priority is 200 
  Master Advertisement interval is 1.000 sec
  Master Down interval is 3.609 sec (expires in 3.589 sec)
```

## 試験
まずは以下の状態でPC-Server間で通信ができることを確認します。
![image (85).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/a4f00762-25ca-5b3c-352e-bdc5aab119d0.png)
以下がPC上の結果です。図の上部を通って通信をしていることがtracertの結果から確認できます。Master側を通っているので想定通りとなりました。
![image (90).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/cbf74771-7f9f-9a64-fc50-a81c0cbae091.png)

次に以下の状態で通信ができるかを確認します。
Masterが死んでいるので、Backupで通信をすることが期待となります。
![image (91).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/ad50f181-4b26-ca04-fa98-be9b6406007b.png)
結果は以下となり、tracertの結果からbackup側を通ってサーバと通信していることがわかります。
![image (92).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/be398890-11de-12bc-69df-0a612157e69a.png)

# 感想
簡単なネットワークですが何とか動きました。
当方CCNPまで持っているのですが、NW機器を実際に触ったことがなく、かつ普段はサーバばかり触っているのでネットワーク系の勘所みたいなのが薄く、たったこれだけの設定でも「あれ？」と思うことが結構ありました。やっぱり触ってみないとだめでした汗
最初OSPFでルーティングせずにスタティックにして詰んだのは内緒。当たり前といえば当たり前なのですがスタティックだと相手のルータが死んでるかとか考慮しないので、それはだめだろうという話ですね。