古いTCPオプションのブロック

古いTCPオプションのブロック

Linuxで廃止されたtcpオプションを含むすべてのパケットを削除したいと思います。未使用オプションとは、TCP オプションの型番号が 8 より大きいすべてのオプションを意味します。これを行うにはどうすればよいですかnftables

たとえば、tcpパケットにnftablesで指定された数値型のオプションがあるかどうかを確認する方法がある場合は、うまくいきます。 nftablesがこの機能をサポートしていない場合は、tc他の標準のLinuxユーティリティを使用してこの機能を使用できますか?

ベストアンサー1

その中にキーワードがたくさんあります。nftablesそれは単に定数を表します。これはtcpオプションの場合です(修正する:しかし、それからnftables0.9.8)。

以下はtcpオプションから抜粋したものです。

拡張ヘッダー表現

拡張ヘッダー式は、IPv6 拡張ヘッダーおよび TCP オプションなどの可変サイズプロトコルヘッダーのデータを参照します。

[...]

TCPオプション

{生産中止|最大セグメント袋0 |袋3 |

TCPオプション

キーワード 説明する TCPオプションフィールド
廃止 オプションリストの終わり タイプ
ヌープ 1バイトTCP動作なしオプション タイプ
最大セグメント TCP最大セグメントサイズ タイプ、長さ、サイズ
TCPウィンドウのサイズ変更 タイプ、長さ、数量
[...]
タイムスタンプ TCPタイムスタンプ タイプ、長さ、tsval、tsecr

[...]

ブール仕様

次の式はブール比較をサポートします。

表現する 行動
嘘をつく パスが存在することを確認してください。
拡大する IPv6拡張ヘッダーがあることを確認してください。
TCPオプション TCPオプションヘッダーがあることを確認してください。

[...]

# match if TCP timestamp option is present
filter input tcp option timestamp exists

これはeol0を表し、nop1を表し、...はtimestamp8を表す式です。

修正する:バージョン0.9.8からキーワードの代わりに任意の数値を指定できます。

  • ネイティブTCPオプション一致サポートを追加

    ... TCPオプション@ 42,16,4

    @kind、オフセット、長さを指定できる場所

  • TCPオプションがあるかどうかを確認できます。

    ... TCPオプション42が存在します。

だからこんなルールがあります。

nft add table t
nft add chain t c '{ type filter hook input priority 0; policy accept; }'
nft add rule t c tcp option 8 exists drop
nft add rule t c tcp option 9 exists drop
nft add rule t c tcp option 10 exists drop
[...]
nft add rule t c tcp option 254 exists drop

値が8(後で表示される8を含むtimestamp)以上(オプションの値は8ビットフィールドにあります)ですべてのルールをフィルタリングできます。

既知の値(ここでのみtimestamp)はキーワードで表示され、それ以外の場合は数字のままです。

# nft -a --debug=netlink list ruleset
ip t c 2
  [ exthdr load tcpopt 1b @ 8 + 0 present => reg 1 ]
  [ cmp eq reg 1 0x00000001 ]
  [ immediate reg 0 drop ]

ip t c 3 2
  [ exthdr load tcpopt 1b @ 9 + 0 present => reg 1 ]
  [ cmp eq reg 1 0x00000001 ]
  [ immediate reg 0 drop ]

ip t c 4 3
  [ exthdr load tcpopt 1b @ 10 + 0 present => reg 1 ]
  [ cmp eq reg 1 0x00000001 ]
  [ immediate reg 0 drop ]

ip t c 5 4
  [ exthdr load tcpopt 1b @ 254 + 0 present => reg 1 ]
  [ cmp eq reg 1 0x00000001 ]
  [ immediate reg 0 drop ]

table ip t { # handle 21
    chain c { # handle 1
        type filter hook input priority filter; policy accept;
        tcp option timestamp exists drop # handle 2
        tcp option 9 exists drop # handle 3
        tcp option 10 exists drop # handle 4
        tcp option 254 exists drop # handle 5
    }
}

私はそれをセットやマップに分解したり、オプション値と比較する方法を見つけることができませんでした。これは、構文全体tcp option fooを使用し、tcp option私が知っている限り構文で使用する必要があるため、これを単純化します。役に立たない結果につながります。機能は次のとおりです。

  • オプションのタイムスタンプが次のことを意味することを確認してください。カテゴリ8その種類の値は...8です。 (存在する場合は常にtrueなので同じですtcp option timestamp exists。):

    nft add rule t c tcp option timestamp kind == 8
    
  • または、オプションのタイムスタンプが次のことを意味していることを確認してください。カテゴリ8種類の値が8より大きい(常に偽)。

    nft add rule t c 'tcp option timestamp kind > 8'
    

考えるTCPオプションオプションリストの一部であるため、1つを選択するには既存のオプションをすべて繰り返す必要があるため、実装が容易ではないことがわかります。 2つが一致した場合、どちらが選択されますか?


注:8以上のオプションは維持する価値があります。例えばTCPオプションタイプ30に使用されますマルチポイントTCP最近の主流のLinuxに追加されたtcpオプションタイプ6(エコー)と7(エコー応答)は廃止されました。

おすすめ記事