Upload
shuichi-ohkubo
View
688
Download
4
Embed Size (px)
Citation preview
(C)Copyright 1996-2015 SAKURA Internet Inc.
IaaS の L2 ネットワークに
sFlow を導入した話
さくらインターネット研究所 大久保 修一[email protected]
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) を活用した。
• 精度はそこそこなので、あくまでも目安程度。• 今後、 ( 転送量 ) 課金に適用するとなった場合は、も
う一工夫必要か?• ファブリック技術を用いている装置でのサンプリング
は要注意!?
まとめ