はじめまして、2023年3月にサーバーワークスに入社した山本拓海です。
以後よろしくおねがいします。
好きなレッド・ツェッペリンのアルバムはフィジカル・グラフィティです。
来週実施されるネットワークスペシャリスト試験の試験を受ける予定です。
https://www.ipa.go.jp/shiken/kubun/nw.html
現在試験対勉強の真っ只中ですがなかなか難航してます。特に冗長化技術まわりの理解が難しいです。 また、冗長化技術はなかなか気軽に触ることや、動いているのを見るためのハードルがちょっと高いです。 なにか方法を探したところ、Amazon VPCのよくある質問「VPC トラフィックミラーリング」にこのような記述を見つけました。
Q:Amazon VPC トラフィックミラーリングはどのように機能しますか? トラフィックミラーリングは、Amazon VPC 内の EC2 インスタンスの Elastic Network Interface (ENI) からのネットワークトラフィックをコピーする機能です。 中略 トラフィックミラーリングでは、コピーされたすべてのトラフィックを VXLAN ヘッダーでカプセル化します。
VPCトラフィックミラーリングでVXLANを使っているようなので、 このパケットをキャプチャしてVXLANのヘッダーをながめることにします。
VPCトラフィックミラーリングについて
VPCトラフィックミラーリングでは特定のネットワークインターフェイスからのネットワークトラフィックをコピーします。
VPCトラフィックミラーリングの使用用途としては
トラフィックのコピーを帯域外セキュリティおよび監視アプライアンスに送信して、
コンテンツ検査、脅威のモニタリング、トラブルシューティングを行うための機能です。
ミラーリングできるNICとミラーリングされたトラフィックを受け取るNICは同じVPCか、 またはVPC ピアリングまたは AWS Transit Gateway で接続されたVPCに存在している必要があります。
今回ながめたいヘッダに関してですが、 VPCトラフィックミラーリングの解説ページにトラフィックミラーリングによって付加されるヘッダが確認できます。 https://docs.aws.amazon.com/ja_jp/vpc/latest/mirroring/traffic-mirroring-how-it-works.html
VXLANについて
VXLANとは
VXLAN(Virtual eXtensible Local Area Network)とは、L3ネットワーク上に論理的なL2ネットワークを構築するトンネリングプロトコルのことです。 L3ネットワーク上にL2ネットワークを構築する = ネットワーク越しにある2つのネットワークを1つのネットワークとして運用することが可能になります。 物理的に離れたネットワーク、例えば本社と支社間で同じDHCPサーバからIPアドレスを払い出して運用することが可能になります。
VXLANフレームとVXLANヘッダ
VXLANはイーサネットフレームをVXLAN対応ルータ間でカプセル化して送受信します。 カプセル化する際に通常のイーサネットフレームにVXLANヘッダを追加します。 VXLANにて追加されるヘッダにある宛先ネットワークやVXLANの識別子(VNI)を解析して通信が可能となります。
VNIは24ビット
VXLANの誕生した背景の1つに同じくLANを仮想化する技術のVLANにて、VLAN IDの上限が少ないという経緯がありました。 VLAN IDの上限は12ビットなので4096です。 VXLANではVLAN IDに該当するVNIで3バイト= 24ビット16,777,216まで使えます。使えすぎ。
手順について
今回は同一VPC間の2台のインスタンス間でミラーリングを行い、
ミラーターゲットインスタンスで取得したイン/アウトバウンドトラフィックのフレームのVXLANヘッダを
ローカルのWireSharkでをながめます。
今回のVPCの構成図です。
1. vpcトラフィックミラーリングの設定
1. ミラーターゲットの設定
最初にミラーターゲットの設定を行います。
ミラーターゲットはミラーソースになるNICからトラフィックのコピーを受け付けるNICです。
VPC画面の左カラムの下部から画面へ。
ミラーターゲットに設定するネットワークインターフェイスは コピーしたパケットを受け取りたいインスタンスで使用しているENIのidを指定します。
2. ミラーフィルターの設定
次にミラーフィルターの設定を行います。
フィルターの設定をすることでどのトラフィックをコピーするかをフィルターできます。
今回はamazon-dnsのチェックを外します。
また、特定のパケットを指定す必要がないのでフィルターも不要です。
全部のトラフィックをキャプチャする設定にしておきます。
3. ミラーセッションの設定
ミラーセッションを作成します。
ミラーソースにはミラーソースインスタンスにアタッチしているネットワークインターフェイスを、
ミラーターゲットには先程作成したターゲットを設定します。
追加設定ではセッション数(セッション番号?)は特に決めていないので「1」に設定し、フィルタは先程作成したフィルタを設定します。 VNIは、VXLANの特徴であるVLANの数よりはるかに多いIDを設定できることを踏まえて大きめの数字を設定します。
VPC側の設定はこれで終わりです。 なお、ミラーセッションの設定では該当のEC2インスタンスが立ち上がっていないとエラーとなります。
立ち上げて再度作成。
問題なく作成できました。
2. ミラーターゲットのセキュリティグループの設定
次にミラーターゲットのネットワークインターフェイスにアタッチするセキュリティグループのインバウンドルールを編集します。 ターゲットとなるネットワークインターフェイスはUDPの4789ポートをオープンしておく必要があります。
準備ができました。
3. パケットキャプチャ開始
ミラーターゲットインスタンスにログインします。 ここで一度パケットをキャプチャして確認。
$ sudo tcpdump -i eth0 -n port 4789 -vvv
次は別タブでミラーソースインスタンスにログインして 外部と通信します。
ミラーターゲット側でパケットを受け取ったことを確認しました。
せっかくなので、nginxで待ち受けているときのパケットと外部にHTTPSリクエスト送っているときのパケットをキャプチャします。
ミラーターゲットインスタンスのコマンドを以下に変更し、ファイルに出力します。
$ sudo tcpdump -i eth0 -n port 4789 -vvv -p -s0 -X -t -w outbound.pcap
ミラーソースインスタンスで再度外部にリクエスト。
外部にHTTPSリクエスト送っているときのパケットのファイルを取得しました。
次はnginxで待ち受けているときのパケットです。
nginxをスタートして、ローカルからリクエストを投げます。
作成した2つのファイルをローカルでwiresharkで確認します。
4. wiresharkで確認
wiresharkで外部にHTTPSリクエスト送っているときのパケットのファイルを開きます。
この3つのヘッダがawsのドキュメントにあった外部IPヘッダ、外部UDPヘッダ、VXLANヘッダです。
これがVXLANヘッダです。VNIが指定した9999999になっています。
1つ気になるのは、参考書やその他の資料にあるVXLANヘッダの形式は
冒頭のVXLANヘッダの画像の通り、1バイト - 3バイト - 3バイト - 1バイト
の構造だったのですが、
キャプチャしたものを確認すると 2バイト(Flags) - 2バイト(Group Policy Id) - 3バイト(VNI) - 1バイト(Reserved)
の構造です。
これは調査に時間がかかりそうなので別の機会に調査します。
パケットの内容はがっつり暗号化されています。 SSLセッションの中身はネスペの問題に出てきそうですが、残念。
次にnginxで待ち受けているときのファイルです。 VXLANヘッダには特に変化は見られません。
このパケットは暗号化されていないので、通信内容がよくわかります。 3wayハンドシェイクのパケットを見つけました。
なるほど、当たり前ですが仕様通りです。 想定外だったのはこの3つのパケットの間に同一区間の別のTCPパケットがあったことです。 3wayハンドシェイクのパケットは必ず順番どおりに送受信されるわけではないんですね。勉強になります。
おわりに
VPCトラフィックミラーリングを使ってキャプチャしたフレームからVXLANのヘッダや
3wayハンドシェイクのパケットを見てみました。
VXLANのヘッダはawsで簡単に見れるので、こんな具合でながめたり調べるといい現実逃避試験対策になると思います。
今年のネスペ試験まであと1週間ほど、気を引き締めてがんばります。