Linux CentOS - 해외 IP 차단하기 (중국 등)
2023년 2월 현재 동작하는 최신 방법입니다.
Root로 작업한다.
(1) 작업 폴더를 생성한다.
# mkdir /root/ipblock
# cd /root/ipblock
(2) 전세계 IP 파일을 다운로드 받는다.
아래 주소에 접속해서 가입(Sign Up)하고 라이센스 키를 발급받는다.
라이센스 키는 다시 보여주지 않으므로 반드시 메모를 해둔다.
https://dev.maxmind.com/geoip/geolite2-free-geolocation-data
MaxMind Server IP Addresses
Develop applications using industry-leading IP intelligence and risk scoring.
dev.maxmind.com
# wget "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country-CSV&license_key=라이센스키&suffix=zip" -O /root/ipblock/GeoLite2-Country-CSV.zip
[root@webcom ipblock]# wget "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country-CSV&license_key=tI0sSuqyUOkstWaI&suffix=zip" -O /root/ipblock/GeoLite2-Country-CSV.zip
--2023-02-10 02:01:03-- https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country-CSV&license_key=tI0sSuqyUOkstWaI&suffix=zip
Resolving download.maxmind.com (download.maxmind.com)... 104.16.37.47, 104.16.38.47, 2606:4700::6810:252f, ...
Connecting to download.maxmind.com (download.maxmind.com)|104.16.37.47|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2883178 (2.7M) [application/zip]
Saving to: `/root/ipblock/GeoLite2-Country-CSV.zip'
/root/ipblock/GeoLite2-Cou 100%[======================================>] 2.75M 6.79MB/s in 0.4s
2023-02-10 02:01:04 (6.79 MB/s) - `/root/ipblock/GeoLite2-Country-CSV.zip' saved [2883178/2883178]
[root@webcom ipblock]# ls -al
합계 2820
drwxr-xr-x. 2 root root 38 2월 10 02:01 .
dr-xr-x---. 5 root root 4096 2월 10 01:55 ..
-rw-r--r--. 1 root root 2883178 2월 8 07:34 GeoLite2-Country-CSV.zip
# unzip GeoLite2-Country-CSV.zip
-rw-r--r--. 1 root root 2883178 2월 8 07:34 GeoLite2-Country-CSV.zip
drwxr-xr-x. 2 root root 4096 2월 10 02:22 GeoLite2-Country-CSV_20230207
(3) 스크립스를 작성한다 - 예제는 중국 CN 을 차단하는 것이며, 원하는 국가 코드를 넣는다.
# vi ipblock_CN.sh
#!/bin/bash
#국가명
CONTRY="CN"
#geolite2 국가번호위치
LOCATION=/root/ipblock/GeoLite2-Country-CSV_20230207/GeoLite2-Country-Locations-en.csv
#geolite2 ipv4위치
DATA=/root/ipblock/GeoLite2-Country-CSV_20230207/GeoLite2-Country-Blocks-IPv4.csv
#firewall 수정할xml파일위치
FIREWALL=/etc/firewalld/zones/public.xml
#국가번호를 따서 code에 저장
CODE=`egrep ${CONTRY} ${LOCATION} | cut -d, -f1 | sed -e 's/"//g' | sed -e 's/,/-/g'`
#firewall xml파일 수정 스크립트
sed -i '/<\/zone>/d' ${FIREWALL}
for IPRANGE in `egrep "${CODE}" $DATA | cut -d, -f1 | sed -e 's/"//g' | sed -e 's/,/-/g'`
do
echo -e " <rule family=\"ipv4\">
<source address=\"${IPRANGE}\"/>
<drop/>
</rule>" >> ${FIREWALL}
done
echo -n "</zone>" >> ${FIREWALL}
GeoLite2 최신 버전은 GeoLite2-Country-CSV_20230207 와 같이 뒤에 날짜가 붙으니 위 스크립트에서 생성되는 폴더명으로 수정해준다.
스크립트는 아래 블로그의 내용을 참고하였다.
(3) 스크립트를 실행한다.
# chmod 700 ipblock_CN.sh
# ./ipblock_CN.sh
# firewall-cmd --reload
*. 주의사항으로 위 스크립트를 2번 실행하면 2번 등록된다. 1번만 실행하도록 한다.
[TIP] 방화벽에 설정된 차단 IP를 삭제하는 방법
# vi ipblock_recover.sh
#!/bin/bash
CONTRY="CN"
LOCATION=/root/ipblock/GeoLite2-Country-CSV_20230207/GeoLite2-Country-Locations-en.csv
DATA=/root/ipblock/GeoLite2-Country-CSV_20230207/GeoLite2-Country-Blocks-IPv4.csv
CODE=`egrep ${CONTRY} ${LOCATION} | cut -d, -f1 | sed -e 's/"//g' | sed -e 's/,/-/g'`
for IPRANGE in `egrep "${CODE}" $DATA | cut -d, -f1 | sed -e 's/"//g' | sed -e 's/,/-/g'`
do
firewall-cmd --permanent --zone=public --remove-rich-rule="rule family=ipv4 source address=$IPRANGE drop"
done
# chmod 700 ipblock_recover.sh
# ./ipblock_recover.sh
# firewall-cmd --reload
위 순백염소님 블로그의 스크립트 저작자가 스크립트 실행에 시간이 진짜 많이 걸린다고 하였는데, 지금은 제가 시간이 없어 추후 필요하다면 빠르게 실행되는 방법을 연구해서 공유해 드리겠습니다.
*. 댓글과 공감은 힘이 됩니다.