Apache 특정 국가 허용/차단 - Amazon Linux 2
Apache2에서 특정 국가만 접속을 허용하거나 차단을 할 경우
GeoIP를 연동한다. (mod_geoip)
특정 국가에서 웹서버 접속을 허용/차단하는 정책을 설정할 수 있다.
ex) 한국, 미국에서만 접속 허용, 나머지는 전부 차단
ex) 중국, 러시아에서만 접속 차단, 나머지에서 전부 허용
주의점 : GeoIP.dat 이 완벽하지 않기 때문에 일부 오류가 있을 수 있다.
환경 : Amazon Linux 2
(RHEL 계열이므로 CentOS 등에서도 적용 가능)
epel repo를 이용한다.
[yum repository 추가]
[EPEL repo 확인 방법]
GeoIP 관련 모듈을 설치한다.
Apache2와 연동하기 위해, mod_geoip 모듈을 설치한다.
/etc/httpd/conf.d/ 에 geoip.conf 가 생겨있으면 성공
[특정 국가만 허용시]
다음 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"
실제 로깅이 남는 모습
필자의 예시) 한국에서만 접속 허용
미국에서 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/
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 -r --no-parent -A '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/
댓글
댓글 쓰기