9

私が使用しているツールの1つは、暗号化/復号化を使用してネットワーク経由でデータを送信します。ツールを変更していますが、データが実際に暗号化された形式で送信されていることを確認する必要があります。

Wiresharktcpdumpはこの目的に適したツールですか?転送中のどの時点で、ネットワークパケットをキャプチャしますか?

4

3 に答える 3

17

簡単な答え: パケットはソフトウェア ネットワーク スタックの最後でタップされます (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_nitlist_for_each_entry_rcu(ptype, &ptype_all, list) { ... deliver_skb ...} .. functpacket_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_rcvip_outputip_forwardnetif_receive_skbdev_queue_xmit

于 2014-03-01T18:29:09.293 に答える
4

これらのツールは両方とも、データがネットワークを介して送信されるときに正確にデータをキャプチャします。(これは、ファイルだけでなく画面にも表示される出力の「tee」に相当するものと考えてください。ここでも、同じデータがソケットやtcpdumpなどに送られます。)

そうです、データを送信する前にデータを暗号化するようにツールが正しく構成されている場合、tcpdumpまたはWiresharkはそれをパケットキャプチャに反映する必要があります。

于 2010-09-02T15:11:42.193 に答える
1

はい、それらは適切なツールです。暗号化に使用している場合、WiresharkはTLSパケットとSSLパケットを識別します。Wiresharkにサーバーの秘密鍵を提供し、必要に応じてトラフィックを復号化できます(DHEやECDHEなどのエフェメラルモードを除く)。

于 2010-09-02T15:12:15.983 に答える