Apache 특정 국가 허용/차단 - Amazon Linux 2

Apache2에서 특정 국가만 접속을 허용하거나 차단을 할 경우
GeoIP를 연동한다. (mod_geoip)

특정 국가에서 웹서버 접속을 허용/차단하는 정책을 설정할 수 있다.
ex) 한국, 미국에서만 접속 허용, 나머지는 전부 차단
ex) 중국, 러시아에서만 접속 차단, 나머지에서 전부 허용

주의점 : GeoIP.dat 이 완벽하지 않기 때문에 일부 오류가 있을 수 있다.


환경 : Amazon Linux 2
(RHEL 계열이므로 CentOS 등에서도 적용 가능)


1. 설치

Amazon Linux 2 기본 Repository에는 GeoIP가 없다.
epel repo를 이용한다.

[yum repository 추가]
1
2
3
sudo wget ---no-parent -'epel-release-*.rpm' http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/
sudo rpm -Uvh dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-*.rpm
sudo yum-config-manager --enable epel*
cs

[EPEL repo 확인 방법]
1
sudo yum repolist all
cs


GeoIP 관련 모듈을 설치한다.
1
sudo yum install GeoIP GeoIP-devel GeoIP-data zlib-devel
cs

Apache2와 연동하기 위해, mod_geoip 모듈을 설치한다.
1
sudo yum install mod_geoip
cs


/etc/httpd/conf.d/ 에 geoip.conf 가 생겨있으면 성공


2. 설정

/etc/httpd/conf/httpd.conf 에 다음 설정을 추가한다.

[특정 국가만 허용시]
1
2
3
4
5
6
7
<Directory "/var/www/">
    SetEnvIf GEOIP_COUNTRY_CODE KR AllowIP
    SetEnvIf GEOIP_COUNTRY_CODE US AllowIP
 
      Deny from all
      Allow from env=AllowIP
</Directory>
cs

* 위 예시는 한국, 미국에서만 접속을 허용하는 설정


[특정 국가만 차단시]
1
2
3
4
5
6
7
8
9
10
11
<Directory "/var/www/">
   AllowOverride Limit
   SetEnvIf GEOIP_COUNTRY_CODE CN BanIP
   SetEnvIf GEOIP_COUNTRY_CODE RU BanIP
 
   <Limit GET POST>
       Order Allow,Deny
       Allow from all
       Deny from env=BanIP
   </Limit>
</Directory>
cs

* 위 예시는 중국, 러시아에서만 접속을 차단하는 설정


설정 완료 후 데몬을 재실행하면 된다.
1
sudo service httpd restart
cs



3. 로깅

로그 파일에 국가 코드 출력을 할 수 있다.

다음 Format을 로그 관련 설정에 추가한다.
%{GEOIP_COUNTRY_CODE}e

(예시)
기존 로그 포맷이 다음과 같다면
LogFormat "%h %l %u %t \"%r\" %>s %b"

이렇게 추가하면 된다
LogFormat "%h %l %u %t \"%r\" %>s %b %{GEOIP_COUNTRY_CODE}e"
혹은
LogFormat "%h %{GEOIP_COUNTRY_CODE}e %l %u %t \"%r\" %>s %b"

실제 로깅이 남는 모습



4. 테스트 & 기타 팁

자신이 설정한 정책에 맞는지 안맞는지는 직접 테스트 해보면 된다. (웹페이지 접속)

필자의 예시) 한국에서만 접속 허용
미국에서 HTTP 조회를 한 MXToolbox(https://mxtoolbox.com/SuperTool.aspx) 에서는
403이 확인되지만,

동시에 한국에 있는 필자의 PC에서 접속 시도를 하면
정상적으로 200을 반환하는 것을 확인할 수 있다.


* GeoIP Database는 완벽하지 않다. 일부 오차가 있을 수 있다.
만일 업데이트가 필요하면 이 링크에서 GeoIP.dat을 업데이트 한다.
https://dev.maxmind.com/geoip/geoip2/

/usr/share/GeoIP/ 폴더를 업데이트 하면 된다.
(정확한 위치는 /etc/httpd/conf.d/geoip.conf 에서 확인)


* 원하는 국가 코드표는 ISO 3166을 따라서 추가
https://dev.maxmind.com/geoip/legacy/codes/iso3166/

댓글