Apache2.4 - GeoIP를 이용한 국가별 차단 정책 적용

Last Updated on 11월 10, 2020 by 태랑(정현호)

GeoIP를 이용한 국가별 차단

GeoIP 란 MaxMind 에서 제공하는 모듈과 IP정보 DB 를 통해서 웹에 접근하는 IP의 국가별로 확인할 수 있는 오픈 소스 솔루션 입니다.

GeoIP 라이브러리로 이를 이용하여 서버에 접근 하는 IP를 국가별로 제한,허용 할 수 있습니다.
2019 1230일 부로 Database 에 대한 정책이 새롭게 변경됨에 따라 MaxMind DB Format mmdb를 
사용하는 GeoIP2 를 설치하는 방식으로 변경 되었으며 그에 대한 내용으로 내용을 기술 합니다.

먼저 https://www.maxmind.com/en/geolite2/signup에 접속하여 회원가입을 진행합니다.


정보를 입력 하고 회원가입을 합니다.






가입후 도착한 Email 에서 이미지와 같이 here를 클릭하여 패스워드를 생성 합니다.





생성 완료 한 뒤 위와 같이 로그인 창으로 이동 되며 로그인을 합니다.







로그인 후 좌측에 있는 My License Key를 클릭 합니다.









Generate new license key 를 클릭 합니다.







License key description 에 간략히 내용을 기재 하고 , 3.1.1 or newer 를 선택 후 confirm 을 클릭 합니다.









new license key 가 발급되었다면 Account/User ID License key를 별도로 기재(저장)

해놔야 합니다

그리고 Download Config 를 클릭하여 파일을 다운 받아 놓습니다.






다시 왼쪽 아래 메뉴에서 Download Files 를 클릭 합니다.









위의 이미지와 같이 3개의 gzip를 다운로드 받습니다.

다운로드 받았다면 서버로 업로드 후 /usr/share/GeoIP/ 위치에 압축을 해제 합니다

# ls -alrt /usr/share/GeoIP | grep mmdb

-rw-r--r--.   1 root root  3896583 Jul 22 02:22 GeoLite2-Country.mmdb

-rw-r--r--.   1 root root 63513173 Jul 22 02:26 GeoLite2-City.mmdb

-rw-r--r--.   1 root root  6813673 Aug  6 03:28 GeoLite2-ASN.mmdb




## GeoIP
설치 

먼저 python-ipaddr 을 설치 합니다, 그외 설치는 아래와 같은 순으로 진행 합니다.

yum install -y python-ipaddr





# libmaxminddb
설치

https://github.com/maxmind/libmaxminddb

https://github.com/maxmind/libmaxminddb/releases



wget https://github.com/maxmind/libmaxminddb/releases/download/1.4.2/libmaxminddb-1.4.2.tar.gz


tar zxvf libmaxminddb-1.4.2.tar.gz

cd libmaxminddb-1.4.2


./configure

make ; make install


echo /usr/local/lib  >> /etc/ld.so.conf

ldconfig




# mod_maxminddb
설치

https://github.com/maxmind/mod_maxminddb/releases


wget https://github.com/maxmind/mod_maxminddb/releases/download/1.2.0/mod_maxminddb-1.2.0.tar.gz


tar zxvf mod_maxminddb-1.2.0.tar.gz

cd mod_maxminddb-1.2.0


./configure --prefix=/usr/local/mod_maxminddb-1.2.0 --with-apxs=/usr/local/apache2.4/bin/apxs

make ; make install




# 모듈파일이 설치가 정상적으로 되었으며 apache의 module 디렉토리에 존재 하는지를 확인

# ls -al /usr/local/apache2.4/modules/mod_maxminddb.so
-rwxr-xr-x. 1 root root 56440 Jul 26 15:23 /usr/local/apache2.4/modules/mod_maxminddb.so

# grep mod_max  /usr/local/apache2.4/conf/httpd.conf

LoadModule maxminddb_module   modules/mod_maxminddb.so





# Apache
GeoIP설정


아래와 같이 apache의 httpd.conf 파일에 내용을 기재 합니다.



vi /usr/local/apache2.4/conf/httpd.conf

<IfModule maxminddb_module>

MaxMindDBEnable On

MaxMindDBSetNotes On

MaxMindDBFile COUNTRY_DB /usr/share/GeoIP/GeoLite2-Country.mmdb

MaxMindDBFile CITY_DB /usr/share/GeoIP/GeoLite2-City.mmdb

MaxMindDBFile ASN_DB /usr/share/GeoIP/GeoLite2-ASN.mmdb

MaxMindDBEnv COUNTRY_CODE COUNTRY_DB/country/iso_code
MaxMindDBEnv REGION_CODE  CITY_DB/subdivisions/0/iso_code

MaxMindDBEnv MM_COUNTRY_CODE CITY_DB/country/iso_code

MaxMindDBEnv MM_COUNTRY_NAME CITY_DB/country/names/en

MaxMindDBEnv MM_CITY_NAME CITY_DB/city/names/en

MaxMindDBEnv MM_LONGITUDE CITY_DB/location/longitude

MaxMindDBEnv MM_LATITUDE CITY_DB/location/latitude

MaxMindDBEnv MM_ASN ASN_DB/autonomous_system_number
MaxMindDBEnv MM_ASORG ASN_DB/autonomous_system_organization

MaxMindDBNetworkEnv COUNTRY_DB COUNTRY_NETWORK
MaxMindDBNetworkEnv CITY_DB CITY_NETWORK
MaxMindDBNetworkEnv ASN_DB ASN_DB_NETWORK

</IfModule>




# 한줄로 입력 합니다 

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{MM_COUNTRY_CODE}e" geoip



# access_log
도 수정 합니다.

CustomLog logs/access_log 
geoip





# 여기 까지 진행 후 apache 를 재기동 하게 되면 로그 상에 아래와 같이 로그의 맨 끝에 국가 코드가 같이 기록 되는걸 확인 할 수 있습니다

123.123.123.123 - - [11/Aug/2020:00:21:57 +0900] "HEAD / HTTP/1.1" 200 - "http://www.abc.co.kr" "Mozilla/5.0+(compatible; AABOT/2.0; http://www.AAA.com/)" US




# 자동 업데이트 설정

일단 여기까지 진행 하였다면 자동 업데이트까지 설정 한 후 진행 하도록 하겠습니다.




# geoipupdate 설치
wget https://github.com/maxmind/geoipupdate/releases/download/v4.3.0/geoipupdate_4.3.0_linux_amd64.tar.gz


tar zxvf geoipupdate_4.3.0_linux_amd64.tar.gz
mv geoipupdate_4.3.0_linux_amd64/ /usr/local
cd /usr/local/geoipupdate_4.3.0_linux_amd64
ln -s /usr/local/geoipupdate_4.3.0_linux_amd64/GeoIP.conf /usr/local/etc/GeoIP.conf




# GeoIP.conf 파일 수정

vi /usr/local/etc/GeoIP.conf
================================
# are available from https://www.maxmind.com/en/my_license_key.
AccountID 입력
LicenseKey 입력
# Enter the edition IDs of the databases you would like to update.
# Multiple edition IDs are separated by spaces.
EditionIDs GeoLite2-Country GeoLite2-City
# The remaining settings are OPTIONAL.
# The directory to store the database files. Defaults to /usr/local/share/GeoIP

DatabaseDirectory 경로수정 -> /usr/share/GeoIP
============================================================




# 업데이트 유틸리티 수행 방법
cd /usr/local/geoipupdate_4.3.0_linux_amd64
./geoipupdate -v




# crontab 등록
# crontab –e
* 매달 15일 오전 6시 00분에 수행되도록 등록 
### GeoIP Update
00 06 15 * * /usr/local/geoipupdate_4.3.0_linux_amd64/geoipupdate -v





# 국가별 차단 
다시 apache의 httpd.conf 파일을 수정 합니다
vi httpd.conf

virtualhost 를 사용하는 기준으로 설정내역을 설명 합니다.
<VirtualHost 123.123.123.123:80>
    ServerAdmin admin@abc.co.kr
    DocumentRoot "/source/abc"
    ServerName abc.co.kr
    ServerAlias abc.co.kr www.abc.co.kr
    ErrorLog "logs/abc.co.kr-error_log"
    CustomLog "logs/abc.co.kr-access_log" geoip
# 위에서 설정한 geoip 명칭


<Directory "/source/abc">
        AllowOverride ALL
        Options FollowSymLinks MultiViews
        DirectoryIndex index.jsp index.php index.html index.htm
## Blocking by Country CN
SetEnvIf MM_COUNTRY_CODE ^(CN) BlockCountry
## <== 위의 부분이 중국 국가 차단 설정 부분
## 예를 들어 CN, EU
국가만 차단 하고자 할때는 아래처럼 기술하면 됩니다.

##  SetEnvIf MM_COUNTRY_CODE ^(CN|EU) BlockCountry
##  SetEnvIf 는 <Directory> 나 <Location> 절 안에서 사용할 수 있습니다.

<RequireAll>
     Require all granted
Require not env BlockCountry
     Require not env bad_bot
     Require not env ipdeny
</RequireAll>
## 
Require not env 는 <RequireAll> 절 안에서 선언 해야 합니다.
</Directory>

</VirtualHost>



위와 같이 설정후 apache 재기동이나 graceful 재기동 을 하게 되면 적용이 되게 됩니다.
테스트시 SetEnvIf MM_COUNTRY_CODE ^(KR) BlockCountry  로 KR 넣고 접속 차단이 잘되는지 테스트 해보시면 됩니다.

답글 남기기