hana_shinのLinux技術ブログ読者になるhana_shinのLinux技術ブログLinuxの技術情報を掲載しています。ネットワークをメインに掲載していきます。はじめにtcpdumpのフックポイント、Netfilterのチェイン、Qdiscの場所についてまとめました。これらの位置を理解しておくと、ネットワークのトラブルシューティング等に役立ちます。検証環境AlmaLinuxの版数は以下のとおりです。Tiger)カーネル版数は以下のとおりです。鳥瞰図ドライバとトランスポート層の間の関数の呼び出し関係を以下に図示します。この図は、systemtapを使ってサーバ/クライアントの2台構成の環境でncコマンドを実行した際の関数呼び出しを確認したもので、図の左側が受信処理、右側が送信処理を表しています。楕円の内側には関数名が表示されていますが、すべての関数が図示されているわけではありません。ドライバとトランスポート層の間の適切な用語が見当たらないため、便宜上デバイス層と呼ぶことにします。図中の網掛け部分について以下に説明します。iptablesコマンドでパケット廃棄等のルールを設定する場所です。チェインと呼ばれています。デフォルトで5つのチェインが定義されています。ルーティング処理を実行する場所です。宛先IPアドレスをキーにルーティングテーブルを検索して宛先を決定します。関数へのポインタが設定されます。関数へのポインタが設定されます。tcpdumpのフックポイントです。tcpdump/tsharkコマンドを実行すると、フックポイントの関数が呼び出され、送受信のパケットがキャプチャされます。Qdiscと呼ばれる場所です。Control(交通整理)を実行する場所です。tcコマンドは、Qdiscに対してパケットの遅延、廃棄、並び替えを実行します。ドライバ関数へのポインタが設定されています。ops->ndo_start_xmitを呼び出すと、NICに対応したドライバ関数が実行されます。ここでは、e1000_xmit_frame関数(Intelのe1000eドライバ)を図示しています。TCPの受信処理入り口関数です。UDPの受信処理入り口関数です。IPヘッダに設定されているプロトコル番号(TCP=6,UDP=17)にしたがって、TCPまたはUDPの受信処理入り口関数を呼び出します。ルーティング処理の結果、受信パケットが自分宛のパケットを処理します。フラグメントされたIPパケットを元の1つのIPパケットに再構築します。INPUTチェインを実行します。ルーティング処理を呼び出します。IPの受信処理入り口の関数です。IPヘッダのサイズやIPのバージョンをチェックします。PREROUTINGチェインを実行します。ソフト割り込みの入り口関数です。ソフト割り込みの延長でプロトコルの受信処理が行われます。NICの受信バッファからドライバのリングバッファ(受信バッファ)に受信パケットのDMA転送が完了すると、受信完了割り込みが発生します。この受信完了割り込みで呼び出す関数です。この関数はrequest_irq関数で事前に登録したものです。TCPヘッダを組み立てて、送信パケットをIP層に引き渡します。UDPヘッダを組み立てて、送信パケットをIP層に引き渡します。IPの送信処理入り口の関数です。IPヘッダにIPパケット長、チェックサム値を設定したあと、OUTPUTチェインを実行します。送信パケットの管理情報(sk_buff構造体)を更新します。POSTROUTINGチェインを実行します。Controlを実行します。送信パケットをドライバのリングバッファ(送信バッファ)にマッピングしたあと、NICに対してDMA転送を要求します。リングバッファからNICの送信バッファに送信パケットのDMA転送が完了すると、送信完了割り込みが発生します。この送信完了割り込みで呼び出す関数です。この関数はrequest_irq関数で事前に登録したものです。パケットの転送処理をします。Live)が1以下のパケットは廃棄します。それ以外のパケットはTTLを1減算します。FORWARDINGチェインを実行します。dst_outputを実行します。dst_outputにはip_output関数へのポインタが設定されています。私が業務や記事執筆で参考にした書籍を以下のページに記載します。)はてなブログをはじめよう!hana_shinさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。