EC2上でパケットをミラーリング

2,935 views

Published on

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,935
On SlideShare
0
From Embeds
0
Number of Embeds
220
Actions
Shares
0
Downloads
16
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

EC2上でパケットをミラーリング

  1. 1. EC2上でパケットをミラーリング安川 健太Solutions ArchitectAmazon Data Services Japan
  2. 2. 自己紹介名前• 安川 健太• アマゾンデータサービスジャパンソリューションアーキテクト好きなAWSのサービス• CloudFormationソーシャル• @thekentiest• www.facebook.com/kenta.yasukawa趣味• 車いじり• パケットキャプチャ
  3. 3. 本日の発表EC2の上でレイヤーの低いところでいろいろ試してみた体験談を皆さんと共有• せいぜいL3とかL2とかくらいです• L1までは行きません(行けません)
  4. 4. ある日こんな質問を頂きましたパケットキャプチャ型のアクセス解析• HTTPのリクエストとレスポンスをスヌーピングしてWebアクセス解析• 一般的にはポートミラーリングしてパケットをキャプチャパケットキャプチャ型のアクセス解析ソフトを使っているシステムがあってAWS移行考えてるんだけどどうにかならない?古いシステムの移行だから出来れば手を入れたくないんだよねとはいえ、EC2ではポートミラーリングも何も。
  5. 5. というわけで、考えてみるこうすれば通過するパケット全部取れるけどAvailability Zone Availability ZoneWeb Webパケットコレクタ兼リバースプロキシとてもこんなシステム本番に投入できません!
  6. 6. ならばWebサーバに仕込むかWebサーバからパケットの複製をコレクタに送るAvailability Zone Availability ZoneWeb WebDNS RR等コレクタ• これならコレクタ障害時もサービスは継続可• コレクタはENIの付け替え等でフェイルオーバー可• コレクタのパケット取りこぼしリスクはポートミラーリングでも同様
  7. 7. どうするのがシンプルか考えてみるiptablesのteeターゲットを使えばパケットを集めるのは簡単• リクエストパケットはちゃんと取れそう• But, レスポンスパケットは無意味なデータにならパケットコピーしてL2で送りつけるか• Classic EC2じゃ無理• VPCだとしてもサブネット越えられない罠GET Web コレクタfe:ff:ff:ff:ff:ff …GET200OK200OKクライアントIPアドレスが残らない
  8. 8. L3トンネル掘るしかないですかねとはいえ• オーバーヘッドは最小限にしたい• 特別なソフトウェアは入れたくない• カーネルで処理を完結させたいのが人情IP-in-IPにしましょうか
  9. 9. IP-in-IPでコレクタにパケットを集める図にしてみるとコレクタWeb 1Web 2GET192.168.1.10192.168.1.100 192.168.1.101200OKENIのSource/Destinationチェックは外すこと!200OKGET192.168.1.10 192.168.1.20GETGET192.168.1.10 192.168.1.20Dst Src
  10. 10. IP-in-IPトンネルを作ってtcでパケットのコピーを流し込むよう設定Webサーバ側コレクター側# ip tunnel add ipip0 mode ipip remote 192.168.1.20 local 192.168.1.10 ttl 64# ip tunnel add ipip0 mode ipip remote 192.168.1.10 local 192.168.1.20 ttl 64# tc qdisc add dev eth0 root handle 10: prio# tc filter add dev eth0 parent 10: prio 10 protocol ip u32 match ip protocol 60xff match ip sport 80 0xffff flowid 10:1 action mirred egress mirror dev ipip0# tc qdisc add dev eth0 ingress# tc filter add dev eth0 parent ffff: prio 10 protocol ip u32 match ip protocol 60xff match ip dport 80 0xffff flowid 10:1 action mirred egress mirror dev ipip0
  11. 11. 早速検証開始!コレクタで tcpdump -n -i ipip0手元のPCで curl http://<web serverのIPアドレス>カーネルが刺さる。。。
  12. 12. パケットキャプチャしてみると# tcpdump -n -i ipip0listening on ipip0, link-type RAW (Raw IP), capture size 65535bytes06:20:11.189928 IP 54.248.89.97.43276 > 192.168.1.133.http:Flags [S], seq 3142846341, win 14600, options [mss1460,sackOK,TS val 41435115 ecr 0,nop,wscale 4], length 006:20:11.189961 unknown ip 0なんだこれ?
  13. 13. もう少し詳しく見てみるとあれ?IPヘッダがこんなところから始まってる14 octetsなんだ、Ethernetのヘッダじゃないかご丁寧に次がIPヘッダって書いてあるしループバックや物理I/Fには出ないトンネルI/Fだけに出る挙動 … バグ?
  14. 14. 仕方ないのでコードを書く元のIPパケットを新しいIPパケットのペイロードに新しいIPヘッダを生成プロトコル番号を4 (= IP in IP)にセット
  15. 15. 期待通り動きましたやってみまーす!よかったらこちらで検証などを
  16. 16. ところでVPCならL2も自由になります
  17. 17. VPCならいろいろL2を使ったトリックが使えそうL2 NAT (ebtablesとか)DSR (Direct Server Return)なんちゃってブロードキャスト/マルチキャスト• ブロードキャストEthernetフレームをユニキャストで送り直す
  18. 18. まとめIP-in-IPを使えばパケットを集めてキャプチャするようなユースケースも実現出来る但し、IP-in-IP + tc on Linuxは要注意VPCならL2まで自由が利く人から聞いた「クラウドだと○○は出来ない」は鵜呑みにせず試してみるのが大事

×