본문 바로가기

IT, Computer/Linux

CentOS7 firewall를 이용해 특정국가 ip차단

우선 firewall가 켜져있는지 확인하시고 꺼져있다면 켜주세요.

# systemctl status firewalld

 

저는 해당작업을 root홈폴더에서 진행했습니다.

 

# mkdir -p /root/ipblock

# cd /root/ipblock

# wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country-CSV.zip

# unzip GeoLite2-Country-CSV.zip

# mv GeoLite2-Country-CSV_20190326/ GeoLite2-Country-CSV/

# vi ipblock_CN.sh

#!/bin/bash

#국가명
CONTRY="CN"
#geolite2 국가번호위치
LOCATION=/root/ipblock/GeoLite2-Country-CSV/GeoLite2-Country-Locations-en.csv
#geolite2 ipv4위치
DATA=/root/ipblock/GeoLite2-Country-CSV/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}

해당스크립트를 만들때 https://blog.naver.com/travis31013/220262486667 를 참고하였습니다.

코드설명 : 

해당코드를 2번 실행하면 차단코드가 2배가 됩니다. 조심하세요.

 

CONTRY="CN"으로 중국으로 설정하였습니다. 다른국가로 설정하는것도 가능합니다.

(csv파일을 직접확인하여 국가코드가 뭔지 알 수 있습니다.)

 

LOCATION 과 DATA는 GeoLite2 를 설치한 디렉토리로 하여금 경로를 찾으시면됩니다.

만약 Pro를 돈주고 구매하신분들은 파일이름이 조금씩 다를겁니다.

 

FIREWALL는 현재 centos firewall에서 사용중인 xml파일(주로 public.xml)으로 경로를 잡아주시면됩니다.

 

2개이상의 국가를 설정하는건 옵션에 없습니다. 국가명을 다르게하여 2번실행하거나

변수를 몇개더만들고 아래 egrep을 적절히 수정하여 한번에 하는 방법도 있습니다.

# chmod 700 ipblock_CN.sh

# ./ipblock_CN.sh

# firewall-cmd --reload

 

중국ip차단이 완료되었습니다.

 

 

 

 

그럼 이제 원래대로 되돌리고 싶어졌을때 어떻게 하느냐

ftp로 접속해서 firewall가 사용하는 xml파일(주로public.xml)에 해당 아이피를 쓸어서 지우는게 가장간단한 방법입니다. 하지만 이것이 불가피할 경우도 분명 존재합니다.

(ftp접속이 어렵거나, 장기간 관리가안되 아이피가 여러개 섞여서 어디서 어디까지 해당ip인지 알수가없거나...)

 

정말정말 불가피하다면

# vi ipblock_recover.sh

#!/bin/bash

CONTRY="CN"
LOCATION=/root/ipblock/GeoLite2-Country-CSV/GeoLite2-Country-Locations-en.csv
DATA=/root/ipblock/GeoLite2-Country-CSV/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

참고로 이 방법 지인짜 오래걸립니다. (1시간 넘는걸 예상로됨)

firewall-cmd 명령어에 그 망할 success안뜨게 하는 방법없는지...혹은 뜨더라도 빠르게좀 넘어가게 하는방법이라도..

아시는분은 피드백해주시면 감사하겠습니다.

 

 

 

 

 

오류가 떴을때 대응법

{

    unzip 이란 명령어를 찾을수가 없습니다

    # yum install unzip

}