
特定のcgroup(バージョン2)のプロセスによって生成されたすべてのパケットの送信元アドレスを変更したいと思います。可能ですか?
私は持っています:
nftables 1.0.2
、linux 5.15
(Ubuntuバージョン)/system.slice/system-my-service.slice/[email protected]
グループ
私は以前試しました:
- テーブルの作成
nft add table ip myservice
- ルーティング後のNATチェーンの作成
nft add chain ip myservice postrouting { type nat hook postrouting priority 100 \; }
- ポストルーティングルールを作成してみてください(実験中にnftにcgroup名に問題があり、これはレベル2の問題であるため、
nft add rule ip myservice postrouting socket cgroupv2 level 1 'system.slice' snat 10.0.0.1
これを使用しました:-)。'system.slice'
@
また、int32パラメータが必要な一致を見つけましたcgroup
。私はパススタイルcgroupをintに変換するためのヒントが見つからなかったので、cgroupバージョン1であると推測しました(したがって私には適用されません)。
私は、この表現が図1に示すsocket
ように、ルーティング後にnatチェーンに適用されないと思います。nft
Error: Could not process rule: Operation not supported
すべての失敗は、これが完全に間違ったアプローチであることを意味しますか?それとも、私が何か明らかなものを見逃しているのでしょうか?
答え1
2つの質問に対する答えは次のとおりです。
通事論
cgroupv2
文字列であるパスが必要です。文字列は常に二重引用符で表示され、特殊文字が含まれている場合は必須です。これらの二重引用符は、nft
シェルではなくコマンドで使用するためのものです。直接コマンド(たとえば、readを使用するファイルではない場合nft -f
)の場合、これらの二重引用符自体はエスケープまたは一重引用符で囲む必要があります。それ以外の場合、シェルはそれを使用します。また、パスは次のように記録されます。比較的
/
シェルから直接提供する場合は、先行する必要はありません(とにかく再表示時に許可され削除されます)。socket cgroupv2 level 3 '"system.slice/system-my-service.slice/[email protected]"'
最後に、
nft
複数のタグを持つ単一の引数を提供するのか、一度に複数の引数に単一のタグを提供するのかは重要ではありません。行のアセンブリと解析は同じです。したがって、シェルに特殊文字(here)があるときはいつでも、文字をエスケープする場所(デフォルトのチェーンの"
ように)を見つけるのではなく、単一引用符ですべての行を引用します。\;
制限事項の解決
出力フックでパケットにタグを付け、NAT用のポストパスフックでタグを確認できます。
nft 'add chain ip myservice { type filter hook output priority 0; policy accept; }' nft 'add rule ip myservice output socket cgroupv2 level 3 "system.slice/system-my-service.slice/[email protected]" meta mark set 0xcafe' nft add rule ip myservice postrouting meta mark 0xcafe snat to 10.0.0.1
最終結果は、最初に2つの接着剤コマンドを使用して独自のファイルに配置できます。等級。独自のファイルが存在する場合、シェルの解析とのやり取りが防止され、アトミック更新が行われます。それでも"..."
パスパラメータをバイパスする必要があります。nftables@
役割を説明してください。
myservice.nft
:
table ip myservice
delete table ip myservice
table ip myservice {
chain postrouting {
type nat hook postrouting priority 100; policy accept;
meta mark 0xcafe snat to 10.0.0.1
}
chain output {
type filter hook output priority 0; policy accept;
socket cgroupv2 level 3 "system.slice/system-my-service.slice/[email protected]" meta mark set 0xcafe
}
}
nft -f myservice.nft
cgroupがすでに存在する限りロードできます(これは起動時にサービスを開始する必要があることを意味する可能性があります)。nftablesこのルールをロードします)。
結局:
発信するすべてのパケットはフィルタ/出力を通過します。
- 適切な過程を経て出たものならグループパケットは0xcafeタグを受信します。
新しいフローの最初のパケットはすべて、nat/postrouting ルールを通過します。
- 0xcafeタグと一致する場合(適切な場所にあることを意味)グループ)これにより、フローのSNATルールがトリガーされます(タグはもはや重要ではありません)。