기존에 apache 2.4 버전에서 국가 CODE 출력 또는 접속 제어를 할때는 GeoIP를 사용했는데
다른 방식 maxmindb를 사용해서 코드 출력 ,접속 제어를 할 수 있다
해당 O/S 는 Rocky 버전이다
|
[root@jin-rocky8 ~]# cat /etc/redhat-release Rocky Linux release 8.10 (Green Obsidian) |
1. epel 저장소 추가해주고 관련 패키지를 설치해준다 ( httpd 서버가 컴파일 방식이 아닌 yum 패키지 설치 기준이다)
|
[root@jin-rocky8 ~]# yum -y install epel-release [root@jin-rocky8 ~]# yum -y install httpd httpd-devel gcc cmake make git libmaxminddb libmaxminddb-devel redhat-rpm-config |
2. mod_maxmindb 다운로드 및 apache에 모듈 추가 (만약 httpd가 comfile 되어 있다면 apxs를 경로에 맞게 수정하면됨)
|
[root@jin-rocky8 ~]# wget https://github.com/maxmind/mod_maxminddb/releases/download/1.2.0/mod_maxminddb-1.2.0.tar.gz [root@jin-rocky8 ~]# tar xvfz mod_maxminddb-1.2.0.tar.gz [root@jin-rocky8 ~]# cd mod_maxminddb-1.2.0 [root@jin-rocky8 mod_maxminddb-1.2.0]# ./configure --with-apxs=/bin/apxs [root@jin-rocky8 mod_maxminddb-1.2.0]# make && make install |
3. 정상적으로 설치가 진행이 되었다면 파일 확인
|
[root@jin-rocky8 mod_maxminddb-1.2.0]# ll /etc/httpd/modules/mod_maxminddb.so -rwxr-xr-x 1 root root 71184 Mar 14 08:56 /etc/httpd/modules/mod_maxminddb.so |
4. 환경 설정추가
|
[root@jin-rocky8 ~]# vi /etc/httpd/conf.modules.d/00-maxmindb.conf LoadModule maxminddb_module modules/mod_maxminddb.so |
5. /usr/share/GeoIP 폴더로 이동 없으면 생성 / 기존 파일 삭제 후 다운로드
|
### 폴더 이동 후 [root@jin-rocky8 ~]# cd /usr/share/GeoIP/ 파일 삭제 후 다운로드 [root@jin-rocky8 GeoIP]# wget xinet.kr/data/geoip/GeoLite2-Country.mmdb [root@jin-rocky8 GeoIP]# wget xinet.kr/data/geoip/GeoLite2-City.mmdb |
6. 이제 국가코드가 로그에 출력되게 httpd.conf 수정
|
[root@jin-rocky8 ~]# vi /etc/httpd/conf/httpd.conf ###젤하단에 MaxMindDBEnable On MaxMindDBFile CITY_DB /usr/share/GeoIP/GeoLite2-City.mmdb MaxMindDBFile COUNTRY_DB /usr/share/GeoIP/GeoLite2-Country.mmdb MaxMindDBEnv MM_CONTINENT_CODE COUNTRY_DB/continent/code MaxMindDBEnv MM_CONTINENT_NAME COUNTRY_DB/continent/names/en MaxMindDBEnv MM_COUNTRY_CODE COUNTRY_DB/country/iso_code MaxMindDBEnv MM_COUNTRY_NAME COUNTRY_DB/country/names/en ### 로그포맷수정 LogFormat "%h \"%{Host}i\" %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" TLSv=%{SSL_PROTOCOL}x %{MM_COUNTRY_CODE}e" combined |
7.웹서버 재시작
|
[root@jin-rocky8 ~]# systemctl restart httpd |
8. 로그확인
|
168.126.33.23 "www6.xinet.kr" - - [14/Mar/2025:09:04:21 +0000] "GET / HTTP/1.1" 304 3958 "-" \ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \ Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0" TLSv=TLSv1.3 KR 15.235.51.187 "www6.xinet.kr" - - [14/Mar/2025:09:04:36 +0000] "GET / HTTP/1.1" 200 286 "-" \ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \ Chrome/131.0.0.0 Safari/537.36" TLSv=- CA 15.235.51.187 "www6.xinet.kr" - - [14/Mar/2025:09:04:36 +0000] "GET / HTTP/1.1" 200 286 "-" \ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \ Chrome/131.0.0.0 Safari/537.36" TLSv=- CA |
9. 전역설정으로 모든 사이트에 해당 되는 국가 차단 방법
|
[root@jin-rocky8 ~]# vi /etc/httpd/conf/httpd.conf ### 전역설정 및 해당 국가 차단 (FR ,CN 국가 차단) <Location /> SetEnvIf MM_COUNTRY_CODE ^(FR|CN) BlockCountry Deny from env=BlockCountry </Location> |
10. 구문에러 확인 및 정사이면 재시작
|
[root@jin-rocky8 ~]# apachectl -t Syntax OK [root@jin-rocky8 ~]# systemctl restart httpd |
11. 로그확인 ( 정상 접속이코 코드값이 200 / 차단이면 403 코드값이 표시)
|
### 허용 68.235.44.20 "www6.xinet.kr" - - [14/Mar/2025:09:06:51 +0000] "GET / HTTP/1.1" 200 286 "-" \ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \ Chrome/131.0.0.0 Safari/537.36" TLSv=- US ### 차단 37.59.18.215 "www6.xinet.kr" - - [14/Mar/2025:09:07:09 +0000] "GET / HTTP/1.1" 403 499 "-" \ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \ Chrome/131.0.0.0 Safari/537.36" TLSv=- FR |
12. 이제 한국kr만 허용할 경우 /나머지 국가 차단
|
[root@jin-rocky8 ~]# vi /etc/httpd/conf/httpd.conf ### 전역설정 KR만 접속허용 <Location /> SetEnvIf MM_COUNTRY_CODE ^KR$ AllowCountry Require env AllowCountry </Location> |
구문에러 확인 및 정상이면 웹서버 재시작
|
[root@jin-rocky8 ~]# apachectl -t Syntax OK [root@jin-rocky8 ~]# systemctl restart httpd |
로그확인 해외에서 접속되는것 다 차단된것을 확인할수 있다 (403 CODE)
|
15.235.51.187 "www6.xinet.kr" - - [14/Mar/2025:09:09:14 +0000] "GET / HTTP/1.1" 403 499 "-" \ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \ Chrome/131.0.0.0 Safari/537.36" TLSv=- CA 68.235.44.20 "www6.xinet.kr" - - [14/Mar/2025:09:09:19 +0000] "GET / HTTP/1.1" 403 499 "-" \ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \ Chrome/131.0.0.0 Safari/537.36" TLSv=- US 37.59.18.215 "www6.xinet.kr" - - [14/Mar/2025:09:09:25 +0000] "GET / HTTP/1.1" 403 499 "-" \ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \ Chrome/131.0.0.0 Safari/537.36" TLSv=- FR |
만약 특정 도메인만 적용하려면 도메인 vhost 파일에 내용을 설정
|
[root@jin-rocky8 ~]# vi /etc/httpd/conf.d/ssl.conf <VirtualHost *:443> DocumentRoot /home/www6/html ServerName www6.xinet.kr CustomLog logs/access_log combined SSLCertificateFile /etc/letsencrypt/live/www6.xinet.kr/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/www6.xinet.kr/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/www6.xinet.kr/chain.pem ### KR만 접속허용 <Location /home/www6/html> SetEnvIf MM_COUNTRY_CODE ^KR$ AllowCountry Require env AllowCountry </Location> </VirtualHost> |