단일 표현식으로 /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의 패키지)가 도움이 될 수 있습니다해중합범위를 여러 일치 항목으로 나누기CIDR에스:

$ 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

같은다른ipcalc( ipcalc-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이 차단되었지만 나중에 하나 이상의 개별 /16을 차단 해제할 수 있도록 세분화된 방식으로 결과를 집계하기 위해 종종 필요한 IP 범위를 사용하거나 생성합니다 jot.seq

때때로 사람들은 차단하려는 네트워크의 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이를 구성 파일에 넣거나 필요한 작업을 수행하는 쉘 스크립트 또는 기타 시스템 명령으로 파이프한다고 가정합니다. 필요한 명령 구문이 충분히 간단하거나 seqjot입력을 생성하는 데 직접 사용할 수 있는 경우:

# 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 작업과 마찬가지로 집계보다 세분성이 우선시되는 경우(또는 실제로 필요한 경우) 작업을 수행할 수 있는 몇 가지 기본 구성 요소가 있음을 보여주기 위해 제공됩니다.

관련 정보