単一の式で/ 16 IPアドレス範囲を書き込むには?

単一の式で/ 16 IPアドレス範囲を書き込むには?

nginxでは、次の範囲の中国のIPアドレスを禁止したいと思います。

 '223.64.0.0 - 223.117.255.255'

各範囲を抑制する方法を知っています/16。たとえば、次のようになります。

deny 223.64.0.0/16;

ただし、範囲223.64 - 223.117全体を含めるには多くの行が必要です。これを一行で行う略式表記法はありますか?

答え1

IP計算ipcalcDebianのパッケージ)が役に立つかもしれません解重合範囲を複数の一致に分割するCIDRS:

$ ipcalc -r 223.64.0.0 - 223.117.255.255
deaggregate 223.64.0.0 - 223.117.255.255
223.64.0.0/11
223.96.0.0/12
223.112.0.0/14
223.116.0.0/15

同じ他のipcalcipcalc-ngDebianのパッケージとコマンド名):

$ ipcalc-ng -d '223.64.0.0 - 223.117.255.255'
[Deaggregated networks]
Network:        223.64.0.0/11
Network:        223.96.0.0/12
Network:        223.112.0.0/14
Network:        223.116.0.0/15

このオプションには、出力形式を変更するための追加オプションがあります。

$ ipcalc-ng --no-decorate -d '223.64.0.0 - 223.117.255.255'
223.64.0.0/11
223.96.0.0/12
223.112.0.0/14
223.116.0.0/15

以下と組み合わせると、無制限のフォーマット変更の可能性を提供するjsonが含まれますjq

$ ipcalc-ng -j -d '223.64.0.0 - 223.117.255.255' |
    jq -r '.DEAGGREGATEDNETWORK[]|"deny " + . + ";"'
deny 223.64.0.0/11;
deny 223.96.0.0/12;
deny 223.112.0.0/14;
deny 223.116.0.0/15;
$ ipcalc-ng -j -d '223.64.0.0 - 223.117.255.255' |
   jq -r '"deny " + (.DEAGGREGATEDNETWORK|join(" ")) + ";"'
deny 223.64.0.0/11 223.96.0.0/12 223.112.0.0/14 223.116.0.0/15;

答え2

@StéphaneChazelas'とても良い答えですね。 OPまたは将来の読者が好む場合いいえたとえば、各/ 16がブロックされていますが、後で1つ以上の個々の/ 16をブロック解除できるように、細かい方法で結果を集計するために必要なIP範囲を頻繁に使用または生成しますjotseq

時々、人々はブロックしたいネットワークのCIDRだけを知っています。 10.24.0.0/14をブロックしたいのですが、単一の/16単位に細分化したいとしましょう。

# jot -w 10.%d.0.0/16 4 24
10.24.0.0/16
10.25.0.0/16
10.26.0.0/16
10.27.0.0/16

上記の例では、4/ 14に/ 16が4つあるため、定数が発生します。つまり、2**(16-14) = 2**2 = 4 です。

一連の/24で10.0.64.0/19をブロックします。

# jot -w 10.0.%d.0/24 32 64
10.0.64.0/24
10.0.65.0/24
10.0.66.0/24
...
10.0.92.0/24
10.0.93.0/24
10.0.94.0/24
10.0.95.0/24

/19 には 32 個の /24 があるため、定数 32 が使用されます。別の方法で計算すると、2**(24-19) == 2**5 == 32 です。

他の場合には、ネットワークスコープが厳密なCIDR境界に属していないか、単にソース文書の作成者がCIDR表記法を使用しないことを選択したため、CIDR構文では指定されません。 seq時には状況に適応する方が簡単です。

10.100.0.0~10.109.255.255 をブロックするには:

# seq -f '10.%g.0.0/16' 100 109
10.100.0.0/16
10.101.0.0/16
10.102.0.0/16
10.103.0.0/16
10.104.0.0/16
10.105.0.0/16
10.106.0.0/16
10.107.0.0/16
10.108.0.0/16
10.109.0.0/16

明らかに、これらのIP範囲をstdoutに出力するだけでは何もブロックされません。ユーザーがviそれを構成ファイルに入れるか、必要な操作を実行するシェルスクリプトまたは他のシステムコマンドにパイプするとします。必要なコマンド構文が十分に単純な場合、またはseqシェル入力jotを生成するために直接使用できる場合:

# seq -f 'ipfw add 560 deny ip from 10.%g.0.0/16 to any' 100 109
ipfw add 560 deny ip from 10.100.0.0/16 to any
ipfw add 560 deny ip from 10.101.0.0/16 to any
ipfw add 560 deny ip from 10.102.0.0/16 to any
ipfw add 560 deny ip from 10.103.0.0/16 to any
ipfw add 560 deny ip from 10.104.0.0/16 to any
ipfw add 560 deny ip from 10.105.0.0/16 to any
ipfw add 560 deny ip from 10.106.0.0/16 to any
ipfw add 560 deny ip from 10.107.0.0/16 to any
ipfw add 560 deny ip from 10.108.0.0/16 to any
ipfw add 560 deny ip from 10.109.0.0/16 to any

seqこれらのコマンドの精度を確認した後、出力をパイプしてsh実行できます。

このソリューションは、多くのUNIX操作と同様に、集約よりも粒度が優先される場合(または実際に必要な場合)、操作を実行できるいくつかの基本コンポーネントがあることを示すために提供されています。

関連情報