2015.10.16 Flowops22

Preview:

Citation preview

(C)Copyright 1996-2015 SAKURA Internet Inc.

IaaS の L2 ネットワークに

sFlow を導入した話

さくらインターネット研究所 大久保 修一ohkubo@sakura.ad.jp

2015/10/16 flowops22

2

• 今回 flowops では3回目になります。

• 2010/4/2 Flowops Meeting - 12th

– sFlow を用いた DoS アタック検出システム• 2011/4/8 Flowops Meeting - 14th

–クラウドインフラにおける xFlow の応用について

自己紹介

一部商用環境に入れてみました

3

• お客様ネットワーク単位のインターネット向けトラフィックの流量計測

• お客様向けにコントロールパネルでの帯域グラフ表示• 運用・管理目的での全契約の積み上げグラフ表示• 将来的に転送量課金にも対応できるように

実現したかったこと

4

• 「さくらのクラウド」のオプションメニュー• お客様毎に独立した VLAN を払い出し、グローバル IP

アドレスを Prefix で提供• 帯域メニュー: 100M, 500M, 1Gbps (2015/10/16 現在 )• IP アドレスサイズ : /28 ~ /24• 帯域の変更は無停止で可能

「ルータ+スイッチ」について

以前トラフィックがわからなかった

5

ルータ+スイッチの論理構成

133.242.xx.xx/28

専用の VLAN をアサイン

お客様サーバ( VM )

インターネット

インターネット向けゲートウェイ(ルータ)ここの帯域を

計測したい

サーバ間の通信は除外したい

6

物理構成

ToR スイッチ

コアスイッチ

ルータ

ホストサーバ

802.1Q VLAN

ここを VLAN 単位で

トラフィック計測できればよさそう

SVI を設定

SVI = Switched Virtual Interface

7

• ルータの SVI の snmp カウンタを参照する案

検討その1

$ snmpwalk -v2c -c XXXXXXXXX nn.nn.nn.nn ifHCInOctetsIF-MIB::ifHCInOctets.2 = Counter64: 5856192896095311IF-MIB::ifHCInOctets.3 = Counter64: 0IF-MIB::ifHCInOctets.4 = Counter64: 51912730060IF-MIB::ifHCInOctets.5 = Counter64: 30916826608353959IF-MIB::ifHCInOctets.6 = Counter64: 0IF-MIB::ifHCInOctets.7 = Counter64: 0IF-MIB::ifHCInOctets.8 = Counter64: 0IF-MIB::ifHCInOctets.9 = Counter64: 0IF-MIB::ifHCInOctets.11 = Counter64: 0IF-MIB::ifHCInOctets.17 = Counter64: 0IF-MIB::ifHCInOctets.19 = Counter64: 500IF-MIB::ifHCInOctets.20 = Counter64: 15613326IF-MIB::ifHCInOctets.21 = Counter64: 294IF-MIB::ifHCInOctets.22 = Counter64: 0IF-MIB::ifHCInOctets.23 = Counter64: 0IF-MIB::ifHCInOctets.24 = Counter64: 0<snip>

MIB は存在するが、正しくカウントされていない

このあたりがSVI の MIB

物理 IF は正しく取れている

8

• ルータで NetFlow を動かすのはどうか?

検討その2

http://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst4500/12-2/53SG/configuration/config/nfswitch.html

Supervisor Engine 6-E and Catalyst 4900Mchassis does not support Netflow.

9

• コア L2 スイッチで見るのはどうか?

• 物理インターフェイスの VLAN 単位の snmp MIB は存在しない。

• sFlow はそこそこ動作!

• コア L2 スイッチで sFlow を動かし、サンプリングを行う方向で検討

• ただし、 Ingress のサンプリングしかサポートしていないため、 Egress を見る場合は工夫が必要

検討その3

10

sFlow サンプリングの構成

ToR スイッチ

コアスイッチ

ルータ

VCS 構成

全ポートでsFlow を有効化 sFlow コレクタ

11

sFlowレプリケーションプロセス

sFlow コレクタの構成

VIP

JSON RRD

pcap

トラフィック計測プロセス

フォレンジックプロセス

sFlow パケット

sFlowレプリケーションプロセス

JSON RRD

pcap

トラフィック計測プロセス

フォレンジックプロセス

VIP

Keepalived で冗長化

2 台のサーバで同じ集計プロセスを同時実行

Port6343 Port6343

Port26343

Port36343

Port26343

Port36343

Active Standby

12

• sflowtool コマンドを引数なしで起動すると、デコード結果がテキストで表示される

トラフィック計測プロセスについて

startDatagram ================datagramSourceIP 10.131.X.XXdatagramSize 1144unixSecondsUTC 1408531174datagramVersion 4agent 10.131.X.XXpacketSequenceNo 114032sysUpTime 31177000samplesInPacket 7startSample ----------------------sampleType_tag 0:1sampleType FLOWSAMPLEsampleSequenceNo 303920sourceId 0:10101meanSkipCount 32768samplePool 1368915968dropEvents 0inputPort 10101outputPort 0flowSampleType HEADERheaderProtocol 1sampledPacketSize 68headerLen 64

headerBytes 9C-A3-BA-XX-XX-XX-70-81-05-XX-XX-XX-81-00-02-01-08-00-45-00-00-dstMAC 9ca3baXXXXXXsrcMAC 708105XXXXXXdecodedVLAN 513decodedPriority 0IPSize 50ip.tot_len 44srcIP XXX.XXX.XXX.XXXdstIP XXX.XXX.XXX.XXXIPProtocol 6IPTOS 0IPTTL 50TCPSrcPort 80TCPDstPort 10349TCPFlags 18extendedType SWITCHin_vlan 0in_priority 0out_vlan 0out_priority 0endSample ----------------------

これを perl でリアルタイムテキスト処理して集計

2006/9/22 IRS10 で発表したものがベースhttp://irs.ietf.to/past/docs_20060922/

13

API サーバ、コンパネとの連携

クラウドコンパネ

API

JSONRRD pcap

API サーババッチサーバsFlow コレクタ

VLAN とリソース ID のマッピング

お客様オペレータ

Web UI

運用ツール

HTTP

14

コンパネでの表示例

15

運用ツールでの表示例

16

• sFlow サンプルを pcap 形式で一定期間保存• DoS 攻撃などのセキュリティインシデント発生時に、

通信ログ解析

ネットワークフォレンジックとしての活用

クラックされ外部に攻撃を仕掛けているとともに、報復として DoS 攻撃を受けている仮想サーバのトラフィック例

17

運用ツールでの表示例

18

• スイッチのファームウェアをバージョンアップしたら、 VCS ISL Trunk ポートからのサンプルの sampledPacketSize に正しい値が入らなくなった。

sFlow ではまったところ ( その1 )

ISL Trunk

vLAGこっちは大丈夫

ここが正しくとれない

startDatagram =================================datagramSourceIP 10.132.XX.XXdatagramSize 348unixSecondsUTC 1441098132datagramVersion 5agentSubId 0agent 10.132.XX.XXpacketSequenceNo 125707593sysUpTime 2170975112samplesInPacket 1startSample ----------------------sampleType_tag 0:3sampleType FLOWSAMPLEsampleSequenceNo 13003896sourceId 0:404127792meanSkipCount 8192samplePool 3448700928dropEvents 0inputPort 404127792outputPort 403931173flowBlock_tag 0:1flowSampleType HEADERheaderProtocol 1sampledPacketSize 224strippedBytes 4headerLen 220<snip>

なぜか 224(Bytes)以上の値が入らない

19

• sflowtool –t で pcap に保存していたが、 ISL Trunk ポートからのサンプルに Trill ヘッダがついていて、 tcpdump の IP アドレスフィルタがマッチしない。 Inner のパケットを見たい。

sFlow ではまったところ ( その2 )

headerBytes 50-EB-1A-XX-XX-XX-50-EB-1A-XX-XX-XX-81-00-00-00-22-F3-

00-3F-00-01-04-0A-00-00-0C-9F-F0-01-9C-A3-BA-XX-XX-XX-

81-00-01-1D-08-00-45-00-05-<snip>

Outer MAC

Trill Header Inner MAC 0x22F3 = TRILL

VLAN ID IPv4 IPv4 Header

sub strip_trill { my $packet_bin = shift;

my $ethertype1 = unpack('n', substr($packet_bin, 12, 2)); return $packet_bin unless ($ethertype1 == 0x8100); my $ethertype2 = unpack('n', substr($packet_bin, 16, 2)); return $packet_bin unless ($ethertype2 == 0x22f3);

return substr($packet_bin, 24);}

headerBytes のダンプからPcap ファイルを出力するプログラムを作成し、 0x22f3 だったら先頭 24 バイトを削って保存する処理を追加。

20

JANOG31.5 高嶋さんのスライドよりhttp://www.janog.gr.jp/meeting/janog31.5/program/ietf-trill-update.html

21

• 当方の環境ではテナント単位のトラフィックが SNMPで取得できず、サンプリング (sFlow) を活用した。

• 精度はそこそこなので、あくまでも目安程度。• 今後、 ( 転送量 ) 課金に適用するとなった場合は、も

う一工夫必要か?• ファブリック技術を用いている装置でのサンプリング

は要注意!?

まとめ