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____が機能しません拡張テーブルカーネルモジュールデザイン:いつも拡張テーブル使用中の場合はネイティブではなく、userland
nft
コマンド(または対応する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 } }
上の図:
match
とtarget
意味拡張テーブル基準寸法。 ~から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
)。
ノート
nft
iptables-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
結果は完全にデフォルトです。nftablesにtcp option maxseg size set rt mtu
置き換えられましたが、コマンド-j TCMPSS --clamp-mss-to-pmtu
はiptables-save
結果を認識しなくなりました。iptables- 翻訳されたコードは再翻訳できません。iptables滞在。
盲目的に捨てないでくださいiptables使用ルールnftables再読み込みnftables、iptablesそれでも必要です。