C ++ UDPソケットポートマルチプレックス
-
28-09-2019 - |
質問
C ++でクライアントUDPソケットを作成して、別のアプリケーションで聴いているポートで聞くことができるようにするにはどうすればよいですか?言い換えれば、C ++でポートマルチプレックスを適用するにはどうすればよいですか?
解決
1つのポートだけで聞きたいです
スニファーでそれを行うことができます。異なるポートからのパケットを無視するだけです。
私のプログラムは元のアプリケーションの代わりにそれを送信するので、私はそれがいくつかの特定のパケットを送信するのを止める必要があるかもしれません
さて、ここで私はあなたにスニファーを捨てて、 MITM 技術。
事前に出て行くファイアウォールルールに頼る必要があります 迂回します "へのパケットプロキシー「アプリケーション。UDP、Linux、Iptables、およびTheを仮定する」プロキシー「同じホストで走っている、これが何だ」プロキシー「実際に行う必要があります:
1. ファイアウォールルールを追加します 迂回します パケット(必要に応じて手動で行う):
iptables -t nat -A PREROUTING -i <iface> -p <proto> --dport <dport>
-j REDIRECT --to-port <newport>
2. バインドして聞いてください <newport>
.
3. 2つのエンドポイント(クライアント、および元の宛先)間のすべてのトラフィックを中継します。あなたが実行している場合プロキシー「別のホストで使用してください GetSockopt と SO_ORIGINAL_DST
元の宛先アドレスを取得します。
それはトリッキーに聞こえるかもしれませんが、...ええ、それは少しトリッキーだからです:-)私の仮定が分岐した場合、あなたのファイアウォールのドキュメントを参照してください。
他のヒント
これは、パケットスニッフィングのようなものです tcpdump
また snoop
, 、生のソケットを開き、必要に応じてワイヤーとフィルターからすべてを引き出します。おそらく使用したいと思うでしょう libpcap 物事を少し簡単にするために。
管理者またはスーパーユーザーの特権がなければ、ポートを開くにはターゲットアプリケーションが必要です SO_REUSEADDR
と SO_REUSEPORT
プラットフォームに適しています。警告は、ブロードキャストとマルチキャストパケットのみを受信できることです。ユニキャストパケットは最初のオープンソケットに配信されます。