특정 서브넷이 IP 목록과 겹치는지 확인하는 방법이 있는지 알고 싶습니다. 예를 들어 다음 목록이 있습니다.
197.26.9.128/25
193.36.81.128/25
194.33.24.0/22
188.115.195.80/28
188.115.195.64/28
185.59.69.96/28
185.59.69.32/27
41.202.219.32/27
41.202.219.128/29
154.70.120.16/28
154.70.120.32/28
154.70.120.0/28
41.202.219.208/28
41.202.219.136/29
197.157.209.0/24
다음 IP가 이전 목록과 중복되는지 확인하고 싶습니다.
197.26.9.0/26
194.33.26.0/26 (IP overlapped with 194.33.24.0/22)
188.115.195.88/29 (IP overlapped with 188.115.195.80/28)
41.202.219.0/24
197.157.209.128/28 (IP overlapped with 197.157.209.0/24)
출력은 다음과 같습니다.
197.26.9.0/26
41.202.219.0/24
답변1
사용해 보세요IP 충돌, pip install ipconflict
.
서브넷을/tmp/subnets.txt
ipconflict -f /tmp/subnets.txt
산출:
conflict found: 194.33.24.0/22 <-> 194.33.26.0/26
conflict found: 188.115.195.80/28 <-> 188.115.195.88/29
conflict found: 41.202.219.32/27 <-> 41.202.219.0/24
conflict found: 41.202.219.128/29 <-> 41.202.219.0/24
conflict found: 41.202.219.208/28 <-> 41.202.219.0/24
conflict found: 41.202.219.136/29 <-> 41.202.219.0/24
conflict found: 197.157.209.0/24 <-> 197.157.209.128/28
답변2
참고할 수 있는 내용은 다음과 같습니다. 우선 Bash의 스크립트이므로 그다지 효율적이지 않습니다. 서브넷 쌍과 보고서 중복만 확인하므로 원하는 작업을 정확히 수행하지 않습니다. 스크립트 아래에는 일부 조잡한 쉘 명령이 있지만 결과는 원하는 형식으로 표시되지 않습니다. 따라서 전체 컬렉션을 필요에 맞게 통합하고 조정하거나 이를 논리를 설명하는 스케치로 생각해야 합니다.
#!/usr/bin/env bash
subnet1="$1"
subnet2="$2"
# calculate min and max of subnet1
# calculate min and max of subnet2
# find the common range (check_overlap)
# print it if there is one
read_range () {
IFS=/ read ip mask <<<"$1"
IFS=. read -a octets <<< "$ip";
set -- "${octets[@]}";
min_ip=$(($1*256*256*256 + $2*256*256 + $3*256 + $4));
host=$((32-mask))
max_ip=$(($min_ip+(2**host)-1))
printf "%d-%d\n" "$min_ip" "$max_ip"
}
check_overlap () {
IFS=- read min1 max1 <<<"$1";
IFS=- read min2 max2 <<<"$2";
if [ "$max1" -lt "$min2" ] || [ "$max2" -lt "$min1" ]; then return; fi
[ "$max1" -ge "$max2" ] && max="$max2" || max="$max1"
[ "$min1" -le "$min2" ] && min="$min2" || min="$min1"
printf "%s-%s\n" "$(to_octets $min)" "$(to_octets $max)"
}
to_octets () {
first=$(($1>>24))
second=$((($1&(256*256*255))>>16))
third=$((($1&(256*255))>>8))
fourth=$(($1&255))
printf "%d.%d.%d.%d\n" "$first" "$second" "$third" "$fourth"
}
range1="$(read_range $subnet1)"
range2="$(read_range $subnet2)"
overlap="$(check_overlap $range1 $range2)"
[ -n "$overlap" ] && echo "Overlap $overlap of $subnet1 and $subnet2"
사용법과 결과는 다음과 같습니다.
$ ./overlap.bash 194.33.26.0/26 194.33.24.0/22
Overlap 194.33.26.0-194.33.26.63 of 194.33.26.0/26 and 194.33.24.0/22
이제 첫 번째 서브넷 목록이 파일에 있고 list
확인하려는 서브넷이 파일에 있다고 가정하면 to_check
스크립트를 사용하여 모든 중복 항목을 찾을 수 있습니다.
$ while read l; do list+=("$l"); done < list
$ while read t; do to_check+=("$t"); done < to_check
$ for i in "${list[@]}"; do for j in "${to_check[@]}"; do \
./overlap.bash "$i" "$j"; done; done
결과는 다음과 같습니다.
Overlap 194.33.26.0-194.33.26.63 of 194.33.24.0/22 and 194.33.26.0/26
Overlap 188.115.195.88-188.115.195.95 of 188.115.195.80/28 and 188.115.195.88/29
Overlap 41.202.219.32-41.202.219.63 of 41.202.219.32/27 and 41.202.219.0/24
Overlap 41.202.219.128-41.202.219.135 of 41.202.219.128/29 and 41.202.219.0/24
Overlap 41.202.219.208-41.202.219.223 of 41.202.219.208/28 and 41.202.219.0/24
Overlap 41.202.219.136-41.202.219.143 of 41.202.219.136/29 and 41.202.219.0/24
Overlap 197.157.209.128-197.157.209.143 of 197.157.209.0/24 and 197.157.209.128/28
보시다시피, 41.202.219.0/24
4개의 중복이 있는데, 이는 질문에서 예상한 것과 반대입니다.
첫 번째 목록과 겹치지 않는 서브넷만 얻으려면 스크립트가 훨씬 짧아집니다. 이 to_octets
함수는 필요하지 않으며 check_overlap
이미 다음 줄에 결과를 제공합니다.
if [ "$max1" -lt "$min2" ] || [ "$max2" -lt "$min1" ]; then return; fi
마지막 두 줄도 변경할 수 있습니다(마지막 줄은 완전히 제거됨).
통합 로직의 경우 모든 조합을 검사할 필요는 없으므로 첫 번째 목록에서 단락 여부를 검사할 수 있습니다. 음수이면 충분합니다.