iptables(-nft)のMSSクランプがnftablesで機能しないように見えるのはなぜですか?

iptables(-nft)のMSSクランプがnftablesで機能しないように見えるのはなぜですか?

iptables -t mangle -o "$PPP_IFACE" --insert FORWARD 1 -p tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:65495 -j TCPMSS --clamp-mss-to-pmtu私のpppoeクライアントはiptablesのルールを自動的に追加します/etc/ppp/ip-up.d。ただし、nftablesのこの規則は次のとおりです。

table ip mangle {
    chain FORWARD {
        type filter hook forward priority mangle; policy accept;
        oifname "ppp0" meta l4proto tcp tcp flags & (syn|rst) == syn # tcpmss match 1400:65495 counter packets 714 bytes 42388 tcp option maxseg size set rt mtu
    }
}

tcpmss以降の内容はコメントアウトされていますが、このルールが何の効果もないように見えるのはなぜですか?

答え1

説明する

  • によってiptables-nft設定されたルールxtables カーネルモジュール(ここ:xt_tcpmssそしてxt_TCPMSS)通過するnftablesカーネルAPI互換性レイヤAPIであっても拡張テーブルもともと(レガシーカーネルAPI)に使用されました。iptables

    国のnftables____が機能しません拡張テーブルカーネルモジュールデザイン:いつも拡張テーブル使用中の場合はネイティブではなく、userlandnftコマンド(または対応するAPI)はネイティブのみを処理します。nftables。使用拡張テーブル互換性レイヤ用に予約されています。だからディスプレイが通り過ぎるとNFFT未知のモジュールはすべてコメントアウトされます(下記参照)。

  • 現在のバージョンはiptables-nftまだ自動翻訳できません。iptablesルールがローカライズされました。nftablesルール(この場合)またはそれに対応するデフォルトのルールはありません。nftablesルールは次のように翻訳されます(例:考えるLEDターゲット)。

    ここにnft見えます。拡張テーブル汎用翻訳エンジンが翻訳できないモジュールは、この部分を禁止されていると見なし、翻訳できない部分に注釈を付けますが、まだ知っている内容を翻訳します。呼ぶ拡張テーブルモジュールは次のように表示できます--debug=netlink

    # nft -a --debug=netlink list ruleset
    ip mangle FORWARD 2
      [ meta load oifname => reg 1 ]
      [ cmp eq reg 1 0x30707070 0x00000000 ]
      [ meta load l4proto => reg 1 ]
      [ cmp eq reg 1 0x00000006 ]
      [ match name tcp rev 0 ]
      [ match name tcpmss rev 0 ]
      [ counter pkts 0 bytes 0 ]
      [ target name TCPMSS rev 0 ]
    
    table ip mangle { # handle 167
      chain FORWARD { # handle 1
          type filter hook forward priority mangle; policy accept;
          oifname "ppp0" meta l4proto tcp tcp flags & (syn|rst) == syn # tcpmss match 1400:65495 counter packets 0 bytes 0 tcp option maxseg size set rt mtu # handle 2
      }
    }
    

    上の図:matchtarget意味拡張テーブル基準寸法。 ~からnftables一緒に使うiptables - 翻訳-m tcpmss --mss 1400:65495これは注釈で始まる質問であり、出力には翻訳されず、最後の部分は翻訳されるため、問題が発生したと推測できます。ここに示されている内容はnftデモ目的のためだけに提供されており、実際のルールとしては使用されません。

    実際の規則は、表示されたバイトコード--debug=netlink(見えない部分を含む)です。拡張テーブル特定のデータ)、したがって、このバイトコードはこの規則の証拠です。はい何かしてみてください。地元の人には役に立たないnftables

国のnftablesバージョン

たとえば、ほとんどのOPiptablesルールはローカルに翻訳できます。

# iptables-translate -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
nft add rule ip mangle FORWARD tcp flags & (syn|rst) == syn counter tcp option maxseg size set rt mtu

現在、自動翻訳機能はありませんが、-m tcpmss --mssその機能は次のとおりです。書くことができるtcp option maxseg size式(matchと同じ-m tcpmss --mss)またはsetステートメント(targetと同じ-j TCPMSS)として使用できます。以下は、これらの翻訳の結果です(翻訳エンジンが改善されると、後で表示される可能性があります)。

nft add rule ip mangle FORWARD 'oifname ppp0 tcp flags & (syn|rst) == syn tcp option maxseg size 1400-65495 counter tcp option maxseg size set rt mtu'

2番目の値65495は役に立ちません(代替可能tcp option maxseg size >= 1400)。


ノート

nftiptables-nft翻訳を誤用しようとすると、誤解を招く可能性があります。例えばiptables v1.8.7 (nf_tables)そしてNFFTv1.0.0、次のようになります。

# iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
# nft list ruleset | tee /tmp/mss.nft
table ip mangle {
    chain FORWARD {
        type filter hook forward priority mangle; policy accept;
        meta l4proto tcp tcp flags & (syn|rst) == syn counter packets 0 bytes 0 tcp option maxseg size set rt mtu
    }
  }
# nft flush ruleset
# nft -f /tmp/mss.nft
# iptables-save 
# Table `mangle' is incompatible, use 'nft' tool.

nftこれは、ルールセット全体が表示されたときに翻訳されましたが、初期互換ルールセットにはまだ次のものが含まれているためです。拡張テーブルバイトコードの対象(上から見たものと同じ)[ target name TCPMSS rev 0 ]:違いをiptables-nft表示せずにiptables-translate隠す出力です。コマンドを再nft実行すると、nft結果は完全にデフォルトです。nftablestcp option maxseg size set rt mtu置き換えられましたが、コマンド-j TCMPSS --clamp-mss-to-pmtuiptables-save結果を認識しなくなりました。iptables- 翻訳されたコードは再翻訳できません。iptables滞在。

盲目的に捨てないでくださいiptables使用ルールnftables再読み込みnftablesiptablesそれでも必要です。

関連情報