web-dev-qa-db-ja.com

Linuxカーネルが着信TCPパケットに応答しないようにするにはどうすればよいですか?

私のアプリケーションでは、特定のTCP/IPパケットを傍受し、カスタム通信リンク(イーサネットではない)を介して別のデバイスにルーティングする必要があります。すべてのTCP制御パケットと完全なヘッダーが必要です。socket(PF_PACKET、SOCK_RAW、htons(ETH_P_IP)を使用してrawソケットを使用してこれらを取得する方法を理解しました。これはうまく機能します。興味のあるTCPポート)を表示するためにフィルターをアタッチします。

ただし、Linuxはこれらのパケットも認識します。デフォルトでは、知らないポート番号にパケットを受信すると、RSTを送信します。後で自分で返信する予定なので、それは良くありません。 socket(PF_INET、SOCK_STREAM、0)を使用して同じポートで2番目の「通常の」ソケットを開き、listen()を実行すると、LinuxはACKを着信TCPパケットに送信します。どちらもこれらのオプションは私が望むものです。私はそれを実行したいですnothingこれらのパケットですべてを自分で処理できるようにします。これをどのように達成できますか?

2
Jon

iptables

これらのパケットは、FILTERテーブルのOUTPUTチェーンにドロップできます。

プロトコル

RFC 793(TCP)は、RST送信動作を指定します

SEGMENT ARRIVES

  If the state is CLOSED (i.e., TCB does not exist) then [...]:
  An incoming segment not containing a RST causes a RST to be sent in response. 

そして、Linuxは明らかにそれを正しく実装しています。

Sysctlインターフェース

動作もsysctlインターフェースを介して調整できないようです( tcp(7) を参照)。いずれにせよ、まだ見たことがなければ、そのマニュアルページは間違いなく良い読み物です。

カーネルコード

実際に達成したいことによっては、カーネルコードを直接変更することもできます。

2
artistoex