티스토리 뷰

[CentOS 6.X] iptables-GeoIP로 국가 차단


감될만한 이야기다. 국가간 악감정은 없지만 ㅠ... 워낙 사이즈가 큰 대륙의 스케일로 DDoS 공격도 정말 어마어마한 양으로 크게 들어올 때가 있다. 그렇다. 중국 얘기다ㅠ.. 거진 모든 DDoS 에 사용되는 IP는 웬만하면 대륙 IP인 경우가 많다.


이럴 때 아예 해외 IP를 차단하고 싶다, 혹은 특정국가(중국)에 대한 접근을 차단하고 싶다. 할경우에 사용되는 방법이다.


!! 주의사항

1. 내 서버에 접근하는 모든 중국발 접근이 차단될 수 있으므로 신중히 사용해야 한다.

2. 아래 iptables_drop_China.sh은 iptables INPUT 체인에서 차단되도록 설정된 스크립트이므로, bridge/NAT 방화벽에서의 차단을 원하는 경우 FORWARD 체인에 차단되도록 스크립트를 INPUT -> FORWARD로 변경해야 합니다. iptables 체인간 패킷 흐름도를 잘 모르시는 경우, 아래에 첨부된 iptables 흐름도를 참고하세요~

iptables 흐름도에 대한 이미지 검색결과

1. 아래 URL을 클릭하여 maxmind 사에서 제공하는 국가간 GeoIP 데이터베이스를 다운받는다.

http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip


2. zip파일을 unzip을 사용하여 압축해제한 후 csv 파일을 확인합니다.

lim@lim-PC ~/geoip $ unzip GeoIPCountryCSV.zip 

Archive:  GeoIPCountryCSV.zip

  inflating: GeoIPCountryWhois.csv 


3. vi 편집기를 사용하여 iptables_drop_China.sh 스크립트를 작성합니다.

#!/bin/bash


DB=/home/lim/geoip/GeoIPCountryWhois.csv


for IP in `egrep "CN" $DB | cut -d, -f1,2 | sed -e 's/"//g' | sed -e 's/,/-/g'`

do

    echo $IP

    iptables -A INPUT -p all -m iprange --src-range $IP -j DROP

done



exit 0


위와 같이 작성 후  :wq로 저장 후 빠져나옵니다.

!! for IP in `egrep "CN" $DB | cut -d, -f1,2 | sed -e 's/"//g' | sed -e 's/,/-/g'`에서 egrep을 감싸는 양쪽의 ``은 작은따옴표(')가 아닌 백쿼타(`)(물결표시 ~ shift안누른 모양) 입니다.


vi 편집기 사용법을 모르시면 아래 링크를 참조하세요~

2017/11/15 - [OS/Linux] - [Linux] vi editor 사용법


4. 이제 해당 스크립트에 생명을 부여합니다.

chmod 700 /home/lim/geoip/iptables_drop_China.sh


5. 스크립트를 실행합니다.

/home/lim/geoip/iptables_drop_China.sh


6. 결과를 확인합니다.

lim-PC geoip # iptables -nvL | more

Chain INPUT (policy ACCEPT 1788 packets, 2015K bytes)

 pkts bytes target     prot opt in     out     source               destination         

    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            source IP range 1.0.1.0-1.0.3.255

    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            source IP range 1.0.8.0-1.0.15.255

    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            source IP range 1.0.32.0-1.0.63.255

    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            source IP range 1.1.0.0-1.1.0.255

    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            source IP range 1.1.2.0-1.1.63.255

    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            source IP range 1.2.0.0-1.2.2.255

    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            source IP range 1.2.4.0-1.2.127.255

...

7. 룰셋 개수 확인... 4539개라니.. 크헉 ㅠ_ㅠ... 진짜 졸라 많긴하다 ...ㅎㅎㅎ
lim-PC geoip # iptables -nvL | grep DROP | wc -l
4539

8. 서버가 리붓되거나 iptables service가 재시작됬을 때 해당 룰셋이 날아가도 복구할 수 있게 저장해야겠쥬?
lim-PC geoip # iptables-save > 20180621_iptables


9.  나중에 복구는 어떻게 하느냐!?

lim-PC geoip # iptables-restore < 20180621_iptables 


[설 명 충]

이미 설정된 GeoIP를 제거하고 싶다면?


- iptables_drop_China.sh 내 아래 라인을 변경합니다.

iptables -A INPUT -p all -m iprange --src-range $IP -j DROP

-->

iptables -D INPUT -p all -m iprange --src-range $IP -j DROP



댓글