Amazon-VPC

VPCトラフィックミラーリングを使ってみた

はじめに

こんにちは、ディーネットの山田です。

VPCトラフィックミラーリングについて、検証する機会がありましたのでその記録になります。

VPCトラフィックミラーリングとは

ミラー対象に指定したENI(Elastic Network Interface)を通るトラフィックの中身をミラーリングすることができる。(※)
ミラーリングしたパケットを、別のENIやNLB、GWLBに対して転送することができるので、パケットをモニタリングすることが可能。

※:AWSドキュメントによると、EC2やRDSで使われるENIが対象とのことであるが、様々な制約(使えないインスタンスタイプなど)が設けられているので事前に確認されることをおすすめします。
Traffic Mirroring limitations and quotas
 

動作検証環境について

構成図

以下のような構成を構築して、『Web Server』のENIに流れるパケットを『Packet Monitor』にミラーします。

EC2の詳細

  • OS:Ubuntu
  • インスタンスタイプ:t3.small

設定方法

1. トラフィックミラーターゲットを作成

『Packet Monitor』サーバのENIをターゲットに設定します。

2. トラフィックミラーフィルタを作成

『Web Server』のENIを流れる許可された全ての通信をフィルターします。

3. トラフィックミラーセッションを作成

『Web Server』のENIを流れるパケットをミラーするためにセッションを作成します。

4. トラフィックミラーターゲットのセキュリティグループでVXLANポート宛ての通信を許可

ミラーリングしたパケットの転送先を、別のENIもしくはNLBにした場合は、VXLAN(UDP:4789)でカプセル化されたパケットが転送されてくるので、こちらを受け取る形になります。
今回は、EC2で受け取るので、セキュリティグループでVXLANのパケットを許可しています。
VPCのCIDR範囲内からVXLANパケットが転送されているので、許可する

動作検証

実際に、ミラー対象に設定したENIを持つEC2から通信を発生させて、パケットがミラーされるか検証します。

1. ミラーされたパケットを受け取るEC2でパケットキャプチャを実施

tcpdump -i any -n -n udp and port 4789

2. 外部宛ての通信を発生

curl http://ifconfig.me

3. パケットキャプチャされたか確認

09:30:57.028248 IP 10.10.10.252.65509 > 10.10.10.159.4789: VXLAN, flags [I] (0x08), vni 3786484
IP 10.10.10.252.51784 > 34.160.111.145.80: Flags [S], seq 321958476, win 62727, options [mss 1460,sackOK,TS val 653896661 ecr 0,nop,wscale 7], length 0
09:30:57.030852 IP 10.10.10.252.65509 > 10.10.10.159.4789: VXLAN, flags [I] (0x08), vni 3786484
IP 34.160.111.145.80 > 10.10.10.252.51784: Flags [S.], seq 3393678540, ack 321958477, win 65535, options [mss 1412,sackOK,TS val 1359238426 ecr 653896661,nop,wscale 8], length 0
09:30:57.030883 IP 10.10.10.252.65509 > 10.10.10.159.4789: VXLAN, flags [I] (0x08), vni 3786484
IP 10.10.10.252.51784 > 34.160.111.145.80: Flags [.], ack 1, win 491, options [nop,nop,TS val 653896663 ecr 1359238426], length 0
09:30:57.030911 IP 10.10.10.252.65509 > 10.10.10.159.4789: VXLAN, flags [I] (0x08), vni 3786484
IP 10.10.10.252.51784 > 34.160.111.145.80: Flags [P.], seq 1:76, ack 1, win 491, options [nop,nop,TS val 653896663 ecr 1359238426], length 75: HTTP: GET / HTTP/1.1
09:30:57.033486 IP 10.10.10.252.65509 > 10.10.10.159.4789: VXLAN, flags [I] (0x08), vni 3786484
IP 34.160.111.145.80 > 10.10.10.252.51784: Flags [.], ack 76, win 256, options [nop,nop,TS val 1359238428 ecr 653896663], length 0
09:30:57.182224 IP 10.10.10.252.65509 > 10.10.10.159.4789: VXLAN, flags [I] (0x08), vni 3786484
IP 34.160.111.145.80 > 10.10.10.252.51784: Flags [P.], seq 1:299, ack 76, win 256, options [nop,nop,TS val 1359238577 ecr 653896663], length 298: HTTP: HTTP/1.1 200 OK
09:30:57.182309 IP 10.10.10.252.65509 > 10.10.10.159.4789: VXLAN, flags [I] (0x08), vni 3786484
IP 10.10.10.252.51784 > 34.160.111.145.80: Flags [.], ack 299, win 489, options [nop,nop,TS val 653896815 ecr 1359238577], length 0
09:30:57.182532 IP 10.10.10.252.65509 > 10.10.10.159.4789: VXLAN, flags [I] (0x08), vni 3786484
IP 10.10.10.252.51784 > 34.160.111.145.80: Flags [F.], seq 76, ack 299, win 489, options [nop,nop,TS val 653896815 ecr 1359238577], length 0

余談

VXLANのパケットをキャプチャすることができましたが、複数のセッションを単一のターゲットで受け取る場合は、識別が困難になるのでVXLANのNICを専用に設けることで分離可能です。

ip link add vxlan0 type vxlan id {VPCトラフィックミラーリングセッションで払い出されたVNI} dstport 4789 dev {対象のNIC名}
ip link set up vxlan0
tcpdump -i vxlan0 -n -n tcp and port 80

VXLANのカプセル化が解かれた状態でパケットキャプチャすることができました。

09:34:12.475730 IP 10.10.10.252.33072 > 34.160.111.145.80: Flags [S], seq 1950187432, win 62727, options [mss 1460,sackOK,TS val 654092108 ecr 0,nop,wscale 7], length 0
09:34:12.477950 IP 34.160.111.145.80 > 10.10.10.252.33072: Flags [S.], seq 950844825, ack 1950187433, win 65535, options [mss 1412,sackOK,TS val 136975324 ecr 654092108,nop,wscale 8], length 0
09:34:12.478044 IP 10.10.10.252.33072 > 34.160.111.145.80: Flags [.], ack 1, win 491, options [nop,nop,TS val 654092110 ecr 136975324], length 0
09:34:12.478071 IP 10.10.10.252.33072 > 34.160.111.145.80: Flags [P.], seq 1:76, ack 1, win 491, options [nop,nop,TS val 654092110 ecr 136975324], length 75: HTTP: GET / HTTP/1.1
09:34:12.480331 IP 34.160.111.145.80 > 10.10.10.252.33072: Flags [.], ack 76, win 256, options [nop,nop,TS val 136975326 ecr 654092110], length 0
09:34:12.629622 IP 34.160.111.145.80 > 10.10.10.252.33072: Flags [P.], seq 1:299, ack 76, win 256, options [nop,nop,TS val 136975476 ecr 654092110], length 298: HTTP: HTTP/1.1 200 OK
09:34:12.629675 IP 10.10.10.252.33072 > 34.160.111.145.80: Flags [.], ack 299, win 489, options [nop,nop,TS val 654092262 ecr 136975476], length 0
09:34:12.630115 IP 10.10.10.252.33072 > 34.160.111.145.80: Flags [F.], seq 76, ack 299, win 489, options [nop,nop,TS val 654092262 ecr 136975476], length 0
09:34:12.632402 IP 34.160.111.145.80 > 10.10.10.252.33072: Flags [F.], seq 299, ack 77, win 256, options [nop,nop,TS val 136975479 ecr 654092262], length 0
09:34:12.632444 IP 10.10.10.252.33072 > 34.160.111.145.80: Flags [.], ack 300, win 489, options [nop,nop,TS val 654092265 ecr 136975479], length 0

まとめ

  • VPCトラフィックミラーリングを用いることで、EC2にログインすることなくパケットキャプチャすることができた。
  • エージェント型ではないパケット解析ツールを用いてパケット通信を見える化できるようになった。

次回は、違うVPCからトラフィックミラーターゲットにミラーリングを集約する方法をご紹介したいと思います。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA