2017-01-16 22 views
2

これはどうやって正しく行うのですか?Linux上でネットワークインタフェースをプロミスキャスモードに正しく設定する方法

私はsocketを作成し、ioctl( "howto check a network devices status in C?"などで説明されています)を使用してIFF_PROMISCフラグを設定する方法を知っていますが、これは少なくとも理論上は欠陥があります。

1)あなたはioctlの 2を介して旗を読む)あなたはフラグ 3を更新)他の誰かに変更フラグ 4)あなたはioctlの

を介して更新フラグを設定するより良い方法や、私は単純にはあまり気にしないはありますか?

後、私は1つが、このように(もレースを持たない)のsetsockoptを経由してPACKET_MR_PROMISCにインターフェイスを追加する必要があることが見つかりました:それは必要がありますが、私ならば

void set_promisc(const char *ifname, bool enable) 
{ 
    struct packet_mreq mreq = {0}; 
    int sfd; 
    int action; 

    if ((sfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) { 
     perror("unable to open socket"); 
     return; 
    } 

    mreq.mr_ifindex = if_nametoindex(ifname); 
    mreq.mr_type = PACKET_MR_PROMISC; 

    if (mreq.mr_ifindex == 0) { 
     perror("unable to get interface index"); 
     return; 
    } 

    if (enable) 
     action = PACKET_ADD_MEMBERSHIP; 
    else 
     action = PACKET_DROP_MEMBERSHIP; 

    if (setsockopt(sfd, SOL_PACKET, action, &mreq, sizeof(mreq)) != 0) { 
     perror("unable to enter promiscouous mode"); 
     return; 
    } 

    close(sfd); 
} 

は、残念ながら、これは、インターフェイス上全く効果がありませんthe docを正しく修理してください。可能であればbroken since 2001 (tm)? pcapソースのコメントもこれについて文句を言う。

+0

**は、なぜあなたは 'ioctl'が間違っていると思います**?そして、「もっと簡単な方法」は何でしょうか? – Olaf

+0

読み取り/変更/書き込みフラグ操作はアトミックでなければなりません。 – dbrank0

答えて

2

PACKET_MR_PROMISCは、デバイスのプロミスキャスモードをオンにします。これは、デバイス上のグローバルIFF_PROMISCフラグの状態を変更しないため、ifconfigで示されるステータスには反映されません。それはそれが行われていないことを意味しません。これは今pcapライブラリがどのように働いているのか、またwireshark(および他の多くのユーティリティ)がデバイスを開き、ローカルシステム宛ではないパケットが動作することを示していることを示しています。

各デバイスには、プロセスがPACKET_MR_PROMISCを使用するたびにインクリメントされ、プロセスがなくなるとデクリメントされる内部カウンタがあります。それはあなたがもともと説明したレースを解決します。最後に、あなたが提供されたリンクから

> IFF_PROMISC is not set, 
It's not supposed to be set. 
The correct way to put into promiscuous mode the device to which a 
PF_PACKET socket is to do a SOL_PACKET/PACKET_ADD_MEMBERSHIP 
"setsockopt()" call with PACKET_MR_PROMISC as the argument (see the 
"packet(7)" man page), and that's what libpcap is doing. 
The old way of directly setting IFF_PROMISC had problems - to quote the 
comment at the front of "pcap-linux.c": 
[snipped] 
+0

それを正しく読んでくれてありがとう。 O :-)( "ip link"もPフラグを表示しません...)これはすぐに上向きにしてテストを行った場合、実際に動作しますが、これは他の理由で壊れているとも言えます等々)。 – dbrank0

+0

はい、うまくいきます。参考:無差別モードは、ソケットが閉じられるまで保持されます。その後、以前に有効なモードに戻ります。したがって、私が正しく理解すれば、無差別モードを設定してこのインタフェースを使用して終了することはできません。それは私の使用のために大丈夫です。 – dbrank0

関連する問題