私が使用しているツールの1つは、暗号化/復号化を使用してネットワーク経由でデータを送信します。ツールを変更していますが、データが実際に暗号化された形式で送信されていることを確認する必要があります。
Wiresharkとtcpdumpはこの目的に適したツールですか?転送中のどの時点で、ネットワークパケットをキャプチャしますか?
簡単な答え: パケットはソフトウェア ネットワーク スタックの最後でタップされます (Linux など)。
tcpdump、libpcap、およびLinuxカーネル3.12でのコード掘り下げによる長い回答:
Wireshark と tcpdump はどちらも libpcap を使用します。たとえば、
http://sources.debian.net/src/tcpdump/4.5.1-2/tcpdump.c#L1472
if (pcap_setfilter(pd, &fcode) < 0)
次に、setfilter_op と activate_op を介してパケット フィルタをインストールします。これらの操作には多くの実装があり、最近の Linux ではlibpcap-1.5.3-2/pcap-linux.c#L1287PF_PACKET
で使用されると思います。pcap_activate_linux
/*
* Current Linux kernels use the protocol family PF_PACKET to
* allow direct access to all packets on the network while
* older kernels had a special socket type SOCK_PACKET to
* implement this feature.
* While this old implementation is kind of obsolete we need
* to be compatible with older kernels for a while so we are
* trying both methods with the newer method preferred.
*/
status = activate_new(handle);
...
activate_new(pcap_t *handle)
...
/*
* Open a socket with protocol family packet. If the
* "any" device was specified, we open a SOCK_DGRAM
* socket for the cooked interface, otherwise we first
* try a SOCK_RAW socket for the raw interface.
*/
sock_fd = is_any_device ?
socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL)) :
socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
PF_PACKET はカーネルのファイルnet/packet/af_packet.cに実装されています。PF_SOCKET の初期化は、フックを登録するためにnet/core/dev.cから呼び出す関数 (デバイスが UP 状態の場合) でpacket_do_bind
行われます。register_prot_hook(sk)
dev_add_pack
370 /**
371 * dev_add_pack - add packet handler
372 * @pt: packet type declaration
373 *
374 * Add a protocol handler to the networking stack. The passed &packet_type
375 * is linked into kernel lists and may not be freed until it has been
376 * removed from the kernel lists.
377 *
378 * This call does not sleep therefore it can not
379 * guarantee all CPU's that are in middle of receiving packets
380 * will see the new packet type (until the next received packet).
381 */
382
383 void dev_add_pack(struct packet_type *pt)
384 {
385 struct list_head *head = ptype_head(pt);
386
387 spin_lock(&ptype_lock);
388 list_add_rcu(&pt->list, head);
389 spin_unlock(&ptype_lock);
390 }
pf_packet ハンドラ (tpacket_rcv(...)
関数) は ptype_all に登録されると思います。
に登録されているフックは、(「サポート ルーチン。現在使用中のネットワーク タップに送信フレームを送信します。」)ptype_all
からの発信パケットに対して呼び出されます 。deliver_skb は、libpcap 用の func を呼び出します。dev_queue_xmit_nit
list_for_each_entry_rcu(ptype, &ptype_all, list) { ... deliver_skb ...} .. func
tpacket_rcv
dev_queue_xmit_nit は、dev_hard_start_xmit
( net/core/dev.c の行 2539 )から呼び出されます。これは、Linux ネットワーク スタックでのデバイスに依存しないパケット処理の最終段階 (送信パケット用) です。
着信パケットの履歴も同じです。 ptype_all
-registered フックは__netif_receive_skb_core
、同じから呼び出されlist_for_each_entry_rcu(ptype, &ptype_all, list) {.. deliver_skb..}
ます。 着信パケットの処理の最初__netif_receive_skb_core
から呼び出されます__netif_receive_skb
Linux Foundation には、ネットワーク スタック ( http://www.linuxfoundation.org/collaborate/workgroups/networking/kernel_flowdev_hard_start_xmit
) の適切な説明があります。画像http://www.linuxfoundation.org/images/1/1c/で確認できます。 Network_data_flow_through_kernel.png (警告、巨大です) 凡例のすぐ下の左側にあります。そしてnetif_receive_skb
、一番右下の四角形 (「net/core/dev.c」) の内側にあり、IRQ から供給され、次に NAPI ポーリングまたは netif_rx が供給され、ここからの唯一の出口は ですnetif_receive_skb
。
この図には、送信パケット用の 2 つの pf_packet フックの 1 つ (凡例 ("net/packet/af_packet.c") の下の一番左の四角形) も示されています。
あなたのツールは何ですか?ネットワーク スタックにどのように接続しますか? Network_data_flow 画像でツールを見つけることができれば、答えが得られます。たとえば、Netfilter は(着信) (ローカル発信) および(ルーティングからの発信) の直後と直前でNF_HOOK
のみフック () されます。ip_rcv
ip_output
ip_forward
netif_receive_skb
dev_queue_xmit
これらのツールは両方とも、データがネットワークを介して送信されるときに正確にデータをキャプチャします。(これは、ファイルだけでなく画面にも表示される出力の「tee」に相当するものと考えてください。ここでも、同じデータがソケットやtcpdumpなどに送られます。)
そうです、データを送信する前にデータを暗号化するようにツールが正しく構成されている場合、tcpdumpまたはWiresharkはそれをパケットキャプチャに反映する必要があります。
はい、それらは適切なツールです。暗号化に使用している場合、WiresharkはTLSパケットとSSLパケットを識別します。Wiresharkにサーバーの秘密鍵を提供し、必要に応じてトラフィックを復号化できます(DHEやECDHEなどのエフェメラルモードを除く)。