IPsetの代替またはワイルドカードの種類の賢明なアイデア

IPsetの代替またはワイルドカードの種類の賢明なアイデア

これには高度なプログラマーがありますが、すべてのプログラミング言語と比較して作業を困難にするLinuxネットワークの制限は嫌いです。

実際、私はしなければなりません。ポリシーベースのルーティング特定のLAN IPアドレスが特定の発信インターフェイス(例:eth5)を選択できるようにします。私の場合、ipsetでさえ十分に強力ではありませんでした。最初のオクテットが「10」で最後のオクテットが「9」で終わるすべてのLAN IPを許可したいと思います。これは10.*.*.??9JavaScriptです。if(ip.match("\10\..*\.(\d+9|9)\g")) ...USE eth5

これを達成するためのいくつかのトリックを知っている人はいますか? CIDRに固執する必要がある場合は、おそらく何千ものIP CIDRがあります。これは言うまでもないことです。

ありがとう

答え1

OPも実装限界に達しているので、答えをアルゴリズムの小さな部分に制限しません。答えは彼らと協力する必要があります。


ルーティングスタックはLinuxネットワークスタックの一部であり、処理に制限されています。CIDRネットマスク33個/32(/255.255.255.255)から/0(/0.0.0.0)までと同じです。

特定のファイアウォール施設などのネットワークスタックの他の部分には、この制限は適用されません。 255.0.0.255などのネットマスクを使用すると、IPv4アドレスの2つの中間数を上書きできます。残念ながら、ネットワークマスクは2の累乗または除算の残りの部分を2の累乗で簡単に処理できますが、モジュロ10(10で除算の残りの部分)には役立ちません。パケット処理では10で除算を使用できます。ありません。したがって、9〜249の間にはまだ確認する値が25個残っており、これらの値のリストが必要です。ああ、もう一度言ってください。IPセットCIDRネットマスクによって制限されるiptables'使用IPセット制限されていないネットマスクは許可されていません。IPセットまったく使えません。

〜25を使用してください。iptablesルール(それほど多くはありません)を使用するか、より柔軟なルールを使用してください。nftables置く

そしてiptables

ネットマスク255.0.0.0を使用してIPv4アドレスの最初の部分のみを確認し、10.最後の部分で25の可能性を確認します。解決しようとしている特定の問題に応じて、考慮する必要がある受信インターフェイスに追加の制限を追加できます。

iptables -t mangle -N specialrouting
iptables -t mangle -A PREROUTING -s 10.0.0.0/255.0.0.0 -j specialrouting

specialroutingたとえば、25の可能性でユーザーチェーンを埋めるには、次のようにします。強く打つスクリプト:

#!/bin/bash

iptables -t mangle -F specialrouting # for idempotence
for i in {9..255..10}; do
    iptables -t mangle -A specialrouting -s 10.0.0.$i/255.0.0.255 -j MARK --set-mark 0xcafe
done

最後に、2 ^ 16(無視された2つの中間バイトについて)x 25 = 1638400の可能性が表示されます。

モジュロが16(2の累乗)の場合、モジュロ10の25の値の代わりに9、25、41、57 ... 249の16の値がフィルタリングされるため、上記のすべての項目を単一のルールに置き換えることができます。ネットマスクは、2の累乗である任意のモジュラスを処理できます。このネットマスク255.0.0.15(0xff00000f)は、次の単一の規則で機能します。

iptables -t mangle -A PREROUTING -s 10.0.0.9/255.0.0.15 -j MARK -set-mark 0xcafe

または使用nftables

上記のスクリプトに似た事前計算されたセットの要素のリストを使用すると、モジュロ10ケースのルールセットがロードされますnft -f specialrouting.nft

specialrouting.nft:

table ip specialrouting         # for idempotence
delete table ip specialrouting  # for idempotence

table ip specialrouting {
    set modulo10 {
        type ipv4_addr
        flags constant
        elements = { 10.0.0.9, 10.0.0.19,
                 10.0.0.29, 10.0.0.39,
                 10.0.0.49, 10.0.0.59,
                 10.0.0.69, 10.0.0.79,
                 10.0.0.89, 10.0.0.99,
                 10.0.0.109, 10.0.0.119,
                 10.0.0.129, 10.0.0.139,
                 10.0.0.149, 10.0.0.159,
                 10.0.0.169, 10.0.0.179,
                 10.0.0.189, 10.0.0.199,
                 10.0.0.209, 10.0.0.219,
                 10.0.0.229, 10.0.0.239,
                 10.0.0.249 }
    }

    chain prerouting {
        type filter hook prerouting priority -150; policy accept;
        ip saddr & 255.0.0.255 == @modulo10 meta mark set 0xcafe
    }
}

モジュロ16シングル用nftables定型句のない規則は次のようになります。iptables上記の規則:

ip saddr & 255.0.0.15 == 10.0.0.9 meta mark set 0xcafe

ルーティングにマーカーを使用する

パケットに設定されたフラグ(Linuxネットワークスタック内のパケットの内部寿命中のみ)は、ルーティングスタックのメッセージとして使用でき、ルーティングルールと一致する代替ルーティングテーブルを使用できます。

ip rule add fwmark 0xcafe lookup 100

以下は表 100 のパスで、ここdev eth5には次のパスに加えて最も重要なパスも含まれています。基本ルーティングテーブル:

ip route add ... dev eth5 table 100
...

戻りトラフィックは次から発生します。イーサリアム5おそらく同じテーブルを使用する必要があります。

ip rule add iif eth5 lookup 100

補足説明

少なくともテスト時には、不完全なルーティングによるトラフィックの低下を防ぎ、SRPF、すなわち。rp_filter、有効にしないでください(配布でデフォルトで有効になっている場合)。

for i in $(sysctl -N -ar 'net\.ipv4\.conf\..*\.rp_filter'); do sysctl -w $i=0; done

ストリームのconntrackエントリにマーカーを保存するなど、マーカーを使用する場合は他の可能性がありますが、設定の正確な説明がない限り、ここで何が必要かを知ることはできません。このブログにはいくつかの例があります。Linux以上!ネットフィルターコマック

再ルーティングタグが関連していることに注意してください。地域的に始まった(またはそれに対応する地域の終了)転送/ルーティングトラフィック以外のトラフィックは、コーナーケース(TCPよりもUDPの場合はそうです)が原因で問題が発生したため、そのケースを解決しようとしませんでした。

関連情報