10月 27日リリース。
PACKET_MMAPにも対応。v2 確認未。
ダーティハックで debian lenny パッケージ作るためのパッチ。
忙しすぎ。むーん....
2008年11月11日火曜日
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 の中
mac より前に確保してる? できれば mac と net の間に VLAN オプションフィールド入れたいけど、すんごいツラいしそーゆー用途ではない? ユーザスペースで mac ヘッダ前にずらす?} 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;
2008年7月3日木曜日
netflow # 2
ながーい寄り道をしてやっと 2。何のことは無い libpcap 入れるんだけど、ノーマル以外にもいくつかありますよ。という閑話が終って本題。ミラーポートをキャプチャして netflow として export するもの。
# netfilter メンテナの人は nprobe を NF_CT_ACCT 紹介で挙げていた覚えが....
コレクタ側もいくつかあると思いますが、両方共に debian パッケージにある fprobe と flow-tools を使ってみませう。lenny の例ですが etch も大差ないと思います。
- GPL だけど有償の nprobe
- 古い nprobe の NetBSD パッケージ
- fprobe
- softflowd
- 古い nprobe にイタズラした悪趣味な lprobe
# 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 参照しているだけですが....sch_ingnore.ko の方はどこでも良いのですが、まぁ /lib/modules/`uname -r`/kernel/net/sched の下に。q_ingnore.so は /usr/lib/tc の下にコピーして下さい。それなりの場所にカーネルモジュール置いたのでnet/core/dev.c の関数 netif_receive_skb() を参照してみて下さい
....と書いていて大事なコト忘レタ。#ifdef されている通りカーネルで CONFIG_NET_CLS_ACT が有効になっていないと意味がありません。
カーネルが 2.6.16 と 2.6.24, 2.6.25。debian の etch, lenny で試して何となく動いている こちら sch_ingnore を試してみて下さい。etch, lenny 共にカーネルがコンパイルできるパッケージ群と iproute-dev パッケージが必要です。
# 面倒クサがって実質 libnetlink.h 参照しているだけですが....
ingress qdisc のような面構えですが、ただただパケット落とすだけですので qdisc ではありません。カーネルモジュール$ 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
これで eth1 はキャプチャはしますが、その後通常よりちょっとだけ早くパケット落とします。# depmod -a
# tc qdisc add dev eth1 ingnore
# tc qdisc ls dev eth1
qdisc ingnore ffff: parent ffff:fff1
....と書いていて大事なコト忘レタ。#ifdef されている通りカーネルで CONFIG_NET_CLS_ACT が有効になっていないと意味がありません。
netflow # 1.5
ピーピング・トムにならなかった方、卒業した方。ようこそ、続きです。
tcpdump などキャプチャするもの大抵は libpcap を用います。キャプチャする linux box の性能とネットワークの流量に依存してしまいますが、linux でのノーマルの libpcap は性能が芳しくないために結構なパケットを取りこぼしてしまいます。もっと効率良くキャプチャをっ。と
1 か 2 がお勧めですが、ドキュメント眺めたり Google様に尋ねながら so name がディストリビューション標準の libpcap と同じ名前になるよう shared library 作ってみて下さい。適当な...例えば /home/jot/lib に置いて、なかなか難かしい条件ですが、一定の量。あるいはフルフルの量を機器に通して
おぉっと唸った。かつ、置き換えた事実を忘れない。かつ、ちょっと位の不具合とは戦える。という方。置き換えましょう。
余談ですがトラヒック負荷かけるのであれば CONFIG_NET_PKTGEN をDocumentation/networking/pktgen.txt 眺めたり、こちらを参照したりで pktgen.sh。あるいは PF_RING の方は stream.c なるものを使っていたらしい。その当時は無かったカーネルスペースの pktgen の方がキョーレツ。
tcpdump などキャプチャするもの大抵は libpcap を用います。キャプチャする linux box の性能とネットワークの流量に依存してしまいますが、linux でのノーマルの libpcap は性能が芳しくないために結構なパケットを取りこぼしてしまいます。もっと効率良くキャプチャをっ。と
- カーネルパッチとユーザランド。勿論 libpcap 込みのPF_RING
- vanilla カーネルに組み込まれている CONFIG_PACKET_MMAP を用いた A libpcap version which supports MMAP mode on
- 2 にイタズラして環境変数付けなくても良い悪趣味 libpcap
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
#### の箇所、結構な数減っていません?# 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 を
netflow # 1
exporter はその 5 で終らせてもらって新たに。netflow を喋ることができない機器のポートをミラーしてキャプチャ。netflow に変換? してコレクタに送ってごにょごにょする方法。
まずは機器の設定ですが、「ポートミラーリング」で Google様に尋ねて下さい。気を付ける点ですが、一つのポートをミラーリングするにあたっては全二重の場合、送信 / 受信それぞれ一つづつ。加えて自身が通信するため。計 3つインターフェースが必要になります。例えば Catalyst で fa0/1 の送信を fa0/11 受信を fa0/12。自身が通信するポートを fa0/21 といった場合
OpenMicroServer + debian を例えにして、eth0 が自身の通信。eth1 で送信、eth2 で受信のキャプチャをするとして eth0 を fa0/21 と。fa0/11 と eth1、fa0/12 と eth2 をそれぞれ繋ぎます。eth1, 2 でキャプチャするのは NAPI 対応の e1000 だから。
親切なアプリケーションであれば必要ありませんが、一応 eth1, 2 を promisc にしておきます。/var/lib/apt/lists/*_Packages 内の ^Depends:.*libpcap の怪しそうなパッケージインストールしてニヤニヤと....で止めたら犯罪助長するのかっ。と怒られそうですが、長くなりそうなので #2 で。
まずは機器の設定ですが、「ポートミラーリング」で 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 にしておきます。
キャプチャのメジャードコは tcpdump。と言ってしまうとオヤジ? tshark とか使うのかしら? まぁ tcpdump とさせてもらってip link set eth1 promisc on
ip link set eth2 promisc on
とツラツラと流れ行く画面を眺めて下さい。あきたらtcpdump -ni any
2008年6月17日火曜日
PACKET_MMAP #2
ごめんなさいっ。libpcap のパッチおかしかった。修正しましたので、以前のものを持って行った方は、取り直して下さい、すいません。でパッチのあて方ですが、debian 前提で etch lenny 共に
一つ (だけじゃないけど) イマイチなのが PACKET_RX_RING 使っているか使っていないかがわからない点。見栄えが悪いですが stderr に use PACKET_MMAP, ... なんて出力があれば PACKET_RX_RING 使っています。/proc/net/packet あたりでわかれば嬉しいけど、理解していない。
あぁ、また一つ。繰り返しになりますが、デフォルト 8Mbyte mmap します。1514 フルであれば 4096 パケットです。多すぎ? 環境変数 PCAP_MMAP_MEMSIZE をバイト単位で調節して下さい。tcpdump であれば
して、ソースディレクトリに cd した後apt-get source libpcap0.8
- etch
- これ持って行って
で上位ディレクトリに deb パッケージが出来ます。patch -p1 < libpcap0.8-etch.patch
./debian/rules binary - lenny
- 持って行くモノがこれ - libpcap0.8-lenny.patch 以外は etch と同じです。
一つ (だけじゃないけど) イマイチなのが PACKET_RX_RING 使っているか使っていないかがわからない点。見栄えが悪いですが stderr に use PACKET_MMAP, ... なんて出力があれば PACKET_RX_RING 使っています。
あぁ、また一つ。繰り返しになりますが、デフォルト 8Mbyte mmap します。1514 フルであれば 4096 パケットです。多すぎ? 環境変数 PCAP_MMAP_MEMSIZE をバイト単位で調節して下さい。tcpdump であれば
あるいはPCAP_MMAP_MEMSIZE=262144 tcpdump -nevi eth0 'ip and port...
などなど。また ingnore や lprobe については後日、近日。と自分に言いきかせて、今日も夜が更けてくてくてく....export PCAP_MMAP_MEMSIZE=524288
tcpdump ...
2008年6月10日火曜日
PACKET_MMAP #1
広告? チラシ? の裏よりタチが悪い。自分でも忘れない内にコンパイルや使い方書かないと....と思いながら、モチベーションというか忙しかったりする。で、チラシの裏。./debian/rules binary する前に autoconf が必要。
- debian etch libpcap0.8 用の PACKET_MMAP パッチ
- sch_ingnore モジュールにtc 用の .so を追加。
2008年6月8日日曜日
netflow の exporter その 5
その後ですが、PF_RING を使わずに。と NetBSD のパッケージ? にある古い nprobe 持ってきて大幅ダーティハック。稚拙ですが
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 がありますので、こちらも良ろしかったら。
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 試していたが
apt-get source libpcap0.8 した後に debian/patch に上記 60_ring.diff 置いて、同じディレクトリにある series にエントリ追加します。で debian/rules binary なのですが、fakeroot では組み込まれないと思います。
お付き合いいただける方はパッチとか送っていただけると、幸せです。
と言うか環境変数設定「しなくては」動作しない。よく忘れるし、もの珍しげに 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 では組み込まれないと思います。
お付き合いいただける方はパッチとか送っていただけると、幸せです。
登録:
投稿 (Atom)