2017-07-05 17 views
4

私は組み込みシステム用のOpenWrt Linuxディストリビューションを持っています。このデバイスには、eth0、eth1、およびwlan0の3つのネットワークインターフェイスがあります。rawソケット用のLinuxインタフェースを使用

ネットワークインターフェイス(eth0)の1つは、ローソケットプログラミングにのみ使用する必要があります。私は、パラメータAF_PACKETSOCK_RAWETH_P_ALLを持つソケットを作成することができます。ソケットはすべてのネットワークトラフィックを受信し、パケットを送信することができ、すべてがOKです。

しかし私の問題は、OSが受信(例えば、ARPおよびICMP要求/応答)を送信するためのインタフェースも使用していることです。

インターフェイスは自分のプログラムでのみ使用され、OS自体では使用されないというオプションはありますか?

答えて

2

これはバニラカーネルでは実現できません。しかし、これは近くに来ることができます。

まず、そのインターフェイス上のすべてのARP要求を無視する:すべてのIPv4パケットがそのインターフェイス

に来

echo 1 > /proc/sys/net/ipv6/conf/eth0/disable_ipv6 
最後に

、フィルタ:IPv6を無効にし、その後

echo 8 > /proc/sys/net/ipv4/conf/eth0/arp_ignore 

iptables -I INPUT -i eth0 -j DROP 

また、そのインターフェイスにIPアドレスまたはルートを設定しないでください。これはもちろん完璧ではないですが、特定のパケットはカーネルで処理されますが、はるかに良い解決策はないと思います。

+0

OK。すべてのIPv4パケットが破棄されるようにファイアウォール(iptables)を設定しました。しかし、どのようにARPとIPv6を起動時に無効にすることができますか?上記の2行を 'rc.local'に置いた場合、私はいつもデバイスの起動時にICMPv6パケット(Router Solicitation)を取得します。私は 'rc.local'ファイルのコマンドが遅すぎると思います。すべての訴訟? –

+0

@ BenjaminJ。なぜこれが問題なのですか?重要なことは、そのパケットをカーネルが処理することによってアプリケーションが損なわれないということです。 – Ctx

+0

申し訳ありません。私は自分自身を間違って表現した。パケットはOpenWrtデバイスによって送信されます。私はeth0に接続されているWindows PC上のWiresharkを介して確認しました。 –

関連する問題