問題タブ [raw-sockets]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Linux 上の C/C++ によるシンプルな raw ソケット サーバー
raw ソケットを使用してイーサネット ネットワークを構築しようとしています。TCP/IP、UDP、またはその他のプロトコルを使用できません。
これは、すべての異なるプロトコル層を処理するためのリソースを持たない非常に単純なハードウェアと通信するためです。私のネットワークは、イーサネット スイッチを介して複数のハードウェアと通信する 1 台のホスト コンピュータで構成されます。この時点で、基本的には単純なパケットを各ハードウェアに送信し、拡張できる単純なサーバーを確立したいだけです。私のシステムは Linux を実行しており、サーバーは C または C++ で作成する必要があります。
raw ソケットの使用方法に関する情報を見つけようとしていますが、誰もが常にそれらを使用しないと言い、情報を提供しません。私はかなり強力なプログラミングのバックグラウンドを持っていますが、ネットワーキングの経験はありません。開始方法や関連するチュートリアルがどこにあるかについて、誰かが情報を提供できますか?
sockets - read()を実行するときにETH_P_IPとETH_P_ALLに違いがあるのはなぜですか
私は次の設定をしています:
を使用してLinuxブリッジでRAWソケットを開くと
ソケットをeth2にバインドしています。クライアントがサーバーにパケットを送信すると、ブリッジで実行されているwiresharkは、送信元MACアドレスがclient(eth0)、宛先MACアドレスがserver(eth1)のパケットを報告します。
を実行するread()
と、読み取られたデータの最初の6バイトが宛先MACアドレスであり、server(eth1)として正しく読み取られます。
ただし、ステートメントを次のように変更すると
を実行するread()
と、読み取られたデータの最初の6バイトは、宛先MACアドレスがLinuxブリッジ(eth2)であることを示しています。
なぜこれでしょうか?カーネルまたはイーサネットカードドライバーは、ETH_P_IPを使用してネットワークを読み取る代わりに、独自のMACアドレスをバッファーに配置していますか?
udp - tcpdump によってキャッチされた udp パケットが、ソケットによって受信されない
ウェブページhttp://www.tenouk.com/Module43a.htmlに従って、raw ソケット経由で udp パケットを送信する rawudp プログラムを作成しました。次に、特定のポートでudpパケットをリッスンするudpサーバーを作成しました。コードは次のようになります。
rawudp を使用して udp パケットを udp サーバーに送信した場合、送信元 IP アドレスと宛先 IP アドレスが異なっていても問題ありません。ただし、送信元 IP アドレスと宛先 IP アドレスが同じ場合、udp サーバーは udp パケットを受信できませんでした。
tcpdump を使用して udp パケットをキャッチしようとしました。そして、同じ送信元と宛先のIPアドレスを使用すると、tcpdumpがudpパケットを表示できることがわかりました。送信元と宛先の IP アドレスが同じで、どこかで udp パケットがドロップされたように見えたため、udp サーバーのソケットで受信されませんでした。
以下はいくつかのログです (ログで IP アドレスが更新されました)。2 つのケースの唯一の違いは、送信元 IP アドレス (192.168.0.26 対 192.168.0.226) でした。
私はこの問題に行き詰まりました。誰かが私を助けることができますか。前もって感謝します。
udp クライアント側 (rawudp):
UDP サーバー側:
同じホストでrawudpとudpサーバーを実行すると、送信元と宛先のIPアドレスを同じに設定すると、updサーバーはrawudpからudpパケットを受信できます。しかし、udp サーバーとは別のホストで rawudp を実行すると、それらの IP アドレスを同じに設定すると、udp サーバーは rawudp から upd パケットを受信できませんでした。どちらの場合も、tcpdump は udp サーバー側で udp パケットをキャッチできます。
後者の場合、送信元と宛先の IP アドレスが同じ UDP パケットのみが影響を受けます。それらを別々に設定すると、upd サーバーは常に udp パケットを受信できます。lo
パケットがインターフェイスから受信されない場合、カーネルが同じローカル IP アドレスを持つパケットをドロップできるかどうかはわかりません。
sockets - winpcap はどのように機能しますか?
ご存じのように、Windows は raw_sockets のサポートを停止したため、raw_sockets を使用してネットワーク スニファーを構築する実際の解決策はありません。私の質問は、Winpcap と同様のライブラリが Windows でネットワーク スニッフィングをどのように提供するのかということです。Windowsのバージョンに依存しますか?パケットスニッフィングを実現するために他の技術を使用していますか? パケット スニッフィングを実行する raw_sockets 以外のソリューションはありますか? Wireshark などの一部のソフトウェアは、winpcap を使用してネットワーク パケットを盗聴します。 生のソケット ウィンドウ
c - recvfrom が raw ソケットで正しいパケットを返さない
ポート スキャナー ユーティリティを作成する必要があります。raw ソケットを使用して SYN パケットを送信し、宛先が応答しているかどうかを検出しています。
このraw ソケット ガイドは、特定のビットが設定されたパケットを送信する方法を学ぶのに非常に役立ちました。しかし、recvfrom を使用してパケット応答を受信できません。
私の観察では、探しているもの以外のすべてのパケットを受信しています。
たとえば、1 回の実行の tcp ダンプは次のように表示されます。
ただし、私のアプリケーションでは、32000 ポートのパケットを確認できません。
私の受信ロジックは次のとおりです(簡単なテストのためにコードを変更しました。基本コードは上記のリンクと同じです)。
私のアプリケーションの出力は次のとおりです
注: コードをテストする場合は、次のインクルードを追加する必要があります。
#include <arpa/inet.h>
私が間違っていることについての指針はありますか?
更新: コードに間違いが見つかりました。TCP ヘッダーの読み取り中に、長さの計算が正しくありません。正しい計算は次のとおりです。
それでも、recvfrom 呼び出しから読み取られた他のすべてのパケットも確認できます。送信元 ip= 元の宛先 ip と送信元ポート = 元の宛先ポートを持つ特定のパケットだけを読み取る方法についてのアイデアはありますか?
python - Python ipv6 パケット スニファ
こんにちは、Python、FREEBSD の ipv6 経由でパケットを盗聴したいと考えています。
情報を得るためにグーグルを試すのは難しいですが、freebsd の例は何もありません。
以下のコードは、bsd システムがサポートしていないと誰かが言っているため、機能していません。
socket.PF_PACKET.
誰かが私を助けるためのリンクを持っていますか?
linux-kernel - PF_PACKET ソケットと「Port unreachable」ICMP メッセージ
私のアプリケーションは、複数の宛先ポートから UDP パケットを受信する必要があります (これは善意のアプリケーションであり、スニファではありません)。したがって、PF_PACKET ソケットを使用し、アプリケーション レベルでポート フィルタリングを行うことにしました。
ソケットを作成する方法は次のとおりです。
int g_rawSocket = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
UDP パケットを正しく受信しています。ただし、アプリケーションが実行されているカーネルは、タイプ「Destination unreachable」およびコード「Port unreachable」の ICMP パケットを、アプリにパケットを送信しているリモート デバイスに送信しています。これは、ポート番号をソケットにバインドしていないためだと思います。ただし、特に複数のポートをそれにバインドする必要があるため、PF_PACKET ソケットで bind を使用するのが適切かどうか疑問に思いますが、これは不可能だと思います。
コメントをお願いします。
linux - 自作の Linux ブリッジ: arp リクエストが成功しない
Boost.Asio エクステンションを使用してブリッジ (レイヤー 2 スイッチ) を作成しました。タイプ要件を満たす追加のソケット、エンドポイント、およびプロトコルを簡単に作成できます。そして、私の拡張機能はAF_PACKET
、SOCK_RAW
およびで Linux パケット ソケットを使用しますhtons(ETH_P_ALL)
(パケット ソケットの詳細については、を参照man 7 packet
してください)。
私のブリッジがどのように機能するかを説明する例を次に示します。
ブリッジは、ネットワーク インターフェイス (例: eth0) IF1 と IF2 を接続し、PC1 が PC2 で実行されているブリッジを介して PC3 と通信できるようにします。インターフェイスを接続する方法は、受信したパケットを IF1 から IF2 に送信することです (逆も同様です)。
私のブリッジは、有線接続では期待どおりに動作しますが、無線接続では動作しません。そこで、この問題の原因を突き止めようとしたところ、ARP 要求がまったく成功しなかったことがわかりました。
この問題を引き起こす実際の環境は次のとおりです。
上記の環境下で、例えば今、PC1 は ping(ICMP) パケットを router1 に送信しようとします。PC3に送信するには、PC1はrouter1のMACアドレスを知っている必要があるため、PC1はARP要求を送信FF:FF:FF:FF:FF:FF
し、PC2で実行されているブリッジはeth0から受信してwlan0に送信しますが、router1はarp応答をPC1に送信しません.
注: SOCK_RAW パケットは、パケット データを変更せずにデバイス ドライバーとの間でやり取りされます。(パケットのマニュアルページから引用)
PC1 が router1 と通信できるようにするにはどうすればよいですか?
ありがとうございました。
編集:
これが私の Boost.Asio 拡張機能です。
github: pfpacket/libarex
そして、これは上記を使用した私のブリッジです。
libarex/example/layer2_switch/interface_bridge.cpp
python - Twisted(Python)でrawソケットを使用することは可能ですか?
私はNATの実装を書いていますが、rawソケットを使用する必要があります。私はツイストアーキテクチャに慣れており、同時接続の処理方法が気に入っています。
Twistedプロトコルに入ってくるデータは、操作され、NATされ、表にされ、rawソケットに送信されます。rawソケットに入ってくるデータは、操作され、検索され、NATされ、適切なプロトコルインスタンスに送られます。
生のソケットは1つで十分でしょうか?同時に多数の接続が入った場合はどうなりますか。ツイストはそれを処理しません、またはツイストはコネクションレス型プロトコルではほとんど利点がありません。利点がある場合、誰かが私を生のソケットのねじれた例に導くことができます