IPアドレスまたはネットワークが他のネットワークに含まれているかどうかをBusyBoxシェルで確認する方法は?

IPアドレスまたはネットワークが他のネットワークに含まれているかどうかをBusyBoxシェルで確認する方法は?

ipsetBusyBoxシェルスクリプトには、ファイアウォールリストのホワイトリストとして使用されるIPのリストがあります。ホワイトリストには、ホワイトリストに登録するためのルーティングできないIPを含めることができます。一方、Firehol_level1リスト(完璧)にはrfc1918ルーティングできないCIDRが含まれています。

iprange最初の試みはCIDRと一致する項目を除外するホワイトリストを使用することでiprange --common net.txt whitelist.txt、スワップされたファイルの順序はiprange --common whitelist.txt net.txt常にCIDR(ネットワークブロック)ではなくIPを出力しました。

ホワイトリストに登録されているIPがネットワークブロックと一致する場合は、ipsetそのネットワークブロックを()リストから削除する必要があります。

ユーザー yaegashi は良い人ですネットワークスクリプトのbash ipv4 / cidr(いいえ):

#!/bin/bash

v4dec() {
        for i; do
                echo $i | {
                        IFS=./
                        read a b c d e
                        test -z "$e" && e=32
                        echo -n "$((a<<24|b<<16|c<<8|d)) $((-1<<(32-e))) "
                }
        done
}

v4test() {
        v4dec $1 $2 | {
                read addr1 mask1 addr2 mask2
                if (( (addr1&mask2) == (addr2&mask2) && mask1 >= mask2 )); then
                        echo "$1 is in network $2"
                else
                        echo "$1 is not in network $2"
                fi
        }
}

しかし、bashスクリプトビジボックスシェルでは実行されません。。 busyboxシェルで実行するように修正しました。

#!/bin/sh

v4dec() {
        for i; do
                echo $i | {
                        IFS=./
                        read a b c d e
                        test -z "$e" && e=32
                        echo -n "$((a<<24|b<<16|c<<8|d)) $((-1<<(32-e))) "
                }
        done
}

v4dec $1 $2 | {
  read addr1 mask1 addr2 mask2
    if [ $(($addr1&$mask2)) -eq $(($addr2&$mask2)) ] && [ $mask1 -ge $mask2 ]; then
      echo "$1 is in network $2"
    else
      echo "$1 is not in network $2"
    fi
}

BusyBox(v1.24.2でテスト済み)yaegashi v4testのシェルスクリプト翻訳は同じことをしますか、それとも間違っていますか?

それとも、限られたハードウェア(Perl / Python / etceteraなし)のIPv4アドレスのリストと一致するipset hash:netリストからCIDRエントリを削除するより良い方法はありますか?

答え1

重要なのiprangeは、ホワイトリストに登録されているIPをCIDR形式で作成する必要があることです。

IPにサフィックスの合計/20を追加すると、/24ネットワークブロックの一致が改善される可能性があります。

$ cat net-optim.txt
1.10.16.0/20

$ cat whitelist.txt
1.10.16.1/20
1.10.16.1/24

$ iprange --common net-optim.txt whitelist.txt
1.10.16.0/20

iprange --exclude失敗と結合されます--ipset-reduce 20。使用を放棄iprangeし、delete 192.168.0.* 使用に戻りますgrep

関連情報