
私は現在、生のソケットを使用して 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
これにより、カーネルはパケットを無視し、ハンドシェイクに応答しなくなります。