conntrackタグを使用してIptableをNftablesファイアウォールに移植する

conntrackタグを使用してIptableをNftablesファイアウォールに移植する

こんにちは、尊敬するコミュニティの皆さん、

強力なiptablesファイアウォールをnftablesに移植するのに問題があります。コンテンツの入力/出力/配信(主にconntrackタグ)に問題はありません。現在私がしていることは次のとおりです。

ip1/このコマンドを使用して、ルールタグとconntrackタグを持つ3つのルーティングテーブルを作成します。それぞれには、FDDI、VPN、または4G接続であるデフォルトパスがあります。

ip route add table maincnx default dev $WAN via 192.168.1.2
ip route add table maincnx 192.168.0.0/24 dev $LAN src 192.168.0.1
ip route add table maincnx 192.168.1.0/24 dev $WAN src 192.168.1.1
ip rule add from 192.168.1.2 table maincnx

[[ $VPN ]] && ip route add table vpnclient default dev $VPNIF via $VPNCLIENTIP
[[ $VPN ]] && ip route add table vpnclient $VPNCLIENTROUTE dev $VPNIF src $VPNCLIENTIP
[[ $VPN ]] && ip route add table vpnclient 192.168.0.0/24 dev $LAN src 192.168.0.1
[[ $VPN ]] && ip route add table vpnclient 192.168.1.0/24 dev $WAN src 192.168.1.1
ip rule add from $VPNCLIENTIP table vpnclient

ip route add table altcnx default dev $WAN2 via 192.168.2.2
ip route add table altcnx 192.168.0.0/24 dev $LAN src 192.168.0.1
ip route add table altcnx 192.168.1.0/24 dev $WAN src 192.168.1.1
ip route add table altcnx 192.168.2.0/24 dev $WAN2 src 192.168.2.1
ip rule add from 192.168.2.2 table altcnx

ip rule add from all fwmark 1 table maincnx
[[ $VPN ]] && ip rule add from all fwmark 2 table vpnclient
ip rule add from all fwmark 3 table altcnx
ip route flush cache

2/ 次に、いくつかのiptablesルールをクリーンアップしました。 (すでにIPtablesバージョンを使用するのに苦労している人がいる場合は、コメントを残します。)

$IPTABLES -t mangle -A PREROUTING -j CONNMARK --restore-mark # Restore mark previously set
$IPTABLES -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT # If a mark exists: skip
$IPTABLES -t mangle -A PREROUTING -s 192.168.0.5 -p tcp --sport 50001  -j MARK --set-mark 2 # route through VPN
$IPTABLES -t mangle -A PREROUTING -s 192.168.0.3 -j MARK --set-mark 2
$IPTABLES -t mangle -A PREROUTING -s 192.168.0.4 -j MARK --set-mark 3 # route through 4G
$IPTABLES -t mangle -A POSTROUTING -j CONNMARK --save-mark # save marks to avoid retagging

3/関連背面配線:

$IPTABLES -t nat -A POSTROUTING -o $WAN -j SNAT --to-source 192.168.1.1
$IPTABLES -t nat -A POSTROUTING -o $WAN2 -j SNAT --to-source 192.168.2.1
[[ $VPN ]] && $IPTABLES -t nat -A POSTROUTING -o $VPNIF -j SNAT --to-source $VPNCLIENTIP

ps:スクリプトの起動時にVPNが実行されている場合、$ VPNは明らかに1に設定された変数です。 IPルールのクリーンアップや一部の事前ルーティング/配信など、これを行うために実行する必要がある他のいくつかのタスクがありますが、それは重要ではありません。興味があればコメントを残してください。

タイプ:ゲートウェイにはips 192.168.1.1(FDDI)、192.168.0.1(LAN)、192.168.2.1(4G)を使用する0/1/2の3つのethがあり、ゲートウェイにはFDDIの192.168.1.2と1ゲートウェイ4Gです。 、VPNはTUN0デバイスにあり、IPは約10.8.0.xです。

したがって、デフォルトでは、192.168.0.5がポート50001:tcpへの接続を開始すると、VPNを介してルーティングされます。 192.168.0.3 は接続を試みるに関係なく常に VPN を使用します。

質問:タスクのIP部分はnftablesと同じままですが、iptablesのように再設定とポストルーティングを実行できるnftablesの対応するコマンドは何ですか?

答え1

iptables-translate最新のインストールが付属していますiptables(または別々に梱包されている可能性があるため、検索してみてください)。それは(試みて)翻訳するiptablesルールは次のとおりです。nftablesルール。すべての内容を読みたくない場合は、ここに簡単な方法があります。文書(含むこのツールの場合)とマニュアルページ

使用するためにルートは必要ありません。この場合(OPがルールを作成した方法に対処するためにダミー情報を含むいくつかの変数で完了):

$ export IPTABLES=/usr/sbin/iptables-translate
$ $IPTABLES -V
iptables-translate v1.8.7 (nf_tables)

$ export WAN=wan WAN2=wan2 VPNIF=vpnif VPNCLIENTIP=192.0.2.2 VPN=1
$ cat > /tmp/rules.bash <<'EOF'
$IPTABLES -t mangle -A PREROUTING -j CONNMARK --restore-mark # Restore mark previously set
$IPTABLES -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT # If a mark exists: skip
$IPTABLES -t mangle -A PREROUTING -s 192.168.0.5 -p tcp --sport 50001  -j MARK --set-mark 2 # route through VPN
$IPTABLES -t mangle -A PREROUTING -s 192.168.0.3 -j MARK --set-mark 2
$IPTABLES -t mangle -A PREROUTING -s 192.168.0.4 -j MARK --set-mark 3 # route through 4G
$IPTABLES -t mangle -A POSTROUTING -j CONNMARK --save-mark # save marks to avoid retagging

$IPTABLES -t nat -A POSTROUTING -o $WAN -j SNAT --to-source 192.168.1.1
$IPTABLES -t nat -A POSTROUTING -o $WAN2 -j SNAT --to-source 192.168.2.1
[[ $VPN ]] && $IPTABLES -t nat -A POSTROUTING -o $VPNIF -j SNAT --to-source $VPNCLIENTIP
EOF

結果:

$ bash /tmp/rules.bash
nft add rule ip mangle PREROUTING counter meta mark set ct mark
nft add rule ip mangle PREROUTING mark != 0x0 counter accept
nft add rule ip mangle PREROUTING ip saddr 192.168.0.5 tcp sport 50001 counter meta mark set 0x2 
nft add rule ip mangle PREROUTING ip saddr 192.168.0.3 counter meta mark set 0x2 
nft add rule ip mangle PREROUTING ip saddr 192.168.0.4 counter meta mark set 0x3 
nft add rule ip mangle POSTROUTING counter ct mark set mark
nft add rule ip nat POSTROUTING oifname "wan" counter snat to 192.168.1.1
nft add rule ip nat POSTROUTING oifname "wan2" counter snat to 192.168.2.1
nft add rule ip nat POSTROUTING oifname "vpnif" counter snat to 192.0.2.2

翻訳者が一部の部分を知らない場合や翻訳できない場合があります。たとえば、次のようになります。

$ /usr/sbin/iptables-translate -A INPUT -s 192.0.2.2 -j LED --led-trigger-id test
nft # -A INPUT -s 192.0.2.2 -j LED --led-trigger-id test 

今回のダンプの翻訳にはいかなるコメントも含まれていないので、翻訳が良いと推測できます。テーブルの名前を変更し、正しくリンクし(そして内容を変数に書き戻す)、選択と互換性があることを確認してください。nftablesルールセットを再利用してください。必要に応じて改善または単純化します(式はcounterデバッグまたは統計にのみ使用され、実際の操作には使用されません)。

以下で提供する新機能で改善される可能性があります。nftables(例:使用より良い分解マッピング)必要に応じて、これはこの回答の範囲外です。


注:翻訳を盲目的に信頼しないでください。nftablesその属性をまだ理解する必要があります。

翻訳ツールは使用状況を知らないため、翻訳で見つかった表現と文章を確認した後でも、OPはまだ理解する必要があります。私はOPを必要としない例を提示します。再ルーティングと呼ばれる特定の目的のために、OUTPUTフックに(conn)フラグを設定するとき(ルーティング前に完了したため、PREROUTINGに設定されたフラグについては特別なものはありません。FORWARDでは機能しません。これを行う正しい方法は次のとおりです。nftablesに印を置くことです。チェーンはtype route hook output再ルーティングをトリガーせずにtype filter hook output

サポートされるチェーンタイプ

[...]

タイプ 家族 つながる 説明する
[...]
路線 アイピ、アイピ6 出力 パケットがこのタイプのチェーンを通過して受け入れようとすると、IPヘッダーの関連部分が変更されると新しいルート検索が行われます。これにより、nftablesでポリシーパスセレクタを実装できます。

...進路を変えようとしています。ここではnft add rule ip mangle OUTPUT詳しく取り上げません。一般的に壊す変身したばかりフィルター使用するときnftables。人々はそれがどのように機能するかを理解しなければなりません。翻訳がすべてを解決するわけではありません。

関連情報