ラベル pcap の投稿を表示しています。 すべての投稿を表示
ラベル pcap の投稿を表示しています。 すべての投稿を表示

2008年11月11日火曜日

LIBPCAP 1.0.0

10月 27日リリース
PACKET_MMAPにも対応。v2 確認未。
ダーティハックで debian lenny パッケージ作るためのパッチ
忙しすぎ。むーん....

2008年9月3日水曜日

PF_PACKET での vlan_tci - 気になるトコロ

間違い。
> skb->vlan_tci を設定する __vlan_hwaccel_rx() を呼んでいるのは
じゃなくて、__vlan_hwaccel_rx() を呼び出す netif_rx() や netif_receive_skb() の wrapper (とコメントに書いてある) の vlan_hwaccel_rx() や vlan_hwaccel_receive_skb() はいろんなドライバから呼ばれてる。

その他
  • (多分 NETIF_F_HW_VLAN_RX でないデバイスで使う)
    vlan_skb_recv()::net/8021q/vlan_dev.c で skb->vlan_tci をセットしてない

  • packet_sock.tp_reserve で確保する位置
    tpacket_rcv()::net/packet/af_packet.c の中
     } else {
    unsigned maclen = skb_network_offset(skb);
    netoff = TPACKET_ALIGN(po->tp_hdrlen +
    (maclen < 16 ? 16 : maclen)) +
    po->tp_reserve;
    macoff = netoff - maclen;
    }
    ....
    skb_copy_bits(skb, 0, h.raw + macoff, snaplen);
    ....
    case TPACKET_V2:
    h.h2->tp_len = skb->len;
    h.h2->tp_snaplen = snaplen;
    h.h2->tp_mac = macoff;
    h.h2->tp_net = netoff;
    mac より前に確保してる? できれば mac と net の間に VLAN オプションフィールド入れたいけど、すんごいツラいしそーゆー用途ではない? ユーザスペースで mac ヘッダ前にずらす?

2008年7月3日木曜日

netflow # 2

ながーい寄り道をしてやっと 2。何のことは無い libpcap 入れるんだけど、ノーマル以外にもいくつかありますよ。という閑話が終って本題。ミラーポートをキャプチャして netflow として export するもの。などがあるようです。fprobe の -ulog なるものは netfilter の ulog (今は nflog に取って代わった?) を。lprobe は素の CONFIG_PACKET_MMAP を。以外は libpcap を使っているようです。ただし nprobe は ノーマルでも使えますが、勿論 PF_RING な libpcap を期待しています。

# netfilter メンテナの人は nprobe を NF_CT_ACCT 紹介で挙げていた覚えが....

コレクタ側もいくつかあると思いますが、両方共に debian パッケージにある fprobe と flow-tools を使ってみませう。lenny の例ですが etch も大差ないと思います。
# apt-get install fprobe
....
Setting up fprobe (1.1-7) ...
Starting fprobe: fprobe.
# /etc/init.d/fprobe stop
Stopping fprobe: fprobe.
キャプチャするインターフェースとコレクタのホスト、ポートを尋ねられますが、後で変更できますので、適当にそのまま。
# apt-get install flow-tools
....
Setting up flow-tools (1:0.68-12) ...
Starting flow-capture: flow-capture.
# /etc/init.d/flow-capture stop
Stopping flow-capture: flow-capture.
で勢い衰えたので、設定からはまた後日、近日....

netflow # 1.6

カーネルパッチあててコンパイルするのが嫌で MMAP mode on使っている。あるいは、イタズラに付き合ってくれている奇特な人の内、キャプチャオンリーのデバイスにて、もうほんの一声だけ性能上げたい。かつ不具合と戦える。という方に。

カーネルが 2.6.16 と 2.6.24, 2.6.25。debian の etch, lenny で試して何となく動いている こちら sch_ingnore を試してみて下さい。etch, lenny 共にカーネルがコンパイルできるパッケージ群と iproute-dev パッケージが必要です。

# 面倒クサがって実質 libnetlink.h 参照しているだけですが....
$ tar xzf mod_ingnore.tgz 
$ cd mod_ingnore
$ make
make -C /lib/modules/`uname -r`/source M=`pwd` modules
make[1]: Entering directory `/usr/src/linux'
CC [M] /home/jot/src/mod_ingnore/sch_ingnore.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/jot/src/mod_ingnore/sch_ingnore.mod.o
LD [M] /home/jot/src/mod_ingnore/sch_ingnore.ko
make[1]: Leaving directory `/usr/src/linux'
cc -I./include -shared -fpic -o q_ingnore.so q_ingnore.c
$ ls
Makefile include q_ingnore.so sch_ingnore.mod.c
Module.markers modules.order sch_ingnore.c sch_ingnore.mod.o
Module.symvers q_ingnore.c sch_ingnore.ko sch_ingnore.o
ingress qdisc のような面構えですが、ただただパケット落とすだけですので qdisc ではありません。カーネルモジュール sch_ingnore.ko の方はどこでも良いのですが、まぁ /lib/modules/`uname -r`/kernel/net/sched の下に。q_ingnore.so/usr/lib/tc の下にコピーして下さい。それなりの場所にカーネルモジュール置いたので
# depmod -a
# tc qdisc add dev eth1 ingnore
# tc qdisc ls dev eth1
qdisc ingnore ffff: parent ffff:fff1
これで eth1 はキャプチャはしますが、その後通常よりちょっとだけ早くパケット落とします。net/core/dev.c の関数 netif_receive_skb() を参照してみて下さい

....と書いていて大事なコト忘レタ。#ifdef されている通りカーネルで CONFIG_NET_CLS_ACT が有効になっていないと意味がありません。

netflow # 1.5

ピーピング・トムにならなかった方、卒業した方。ようこそ、続きです。

tcpdump などキャプチャするもの大抵は libpcap を用います。キャプチャする linux box の性能とネットワークの流量に依存してしまいますが、linux でのノーマルの libpcap は性能が芳しくないために結構なパケットを取りこぼしてしまいます。もっと効率良くキャプチャをっ。と
  1. カーネルパッチとユーザランド。勿論 libpcap 込みのPF_RING

  2. vanilla カーネルに組み込まれている CONFIG_PACKET_MMAP を用いた A libpcap version which supports MMAP mode on

  3. 2 にイタズラして環境変数付けなくても良い悪趣味 libpcap
などがあります。PF_RING にしても CONFIG_PACKET_MMAP にしても、受信したパケットをユーザランドとカーネルスペースで共有した領域にコピーするようです。

1 か 2 がお勧めですが、ドキュメント眺めたり Google様に尋ねながら so name がディストリビューション標準の libpcap と同じ名前になるよう shared library 作ってみて下さい。適当な...例えば /home/jot/lib に置いて、なかなか難かしい条件ですが、一定の量。あるいはフルフルの量を機器に通して
  • tcpdump -ni any > /dev/null
  • LD_LIBRARY_PATH=/home/jot/lib tcpdump -ni any > /dev/null
同じ程度の時間経った後 Ctrl-C で終了した後の統計
# tcpdump -ni any > /dev/null
tcpdump: WARNING: Promiscuous mode not supported on the "any" device
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 96 bytes
^Ctcpdump: pcap_loop:
n packets captured
n packets received by filter
#### packets dropped by kernel
#### の箇所、結構な数減っていません?

おぉっと唸った。かつ、置き換えた事実を忘れない。かつ、ちょっと位の不具合とは戦える。という方。置き換えましょう。

余談ですがトラヒック負荷かけるのであれば CONFIG_NET_PKTGEN を Documentation/networking/pktgen.txt 眺めたり、こちらを参照したりで pktgen.sh。あるいは PF_RING の方は stream.c なるものを使っていたらしい。その当時は無かったカーネルスペースの pktgen の方がキョーレツ。

netflow # 1

exporter はその 5 で終らせてもらって新たに。netflow を喋ることができない機器のポートをミラーしてキャプチャ。netflow に変換? してコレクタに送ってごにょごにょする方法。

まずは機器の設定ですが、「ポートミラーリング」で Google様に尋ねて下さい。気を付ける点ですが、一つのポートをミラーリングするにあたっては全二重の場合、送信 / 受信それぞれ一つづつ。加えて自身が通信するため。計 3つインターフェースが必要になります。例えば Catalyst で fa0/1 の送信を fa0/11 受信を fa0/12。自身が通信するポートを fa0/21 といった場合
monitor session 1 source int fa0/1 tx
monitor session 2 source int fa0/1 rx
monitor session 1 dest int fa0/11
monitor session 2 dest int fa0/12
int fa0/21
switchport mode access
switchport access vlan 100
spanning-tree portfast
手元に機器があるワケでは無いので適当。こんな感じといったところです。

OpenMicroServer + debian を例えにして、eth0 が自身の通信。eth1 で送信、eth2 で受信のキャプチャをするとして eth0 を fa0/21 と。fa0/11 と eth1、fa0/12 と eth2 をそれぞれ繋ぎます。eth1, 2 でキャプチャするのは NAPI 対応の e1000 だから。

親切なアプリケーションであれば必要ありませんが、一応 eth1, 2 を promisc にしておきます。
ip link set eth1 promisc on
ip link set eth2 promisc on
キャプチャのメジャードコは tcpdump。と言ってしまうとオヤジ? tshark とか使うのかしら? まぁ tcpdump とさせてもらって
tcpdump -ni any
とツラツラと流れ行く画面を眺めて下さい。あきたら/var/lib/apt/lists/*_Packages 内の ^Depends:.*libpcap の怪しそうなパッケージインストールしてニヤニヤと....で止めたら犯罪助長するのかっ。と怒られそうですが、長くなりそうなので #2 で。

2008年6月17日火曜日

PACKET_MMAP #2

ごめんなさいっ。libpcap のパッチおかしかった。修正しましたので、以前のものを持って行った方は、取り直して下さい、すいません。でパッチのあて方ですが、debian 前提で etch lenny 共に
apt-get source libpcap0.8
して、ソースディレクトリに cd した後
etch
これ持って行って
patch -p1 < libpcap0.8-etch.patch
./debian/rules binary
で上位ディレクトリに deb パッケージが出来ます。

lenny
持って行くモノがこれ - libpcap0.8-lenny.patch 以外は etch と同じです。
以前も書きましたが configure で root 権限が必要なシステムコール使っていますので、fakeroot では無効のままです、ご注意下さい。生? の debian/patches はそれぞれ etch用lenny用にあります。また修正があったらお知らせしますし、おかしなトコがありましたら教えてやって下さい。

一つ (だけじゃないけど) イマイチなのが PACKET_RX_RING 使っているか使っていないかがわからない点。見栄えが悪いですが stderr に use PACKET_MMAP, ... なんて出力があれば PACKET_RX_RING 使っています。/proc/net/packet あたりでわかれば嬉しいけど、理解していない。

あぁ、また一つ。繰り返しになりますが、デフォルト 8Mbyte mmap します。1514 フルであれば 4096 パケットです。多すぎ? 環境変数 PCAP_MMAP_MEMSIZE をバイト単位で調節して下さい。tcpdump であれば
PCAP_MMAP_MEMSIZE=262144 tcpdump -nevi eth0 'ip and port...
あるいは
export PCAP_MMAP_MEMSIZE=524288
tcpdump ...
などなど。また ingnore や lprobe については後日、近日。と自分に言いきかせて、今日も夜が更けてくてくてく....

2008年6月10日火曜日

PACKET_MMAP #1

広告? チラシ? の裏よりタチが悪い。自分でも忘れない内にコンパイルや使い方書かないと....と思いながら、モチベーションというか忙しかったりする。で、チラシの裏。lenny 用も etch に準じないと...。あっ、./debian/rules binary する前に autoconf が必要。

2008年6月8日日曜日

netflow の exporter その 5

その後ですが、PF_RING を使わずに。と NetBSD のパッケージ? にある古い nprobe 持ってきて大幅ダーティハック。稚拙ですが
Netflow exporter もどき lprobe として ここ
に置いときます。パッチなど送っていただければ幸せです。

IPv4 だけだし、flow とは名ばかりで TCP のフラグ見ていないし、IP のフラグメンテーションも処理していません。ただノーマル? の libpcap 使った nprobe や fprobe よりはパケット落ちがありません。で、OpenMicroServer にて最高 25kpkt/s 程の中、何とかパケット落ちなく頑張って稼働している様です。

flow-tools の flow-capture で集めた後、flowscan-cuflow で RRD グラフを作ってみたのですが /24 とかのネットワークが混在しまくっていて、マスクの集合で in と out を追いきれず....utils の下にインターフェースで in out を区別する、ほんのちょっとだけ修正した CUFlow.pm がありますので、こちらも良ろしかったら。

mmap'ed libpcap

PF_RING ではなくて PACKET_MMAP を使おう。ということで libpcap 試していたが
> おまけと言っては失礼だけど環境変数設定すると様子が眺められたり、挙動を変更できるらしいのも、ちょと嬉し。
と言うか環境変数設定「しなくては」動作しない。よく忘れるし、もの珍しげに CONFIG_SLUB としているせいか PCAP_MEMORY=max も怪しげ。細かな時間調整も特段必要なく、理解していないマルチキャストを消したり....
debian lenny 用のパッチ
正直試しておらず、tcpdump 動いたぁ。のレベルですが、良かったら使ってやって下さい。何も指定しないと 8Mbyte のメモリを map します。環境変数 PCAP_MMAP_MEMSIZE で変更可ですが、私は忘れるでしょう...

apt-get source libpcap0.8 した後に debian/patch に上記 60_ring.diff 置いて、同じディレクトリにある series にエントリ追加します。で debian/rules binary なのですが、fakeroot では組み込まれないと思います。

お付き合いいただける方はパッチとか送っていただけると、幸せです。