[新機能] EC2 インスタンス(Nitro)の通信内容をVPC側からミラーする VPC Traffic Mirroring が発表されました!

現在ボストンで開催中のAWS re:Inforceキーノートにて、 VPC Traffic Mirroring が発表されました! 発表を伝える公式ブログでは「仮想TAPと考えて良い」と謳われています。

You can think of VPC Traffic Mirroring as a “virtual fiber tap” that gives you direct access to the network packets flowing through your VPC.

New – VPC Traffic Mirroring – Capture & Inspect Network Traffic | AWS News Blog

Announcing Amazon VPC Traffic Mirroring for Amazon EC2 Instances

概要

公式ドキュメントに分かりやすい図付きで載っていますので参照して頂きたいのですが、簡単にいうと、

  • Nitro世代のEC2にアタッチされているENI、これに流れてくるトラフィックの内容を
  • 別のENI、あるいは NLB (UDPリスナ) に複製(ミラーリング。ミラートラフィックはVXLANでカプセル化)
  • ミラーするトラフィックは簡単なフィルターで選択する(IN/OUTやCIDR、L4ポートなど

そんな機能、ということになります。

インフラ業界に長い方は、「ネットワークスイッチのモニターポートを AWS の VPC で設定する」あるいは「経路上にTAPを設置する」と言えば伝わるでしょうか。

ちなみに Nitro世代というのは、現時点で下記のインスタンスファミリーのことになります:

  • A1, C5, C5d, M5, M5a, M5d, R5, R5a, R5d, T3, z1d

価格

VPC Traffic Mirroring は有料サービスになります。

Tokyoリージョンでは ENI あたり $0.018/時 ということで、USリージョンよりはちょっとだけお高めですね。

試してみた

実際に試してみます。
公式ドキュメントに OSS ツール「Suricata」でキャプチャする手順が書いてあります。

Suricata | Open Source IDS / IPS / NSM engine

ただし、ここでは単にミラーリングを試すだけなので、手軽な tcpdump でやってみました。OS は Ubuntu 18.04 を使っています。

試験環境としては以下になります。

Name Local IP Address ENI ID
ミラー元(Source) ec2-source 172.31.23.17 eni-04eee2e471a262e00
ミラー先(Target) ec2-target 172.31.24.159 eni-00d38ae672d7f31a8

Step 1: tcpdump インストール

まずはミラー先( ec2-target )に、 tcpdump をインストールします。apt-get でさくっと入れてしまいましょう。

$ sudo apt-get update
$ sudo apt-get install tcpdump

Step 2: Traffic Mirror target 設定

VPC Traffic Mirror target を設定(作成)します。下記のドキュメントに従って、 ec2-target の ENI を Traffic Mirror target にします。

マネジメントコンソールの VPC コンソールを開きます。左ペインの一番下に「Traffic Mirroring」という項目が増えてますね!

「Create Traffic Mirror Target」をクリックします。

順に設定していきます。

  • Target settings
    • Name tag - オプションらしいですがとりあえず ec2-mirroring-evaluation と設定しました
    • Description - オプションなので今回は未設定
  • Choose target
    • Target type - 今回は ENI なので Network Interface を選択します
    • Target - ターゲットとなる EC2 の ENI ID (eni-00d38ae672d7f31a8) を設定。ENI ID は例えば EC2 のコンソールで確認できます

問題なければ Create をクリックすると、Traffic mirror targets が作成されました。

Step 3: Traffic Mirror Filter の作成

下記ドキュメントにしたがってフィルターも作成します。これを使って複製するトラフィックを指定します。

今回はドキュメントに従って、インバウンドルールをひとつだけ作成しました。これで、IPレンジ全指定の全TCPパケットがフィルターにひっかかるはずです。

Step 4: Traffic Mirror Session の作成

ここでも下記ドキュメントに従って作業を進めます。

これにより、Step 2 で作成した Target に、Step 3 で作成した Filter を紐付けます。

  • Session settings
    • Mirror source - ここでは ec2-source EC2 インスタンスの ENI ID を指定しました
    • Mirror target - Step 2 で作成したターゲットを指定
  • Additional settings
    • Session number - ドキュメントにはありませんでしたが、数字を入れる必要があるようなので 1 を指定
    • Filter - Step 3 で作成したフィルターを指定

Create をクリックすれば完了です!

早速モニタ

tcpdump キャプチャしてみました。ちょっと分かりづらいですが、ソース EC2 ec2-source へ SSH ログインして作業しているパケットがキャプチャできていますね!

1.75.234.39 というのは、ソース EC2 に SSH ログインしていたクライアントの IP アドレスになります。

$ ip addr show
 :
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 06:af:9a:b6:51:88 brd ff:ff:ff:ff:ff:ff
    inet 172.31.24.159/20 brd 172.31.31.255 scope global dynamic ens5
       valid_lft 2517sec preferred_lft 2517sec
    inet6 fe80::4af:9aff:feb6:5188/64 scope link
       valid_lft forever preferred_lft forever
 :

$ sudo tcpdump -i ens5 -nt host 172.31.23.17
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens5, link-type EN10MB (Ethernet), capture size 262144 bytes

 :
IP 1.75.234.39.46136 > 172.31.23.17.22: Flags [P.], seq 3196050355:3196050391, ack 3350471176, win 2048, options [nop,nop,TS val 393279993 ecr 1939030639], length 36
 :
IP 1.75.234.39.46136 > 172.31.23.17.22: Flags [.], ack 37, win 2047, options [nop,nop,TS val 393280056 ecr 1939075803], length 0
 :

実運用上はキャプチャデータを保存して Wireshark で開いたり、公式ドキュメントのように Suricata などの高機能ツールを使うのがいいと思います。

まとめ

新たにリリースされた VPC Traffic Mirroring をご紹介しました。

ネットワークの細かい挙動がわからない、というのは昔からパブリッククラウドの欠点のように言われてきましたが、いまやもうそんな時代ではありません。キャプチャ対象が EC2、しかも Nitro世代限定と言うことで若干使う場面も限られるかもしれませんが、逆にいえばますます旧世代インスタンスにしがみついていると「もったいない」状況になりつつあります。

これからも AWS をどんどん活用していきましょう!