【vyos on VMware Playerでネットワークのお勉強】(003) BGP通信

## はじめに

みなさま。こんにちは。
最近の運動不足を解消するために、近場の山に一人ハイキング行ったのですが、途中で下山をするはめになりました。
行き慣れたところではあるのですが、17時を超えると木々の奥の方でキツネやら山猫やらが飛び移る音が周囲に響き渡るし、周囲が暗いから耳が過敏になるし、17時30分を超えると足元を見るのがやっとの暗さだし、登山下山含め一人ともすれ違わなかったので、かなり怖かったのです。
田舎に住んでいたときは、夜の山を怖いと思ったことはなかった(むしろ楽しんでいた？)くらいなのだけど、都会ぐらしで臆病になってしまったのか、年をとったと言うことなのか。
（警官や自衛官にこの話を聞かれたら鼻で笑われるでしょうけど、当方文系インドア派なので外の世界には興味より恐怖の方が心を占める割合が大きいのです。）

そんな、何やかやもありますが、本記事(002)から(004)にかけて、まずは、以下のような環境を作っています。
(今回はBGP通信まで)
![Quiita002_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/e8002a68-1d08-f646-b4d6-3f857b9ec9dd.png)

## 使用する環境
| # | 使用環境 | 備考 | 
|:-:|:------------|:---|
| 1 | vyos-1.4 | 192.168.151.0/24(VMnet2), 192.168.161.0/24(VMnet3) |
| 2 | vyos-1.4 | 192.168.151.0/24(VMnet2), 192.168.171.0/24(VMnet4) |
| 3 | vyos-1.4 | 192.168.171.0/24(VMnet4), 192.168.181.0/24(VMnet5) |
| 4 | CentOS 8 Stream | HTTPサーバ(192.168.161.101) |
| 5 | CentOS 8 Stream | HTTPクライアント(192.168.181.101) |

## 本稿で構築する環境
本稿では、
1. vyOS1とvyOS3間でGREトンネルを張る
2. 192.168.161.0/24と192.168.181.0/24をBGPで交換する
3. 192.168.181.101(HTTPクライアント)から192.168.161.101(HTTPサーバ)にアクセスする
の3点を記載していこうと思います。

vyOS02はパケット取得用の環境として扱います。

なお、vyOS1、vyOS2、vyOS3は[前回の作業](https://qiita.com/o_chan_t/items/6974b805051e2187d139)にてOSPFで互いに通信のやり取りが可能になっていることを前提としています。

## vyOS1とvyOS3間でGREトンネルを張る
下記GREトンネル設定を行います。
![Quiita003_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/8ecf2994-df9d-8c0a-bc5f-d90ee5286a25.png)


```shell:vyatta01.sh
set interfaces tunnel tun0 address '192.168.155.11/24'
set interfaces tunnel tun0 encapsulation 'gre'
set interfaces tunnel tun0 remote '192.168.171.12'
set interfaces tunnel tun0 source-address '192.168.151.11'
```
```shell:vyatta03.sh
set interfaces tunnel tun0 address '192.168.155.12/24'
set interfaces tunnel tun0 encapsulation 'gre'
set interfaces tunnel tun0 remote '192.168.151.11'
set interfaces tunnel tun0 source-address '192.168.171.12'
```
### 実行結果の確認
```shell:vyatta01.sh
vyos@vyos:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup

・・・
C>* 192.168.155.0/24 is directly connected, tun0, 00:08:19
・・・
vyos@vyos:~$ ping 192.168.155.12
PING 192.168.155.12 (192.168.155.12) 56(84) bytes of data.
64 bytes from 192.168.155.12: icmp_seq=1 ttl=64 time=1.63 ms
64 bytes from 192.168.155.12: icmp_seq=2 ttl=64 time=3.39 ms
64 bytes from 192.168.155.12: icmp_seq=3 ttl=64 time=3.34 ms
```
```shell:vyatta03.sh
vyos@vyos:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup

・・・
C>* 192.168.155.0/24 is directly connected, tun0, 00:09:37
・・・
```
vyOS02で取得したパケットでもGREでカプセル化されていることがわかります。
（パケットは本稿最後の方にGITのリンクを記載します。）
![Quiita003_001_GREトンネル.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/5ae83ff2-7799-35f8-1adf-86ad79f7b355.jpeg)

## 192.168.161.0/24と192.168.181.0/24をBGPで交換する

下記BGP交換を行います。
![Quiita003_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/2ca52c54-db5f-c76d-5c4b-e89b83319436.png)


```shell:vyatta01.sh
vyos@vyos:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup

・・・
B>* 192.168.181.0/24 [200/0] via 192.168.155.12, tun0, weight 1, 00:00:14
・・・
```
```shell:vyatta03.sh
vyos@vyos:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup

・・・
B>* 192.168.161.0/24 [200/0] via 192.168.155.11, tun0, weight 1, 00:00:23
・・・
```
### 実行結果の確認

```shell:vyatta01.sh
set interfaces tunnel tun0 address '192.168.155.11/24'
set interfaces tunnel tun0 encapsulation 'gre'
set interfaces tunnel tun0 remote '192.168.171.12'
set interfaces tunnel tun0 source-address '192.168.151.11'
```
```shell:vyatta03.sh
set interfaces tunnel tun0 address '192.168.155.12/24'
set interfaces tunnel tun0 encapsulation 'gre'
set interfaces tunnel tun0 remote '192.168.151.11'
set interfaces tunnel tun0 source-address '192.168.171.12'
```

vyOS02で取得したパケットでもBGPがGREトンネルを介してやり取りされていることがわかります。
（パケットは本稿最後の方にGITのリンクを記載します。）
![Quiita003_002_BGP_01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/8fd967e1-29bc-bcba-cfc5-db22fcd62ebe.jpeg)


### 余談

BGPのオプションについては、情報処理技術者試験(NW)でも、ときどき問われたりするので知っておいた方がいいと思います。
というか、一昔前と比べてBGPの出題頻度が高くなった気がしています。
これは、昨今のクラウド移行ブームが原因なのでしょうね。
（一昔前はL2のループやVRRP、OSPFばかり見ていた気がします）
別に知識だけで解くことは可能ですが、実際にパケット見たり動かしたりしたほうが理解の深さが違いますので。
次の稿で記載予定のIPsecについては、情報処理技術者試験(NW/SC)が大好きな技術ですし、実務でも非常によく登場する技術です。

## 192.168.181.101(HTTPクライアント)から192.168.161.101(HTTPサーバ)にアクセスする

### HTTPサーバにApacheをインストールし、192.168.181.11(vyOS03)にアクセスできることを確認する

```shell:HTTPServer.sh
[root@localhost ~]# yum install -y httpd
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# vi /var/www/html/index.html
```
```shell:HTTPServer.sh(index.html)
<h1>hello world</h1>
```
```shell:HTTPServer.sh
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor pres>
   Active: active (running) since Fri 2021-11-05 22:32:29 EDT; 4s ago
     Docs: man:httpd.service(8)
```
```shell:HTTPServer.sh
[root@localhost ~]# nmcli connection modify ens33 ipv4.address 192.168.161.101/24
[root@localhost ~]# nmcli connection modify ens33 ipv4.gateway 192.168.161.11 ipv4.never-default no
[root@localhost ~]# nmcli connection modify ens33 ipv4.method manual
[root@localhost ~]# nmcli connection down ens33
[root@localhost ~]# nmcli connection up ens33
[root@localhost ~]# ping 192.168.181.11
PING 192.168.181.11 (192.168.181.11) 56(84) bytes of data.
64 bytes from 192.168.181.11: icmp_seq=1 ttl=63 time=3.07 ms
64 bytes from 192.168.181.11: icmp_seq=2 ttl=63 time=2.98 ms
64 bytes from 192.168.181.11: icmp_seq=3 ttl=63 time=2.51 ms
```
### HTTPクライアントにアドレスを設定し、192.168.161.101(HTTPSサーバ)にアクセスできることを確認する
```shell:HTTPClient.sh
[root@localhost ~]# nmcli connection modify ens33 ipv4.address 192.168.181.101/24
[root@localhost ~]# nmcli connection modify ens33 ipv4.gateway 192.168.181.11 ipv4.never-default no
[root@localhost ~]# nmcli connection modify ens33 ipv4.method manual
[root@localhost ~]# nmcli connection down ens33
[root@localhost ~]# nmcli connection up ens33
[root@localhost ~]# ping 192.168.161.101
PING 192.168.161.101 (192.168.161.101) 56(84) bytes of data.
64 bytes from 192.168.161.101: icmp_seq=1 ttl=62 time=3.44 ms
64 bytes from 192.168.161.101: icmp_seq=2 ttl=62 time=3.58 ms
64 bytes from 192.168.161.101: icmp_seq=3 ttl=62 time=2.15 ms
```
### HTTPクライアントからHTTPSサーバにアクセスする
```shell:HTTPClient.sh
[root@localhost ~]# curl http://192.168.161.101
<h1>hello world</h1>
```

### vyOS2で通過したパケットの確認

vyOS03配下のHTTPクライアントからvyOS01配下のHTTPサーバへアクセスしたので、経路上に存在するvyOS02上を経由したパケットを確認してみます。
![Quiita003_003_HTTP通信.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/bc4de522-963a-c90f-4f78-4cf228023e2b.jpeg)


## Wiresharkパケット
今回の環境構築で取得したWiresharkのパケットを下記gitにアップロードしたので、興味のある方はご参照ください。
[Qiita_003_Packet on Git](https://github.com/wakaprings/wireshark_qiita_003.git)

今回は、GREでトンネルを作っただけなので、パケットキャプチャによって通信の中身が丸見えというのがよくわかりました。
次回は、vyOS01とvyOS3間でIPsecを張って、vyOS2でパケットキャプチャしても通信の中身を見えないようにします。

## 参考リンク
[【vyos on VMware Playerでネットワークのお勉強】(002) OSPF通信の疎通](https://qiita.com/o_chan_t/items/6974b805051e2187d139)
[【vyos on VMware Playerでネットワークのお勉強】(001)ご挨拶](https://qiita.com/o_chan_t/items/6e2a436dd162ac6b278e)