libnetfilter_queueを使用して、その場でネットワークパケットを書き換えます
-
28-09-2019 - |
質問
私は、OSのネットワークスタックに接続し、パケットをスニッフィングして、過去に飛んで、興味のあるものを編集できるユーザースペースアプリケーションを作成しようとしています。
多くのグーグルで、そうする(どんなプラットフォームでも)最も単純な(まだ合理的に堅牢な)方法はLinuxのものであるように思えます。 libnetfilter_queue
事業。しかし、私はリミテッド以外のプロジェクトの合理的なドキュメントを見つけるのに苦労しています 正式 ドキュメンテーション。その主な機能(最初のリンクで述べられているように)
- Kernel nfnetlink_queueサブシステムからキューパケットを受信します
- 評決の発行および/または 変更されたパケットを再注入します カーネルnfnetlink_queueサブシステムへ
強調は私自身のものです。私はこれについてどのように正確に意味しましたか?変更を試みました サンプル コードが提供されていますが、おそらく私は何かを誤解しています。コードはで動作しています NFQNL_COPY_PACKET
モード、だから私 午前 パケット全体を受け取る - しかし、「コピー」セマンティクスを考えると、予想されるように、それに対する私の変更は私自身のアプリケーションに限定されているようです。
私の気持ちは、私が利用するつもりだということです NF_QUEUE
どういうわけか、しかし、私はそれをあまり驚かせていません。ポインターはありますか?
(これを行うためのより単純なメカニズムがある場合、これもクロスプラットフォームである場合、私はそれについて聞いてみたいです!)
解決
以前にこれを逃したとは信じられません。私が質問を投稿するのと同じくらい、私はこれを決して自分で働かせないと思った。 :)
関数のプロトタイプを適切に見ていませんでした。 「判決」関数(以下の概要)で判明しました。
int nfq_set_verdict(struct nfq_q_handle *qh,
u_int32_t id,
u_int32_t verdict,
u_int32_t data_len,
const unsigned char *buf
)
最後の2つのパラメーターは、データが 戻ってきた ネットワークスタックに。後知恵で明らかですが、私はそれを完全に逃しました print_pkt
関数はパケットデータをパラメーターとして取得しませんが、から抽出します struct nfq_data
.
重要なのは次のとおりです NF_ACCEPT
パケットと適切に変更されたパケットをカーネルに戻します。
他のヒント
ソースコードを掘ることからの野生の推測:マングルされたペイロードを使用して明示的に追加してみてください nfnl_addattr_l(…, NFQA_PAYLOAD, …)
?