私は、次の行を持つマングルテーブルを利用する2つの異なるバージョンのiptablesで一連のiptablesルールを使用しています。v1.3.8とv1.4.7。
Fedora バージョン 8 カーネル 2.6.23.1-42.fc8 で実行される Iptables v1.3.8 Scientific Linux (RHEL レプリカ) 6.10 カーネル 2.6.32-573.1 で実行される Iptables v1.4.7
どちらのコンピュータも同じ方法で構成されていますが、年をとるiptables バージョンv1.3.8設定は動作していますが動作しません。v1.4.7
ルールは次のとおりです。
iptables -A PREROUTING -t mangle -s 10.200.0.0/16 ! -d 192.168.0.0/16 -j MARK --set-mark 0x1
iptables -A PREROUTING -t mangle -s 192.168.0.0/16 ! -d 192.168.0.0/16 -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j CONNMARK --save-mark
iptables -t mangle -I OUTPUT -m connmark ! --mark 0 -j CONNMARK --restore-mark
iptables -A OUTPUT -t mangle -s 172.16.62.100 -j MARK --set-mark 1
iptables -A OUTPUT -t mangle -s 172.16.61.2 -j MARK --set-mark 2
iptables -A OUTPUT -t mangle -s 172.16.61.3 -j MARK --set-mark 2
iptables -A OUTPUT -t mangle -s 172.16.61.4 -j MARK --set-mark 2
iptables -A OUTPUT -t mangle -s 172.16.61.5 -j MARK --set-mark 2
iptables -A OUTPUT -t mangle -s 172.16.61.6 -j MARK --set-mark 2
iptables -A OUTPUT -t mangle -s 172.16.61.7 -j MARK --set-mark 2
これ/etc/sysconfig/iptablesバージョンのファイルv1.3.8次の行が含まれます:
*mangle
-A PREROUTING -s 10.200.0.0/255.255.0.0 -d ! 192.168.0.0/255.255.0.0 -j MARK --set-mark 0x1
-A PREROUTING -s 192.168.0.0/255.255.0.0 -d ! 192.168.0.0/255.255.0.0 -j MARK --set-mark 0x2
-A PREROUTING -m mark ! --mark 0x0 -j CONNMARK --save-mark
-A OUTPUT -m connmark ! --mark 0x0 -j CONNMARK --restore-mark
-A OUTPUT -s 172.16.62.100 -j MARK --set-mark 0x1
-A OUTPUT -s 172.16.61.2 -j MARK --set-mark 0x2
-A OUTPUT -s 172.16.61.3 -j MARK --set-mark 0x2
-A OUTPUT -s 172.16.61.4 -j MARK --set-mark 0x2
-A OUTPUT -s 172.16.61.5 -j MARK --set-mark 0x2
-A OUTPUT -s 172.16.61.6 -j MARK --set-mark 0x2
-A OUTPUT -s 172.16.61.7 -j MARK --set-mark 0x2
COMMIT
これ/etc/sysconfig/iptablesバージョンのファイルv1.4.7次の行が含まれます:
*mangle
-A PREROUTING -s 10.200.0.0/255.255.0.0 ! -d 192.168.0.0/255.255.0.0 -j MARK --set-xmark 0x1/0xffffffff
-A PREROUTING -s 192.168.0.0/255.255.0.0 ! -d 192.168.0.0/255.255.0.0 -j MARK --set-xmark 0x2/0xffffffff
-A PREROUTING -m mark ! --mark 0x0 -j CONNMARK --save-mark --nfmask 0xffffffff --ctmask 0xffffffff
-A OUTPUT -m connmark ! --mark 0x0 -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff
-A OUTPUT -s 172.16.62.100 -j MARK --set-xmark 0x1/0xffffffff
-A OUTPUT -s 172.16.61.2 -j MARK --set-xmark 0x2/0xffffffff
-A OUTPUT -s 172.16.61.3 -j MARK --set-xmark 0x2/0xffffffff
-A OUTPUT -s 172.16.61.4 -j MARK --set-xmark 0x2/0xffffffff
-A OUTPUT -s 172.16.61.5 -j MARK --set-xmark 0x2/0xffffffff
-A OUTPUT -s 172.16.61.6 -j MARK --set-xmark 0x2/0xffffffff
-A OUTPUT -s 172.16.61.7 -j MARK --set-xmark 0x2/0xffffffff
COMMIT
新バージョンではマークを設定するされたXマーク設定そしてマスクそしてマスクまた存在します。
新しいバージョンでは、同じルールが機能しないのはなぜですか?
修正する:
問題はiptablesにあるものではありません。/etc/sysctl.conf:
次のパラメータを設定しましたが、これで機能します。
net.ipv4.conf.default.log_martians = 1
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
答え1
2 つのシステム間の主な変更点は次のとおりです。iptablesしかし、カーネル。以前のカーネルは2007年からです。
ルーティングに影響を与える重要な変更(この質問ではOPでは提供されませんが、OPのもう一つの質問) タグと併用するとsrc_valid_mark
:
net: IP ソース検証の復元
ポリシールーティングとskbタグを使用する場合:場合によっては リバースパスの確認src ipを確認するには、マッピングの受信dst ipとは異なるルーティングテーブルを使用する必要があります。 1つのケースはターゲットシステムであるかのように偽装する透明なプロキシであるため、ローカルテーブルは着信パケットに使用されますが、プライマリテーブルはアウトバウンドに使用できます。上記の動作を許可するようにデフォルトの動作を設定します。ユーザーが必要な場合sysctlで対称性をオンにする
src_valid_mark
今回のパッチ以前の動作(Fedora 8)厳格なリバースパスの転送(転送者rp_filter
):以降(SL 6)とは異なり、対称ルーティングを想定します。応答が別の経路を介して一方向または別の方向に送信される非常に特別な設定について、非対称ルーティングを想定します。
11年前のこのパッチはファイルに書き込むカーネル5.12に従って今年2021:
src_valid_mark - ブール値
0 -パケットの fwmark はリバースパスルックアップに含まれません。。これにより、透明プロキシなどの fwmark を 1 方向のみに活用する非対称ルーティング構成が可能になります。
1 - パケットの fwmark がリバースパスルックアップに含まれます。。これにより、fwmarkを使用して双方向にトラフィックをルーティングするときにrp_filterが機能するようになります。
この設定は、ICMP応答の送信元アドレス選択を実行したり、IPオプションの保存アドレスを決定したりするときの
IPOPT_TS_TSANDADDR
fmwarkIPOPT_RR
の使用にも影響します。
conf/{all,interface}/src_valid_mark
最大値を使用してください。デフォルト値は 0 です。。
したがって、厳密なリバースパス転送設定()を維持しながらマーキングを介して対称ルーティングが機能するようにするには、次の手順を実行しますrp_filter=1
。
sysctl -w net.ipv4.conf.all.src_valid_mark=1
またはそれに対応するものを追加してください/etc/sysctl.conf
。
net.ipv4.conf.all.src_valid_mark = 1
その中で最も高い価値を持っているのでみんなインタフェース値を取得します。