特定のポートでLinuxカーネルによるTCPパケット処理を無効にする

特定のポートでLinuxカーネルによるTCPパケット処理を無効にする

私は現在、生のソケットを使用して Linux ユーザー空間から実行される TCP/IP スタックに取り組んでいます。

これをテストするには、特定のポートの Linux カーネル TCP コードを無効にする必要があります。これにより、カーネルが実装 (ハンドシェイクに応答するカーネルなど) を台無しにすることがなくなります。

私は参照しましたこれは、raw ソケットが netfilter をバイパスすると書かれていますが、私のテストでは、パケットは raw ソケットによって受信されませんでした。

さらに調査してみると、私のAF_INETソケットはまだTCP/IPスタックにありますただし、イーサネット フレームを実装したくありません。

AF_PACKET を使用せずに特定のポートでのカーネル処理を無効にする方法はありますか?

編集:

次のようにソケットを作成します: socket(AF_INET, SOCK_RAW, IPPROTO_TCP)。次に HDRINCL を設定します:setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on))

答え1

これを行うには、IPTables の RAW テーブルを使用できます。次のようなルールを使用します。

iptables -t raw -A PREROUTING -p tcp --dport <your port> -j DROP

これにより、カーネルはパケットを無視し、ハンドシェイクに応答しなくなります。

関連情報