CML2を使いこなす。（その13：トラフィックジェネレータの準備）

# はじめに
`CML2`をネットワーク設計の検証で使っていると、ACLやNATが想定通りに動くかどうかを確認したり、一連の流れのパケットを送信して確認したりしたいことがあるかと思います。

`CML2`には疑似トラフィックを生成できる**トラフィックジェネレータ**が導入されているため、今回は**トラフィックジェネレータ**の`TRex`を使用するまでの準備を行っていこうと思います。

- 【前】[CML2を使いこなす。（その12：カスタムイメージの導入）](https://qiita.com/sakai00kou/items/343d3e5782c164367dde)
- 【次】[CML2を使いこなす。（その14：トラフィックの生成）](https://qiita.com/sakai00kou/items/400d1be5aadfba0c0b14)

# TRex使用前の準備
`TRex`を使うためにはいくつか準備が必要となるため、準備を行っていきます。

## TRex Stateless Guiのインストール
`TRex`はラボに配置するノードとして実装されており、トラフィックを流したい場所に配置して使うことで任意のパケットをネットワーク上に流せます。

トラフィックの生成には`TRex Stateless Gui`というクライアントソフトを使って生成する必要があるので、以下ページよりダウンロード＆インストールします。（インストール手順は割愛）

- [TRex Stateless GUI公式ページ](https://github.com/cisco-system-traffic-generator/trex-stateless-gui)
- [TRex Stateless GUIダウンロードページ](https://github.com/cisco-system-traffic-generator/trex-stateless-gui/releases/tag/v4.5.6)

## TRex 2.82の導入
2021年9月現在、ノードイメージが含まれる`Reference platform`のISOファイルの最新は`refplat_p-20210511-fcs.iso`となり、このISOファイルには`TRex 2.88`が含まれています。

但し、現状最新となる`TRex Stateless Gui v4.5.6`では`TRex 2.88`が使用する最新のJavaバージョンに対応しておらず、使えません。

そのため、1つ前の`Reference platform`のISOファイルとなる`refplat_p-20201110-fcs.iso`に入っている`TRex 2.82`を別途導入します。

## refplat_p-20201110-fcs.isoのダウンロード
`Cisco`の`My Account`のページから「**All Release**」→「**2.1**」→「**CML-Personal 2.1.1**」にある、`refplat_p-20201110-fcs.iso`をダウンロードします。

`My Account`にたどり着けない場合は過去の以下記事を参照。

- [CML2を使いこなす。（その１：ダウンロードとデプロイ）](https://qiita.com/sakai00kou/items/e91e747cac7fe07bb6aa)

## TRex 2.82の登録
ダウンロードした`refplat_p-20201110-fcs.iso`をマウントすると、「**/[マウントパス]/virl-base-images/alpine-3-12-trex282**」に`QCOW2`イメージがあるため、`CML2`の「**TOOLS**」→「**Node and Image Definitions**」→「**IMAGE DEFINITIONS**」から`Image Definitions`を作成します。

尚、`Node Definitions`は既に実装済みの`TRex`の`Node Definitions`を選択するため、新たに作成は不要です。

`Image Definitions`の設定は実装済みの`TRex`の`Image Definitions`を参考に、以下のようにしました。

### General

|項目名|カスタムイメージの設定|
|:--|:--|
|ID|alpine-3-12-trex282|
|Label|TRex 2.82|
|Description|TRex 2.82 (based on Alpine 3.12)|
|Disk Image|alpine-3-12-trex282.qcow2|
|Node Definition|TRex|

### Linux Native Simulation

|項目名|カスタムイメージの設定|
|:--|:--|
|Memory|-|
|CPUs|-|
|CPU Limit|-|
|Data Disk Size|-|
|Boot Disk Size|-|

もし`Image Definitions`の作成方法が分からなければ前回の記事を参照してください。

## TRex 2.82の指定
`TRex`を使うため、適当なラボを作成して、`TRex`を配置しておきます。

何もしなければ最新バージョンの`TRex`が起動してしまいますが、今回のように1つの`Node Definitions`に複数の`Image Definitions`が結びついている場合、配置したノードの「**SIMULATE**」→「**Image Definition**」の「**i**」を選択すると、起動する際のバージョンを選択できます。

![capture_04092021_112538.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/a77a9bea-2fcd-6d08-a5a7-46fd3e64eb7a.jpeg)

ひとまず起動はせず、`Image Definition`から`TRex 2.82`の選択だけ行っておきます。

![capture_04092021_112832.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/8fe9a2cd-d337-7edf-7700-f1e94bc6cd6f.jpeg)

# TRexのネットワーク構成
`TRex`ノードのインタフェースは3ポートまで使用できますが、以下表のようにクライアントから`TRex Stateless Gui`で接続するインタフェースは`eth0`、生成したトラフィックを送信するインタフェースは`eth1`、`eth2`と決められています。

そのため、ラボに配置する際には接続するインタフェースを間違えないようにしましょう。

|インタフェース名|用途|
|:--|:--|
|eth0|TRex Stateless Gui接続用|
|eth1|生成トラフィック送信用1|
|eth2|生成トラフィック送信用2|

# TRexへの接続
前述の通りトラフィックの生成はクライアントにインストールされている`TRex Stateless Gui`を使って生成するため、クライアントから`TRex`に接続する必要があることから、クライアントからラボ内部に接続しなければなりません。

そのため、`External Connector`を**ブリッジモード**で配置しておきます。

**ブリッジモード**への設定は以下参照。

- [CML2を使いこなす。（その５：外部との接続）](https://qiita.com/sakai00kou/items/3ed6d644935b8cb7fcb9)

また、`TRex`はアドレスをDHCPでもらう必要があるので、ブリッジネットワーク側でDHCPサーバを用意しておきます。

`TRex`起動後、コンソール画面を確認すると、以下のようにアドレスが表示されるため、クライアントから表示されているアドレスで接続を行います。

![capture_04092021_192807.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/29624d44-f6e4-9e6e-0833-8a221713d086.jpeg)

クライアントから先ほどインストールした`TRex Stateless Gui`を起動し、「**File**」→「**Connect**」の「**Connections**」にアドレスを入力して「**Connect**」を選択することで`TRex`に接続できます。

![capture_06092021_072526.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/2224ee3b-b023-6fc3-8522-3c5a510e71a4.jpeg)

画面下の「**Log View**」にエラーが表示されず、「**Connected**」と表示されれば接続完了です。

# コンソールからの操作
先ほどアドレス確認するために開いた`TRex`のコンソールを見ると、画面下のバーに以下のようなメニューが表示されています。

![下バー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/90acf7f6-f724-cf4a-7dcd-70d216cf99aa.jpeg)

それぞれ以下のようなメニューとなっており、それぞれ「**Ctrl + B**」を押した後、「**番号**」を入力することで画面を切り替えることができます。

|番号|メニュー|説明|
|:--|:--|:--|
|0|SHELL|アドレス情報の表示|
|1|SCAPY|TRexのOS操作|
|2|TREX|統計情報の表示|

- SHELLメニュー画面
![capture_07092021_083646.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/e5bb11d2-3a54-642f-4059-b4c6a06ef445.jpeg)

- SCAPYメニュー画面
![capture_07092021_083715.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/52bd84ef-7171-79a4-0c40-878fdd388753.jpeg)

- TREXメニュー画面
![capture_07092021_083753.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/2c05feec-9887-1990-f6f9-2d99b42534b0.jpeg)

# （おまけ）TRex管理ポートのアドレス固定方法
コンソールから`SCAPY`メニュー画面にログインすればOS操作ができるので、OS操作でIPアドレスを固定することでDHCPサーバが存在しなくてもアドレスを割り振ることができます。

ちなみに`TRex`は`Alpine Linux`で動作しているため、アドレス固定の他にもOS操作を行いたい場合は、`Alpine Linux`のコマンド操作である程度のことを行うことが可能です。

## /etc/network/interfacesの修正
IPアドレスを固定するには`/etc/network/interfaces`の設定を変更する必要があります。

デフォルトだと以下のように`DHCP`の設定となっています。

```shell:変更前/etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
        hostname localhost
```

`vi`でアドレスなど変更した例。

```shell:変更後/etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        hostname localhost
        address 172.24.0.100
        netmask 255.255.255.0
        gateway 172.24.0.1
```

## ネットワークサービス再起動
設定したら以下コマンドでネットワークサービスを再起動させます。

```shell:ネットワークサービスの再起動
/etc/init.d/networking restart
```

`ip`コマンドやコンソール接続した際の画面上でアドレスが変更されていれば成功です。

# おわりに
今回は`TRex`を使用するための準備まで行いました。

次回は`TRex Stateless Gui`を使用して実際にトラフィックを生成してみようと思います。