私は何時間もグーグルを続けてきました-Linuxでは、すべてのIPプロトコルを介してユーザーまたはプロセスによって送受信された累積バイト数を知りたいです。私が検索で見つけた最高のことは、iptablesを使用してユーザーのパケットにマークを付けることができることです。次に例を示します。
iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner test -j MARK --set-mark 1
「tc」はそれを使用してトラフィックを形成できるように見えますが、統計が必要なだけです。トラフィックを形成したくありません。 「ユーザーUは時間Yから使用済みXMBを送信しました」のようなものが必要です。これらのマークされたパケットから統計を取得する方法がわかりません。また、ネットホッグを見てきましたが、瞬間的な流れを測定しているようで、累積カウントが必要です。誰かアイデアがありますか?
OUTPUTチェーンで-jCONNMARKを使用し、次にINPUTチェーンで-m connmarkと一致させると、その情報を取得できます。
ユーザーnobody(id 65534)の着信/発信トラフィックを追跡する例を次に示します。
# iptables -I OUTPUT -m owner --uid-owner 65534 \
-m comment --comment 'out - user nobody - uid 65534' \
-j CONNMARK --set-mark 65534
# iptables -I INPUT -m connmark --mark 65534 \
-m comment --comment 'in - user nobody - uid 65534'
その結果、iptables-save -c:を実行して、カウンター値を(行の最初に)フェッチできます。
# iptables-save -c | grep 'uid 65534'
[2585:3797434] -A INPUT -m connmark --mark 0xfffe -m comment --comment "in - user nobody - uid 65534"
[1166:63139] -A OUTPUT -m owner --uid-owner 65534 -m comment --comment "out - user nobody - uid 65534" -j CONNMARK --set-xmark 0xfffe/0xffffffff
Iptables -m ownerトリックは、(定義上)バインドされて送信されたユーザーに対するパケットのみを追跡できます。そのユーザーが受信したパケットを追跡するために使用することはできません。
私は、頭のてっぺんから、これを行うための良い方法が見当たらないことを認めます。暗闇の中での刺し傷では、カーネルレベルでパッチを適用して、たとえば、特定のユーザーのみがネットワークスタックの特定のポート範囲にバインドできるようにする必要があります(ルートのみがネットワークソケットにバインドできるという考えと同様です)ポート1024以下)。次に、これらのポート範囲にiptablesトラフィックロギングを適用して、トラフィックがこれらのポートへのバインドを許可されている対応するユーザーのみを対象としていることを確認できます。欠点は、これらの制限を認識していないユーザーアプリケーションがポートにバインドしようとすると、カーネルが「いいえ」と言ったときに、これが大混乱を引き起こすことです。
SE Linuxでこれを行うことも可能かもしれませんが、sys-adminメンテナンスの悪夢になる可能性があると思います: http://www.linuxquestions.org/questions/linux-server-73/how -can-i-restrict-ports-for-users-to-bind-to-667153 /
アカウンティングの場合:-jを完全に省略して、ターゲットを提供しないことができます。マンページが言うように:
-j, --jump target ... If this option is omitted in a rule (and -g is
not used), then matching the rule will have no effect on the
packet's fate, but the counters on the rule will be incremented.
マークを付けることができれば、ログに記録できることを意味します.iptablesのマニュアルページでLOGターゲット拡張子を確認してください。ここに簡単な紹介があります: http://www.cyberciti.biz/tips/force-iptables-to-log-messages-to-a-different-log-file.html
このためにログローテーションエントリを追加し、それを使用して、ログエントリを要約し、ファイルを削除するスクリプトをトリガーできると思います。多分毎時?
おそらく、これらのデータを保持する期間に応じて、最も簡単な方法は、iptables -t mangle -L OUTPUT -v
を使用してマークルールの一致したパケット/バイト数を確認することです。出力の左側に、これらのメトリックを示す2つの列が表示されます。
1日のカウントが必要な場合は、いつでもiptables -t mangle -Z OUTPUT
をスケジュールして深夜にカウントをクリアできます。