NIC混在モードの紹介と設定


1.ハイブリッドモードの紹介
ハイブリッドモードは、本機に送信されたパケットではないパケットを含む、ネットワークカードを通過したすべてのパケットを受信することです.デフォルトでは、ネットワークカードは、自機に送信されたパケット(ブロードキャストパケットを含む)だけを上位プログラムに渡し、他のパケットはすべて破棄されます.簡単に言えば、ハイブリッドモードとは、どんなフォーマットでも、どんなアドレスでも、ネットワークカードがそれを通過するすべてのデータストリームを受け入れることができることを意味します.ネットワークカードがこのような「ハイブリッド」方式にある場合、ネットワークカードは「ブロードキャストアドレス」を備え、遭遇したすべてのデータフレームに対してハードウェア割り込みを生成し、物理メディア上を流れる各メッセージパケットの処理をオペレーティングシステムに注意させる.
2.NIC動作モード
NICは、1)ブロードキャストモード(Broad Cast Model):その物理アドレス(MAC)アドレスが0 Xffffffのフレームがブロードキャストフレームであり、ブロードキャストモードで動作するNICがブロードキャストフレームを受信する.2)マルチキャスト転送(MultiCast Model):マルチキャスト転送アドレスが目的の物理アドレスであるフレームは、グループ内の他のホストによって同時に受信されてもよく、グループ外ホストは受信されない.ただし、ネットワークカードがマルチキャスト伝送モードに設定されている場合、グループ内のメンバーであるかどうかにかかわらず、すべてのマルチキャスト伝送フレームを受信することができる.3)ダイレクトモード(DirectModel):ダイレクトモードで動作するNICは、宛先アドレスが自分のMacアドレスであるフレームのみを受信する.4)ハイブリッドモード(Promiscous Model):ハイブリッドモードで動作するNICは、すべてのNICを流れるフレームを受信し、パケットキャプチャプログラムはこのモードで実行される.
NICのデフォルトの動作モードには、ブロードキャストフレームと自分に送信されたフレームのみを受信するブロードキャストモードと直接モードが含まれます.ハイブリッドモードを採用すると、1つのサイトのネットワークカードが同じネットワーク内のすべてのサイトから送信されたパケットを受信し、ネットワーク情報の監視キャプチャの目的を達成することができる.
3.LinuxでのNIC混在モードの設定方法
1)コマンド実装
set: ifconfig eth0 promisc 
unset: ifconfig eth0 -promisc

2)プログラム実装
/*
 * param: @intf_name -- interface name, exp: eth0 
 * @sock -- socket file descriptor
 */
void set_card_promisc(char *intf_name, int sock)
{
    struct ifreq ifr;

    strncpy(ifr.ifr_name, intf_name, strlen(intf_name) + 1);

    if (ioctl(sock, SIOCGIFFLAGS, &ifr) == -1) {
        error_and_exit("ioctl", 2); 
    }

    ifr.ifr_flags |= IFF_PROMISC;

    if (ioctl(sock, SIOCSIFFLAGS, &ifr) == -1) {
        error_and_exit("ioctl", 3); 
    }
}