특정 국가에서의 접속 제어
안녕 리눅스는 1.0 부터 IP 기반의 Geo data를 기본으로 제공하고 있습니다.
oops-firewall에서 국가 기반의 filtering을 하기 위해서는 kmod-geoip가 설치되어 있어야 하고, Netfilter용 GeoIP database를 생성해야 합니다. (kmod-geoip 설치시에 post script 작업으로 2~3분 정도 설치 중 먹통이 된 것 같은 느낌이 나니, 인내하시기 바랍니다.)
안녕 리눅스에서는 이 작업을 간편하게 하기 위하여 geoip-csv2bin 이라는 실행 명령을 제공합니다.
주의!! GeoIP database를 배포하는 Maxmind의 경우, 연속해서 2번 이상의 다운로드를 시도하면 하루 동안 IP를 block 시켜 버립니다. 그렇기 때문에 여러 대에서 GeoIP database를 사용한다면 각 서버에서 다운로드를 받지 말고, 한 대의 서버에서 다운로드를 받은 후에, 사용할 서버들로 배포하는 정책을 취하시기 바랍니다. 안 그러면 금방 block 되어 버려 업데이트가 불가능해 집니다.
Maxmind의 Geo lite(free) database는 한달에 1회 갱신 되며, 보통 4~8일 사이에 업데이트가 됩니다. 그러므로 cronjob에 8~10일 사이에 1회 업데이트 되도록 설정해 주시면 됩니다.
1
[[email protected] ~]$ yum -y install kmod-geoip
2
[[email protected] ~]$ cd /usr/share/GeoIP
3
[[email protected] GeoIP]$ /usr/bin/geoip-csv2bin
4
Get GeoLiteCountry/GeoIP.dat.gz .. OK
5
Uncompressd GeoIP.dat.gz .. OK
6
Copying GeoIP.dat .. OK
7
Get GeoLiteCity.dat.gz .. OK
8
Uncompressd GeoLiteCity.dat.gz .. OK
9
Copying GeoLiteCity.dat .. OK
10
Get GeoIPCountryCSV.zip .. OK
11
Uncompressd GeoIPCountryCSV.zip .. OK
12
Copying GeoIPCountryWhois.csv .. OK
13
Get GeoIPv6.csv.gz .. OK
14
Uncompressd GeoIPv6.csv.gz .. OK
15
Copying GeoIPv6.csv .. OK
16
Get GeoIPv6.dat.gz .. OK
17
Uncompressd GeoIPv6.dat.gz .. OK
18
Copying GeoIPv6.dat .. OK
19
Get asnum/GeoIPASNum.dat.gz .. OK
20
Uncompressd GeoIPASNum.dat.gz .. OK
21
Copying GeoIPASNum.dat .. OK
22
Get asnum/GeoIPASNumv6.dat.gz .. OK
23
Uncompressd GeoIPASNumv6.dat.gz .. OK
24
Copying GeoIPASNumv6.dat .. OK
25
139987 entries total
26
0 IPv6 ranges for A1 Anonymous Proxy
27
91 IPv4 ranges for A1 Anonymous Proxy
28
0 IPv6 ranges for A2 Satellite Provider
29
329 IPv4 ranges for A2 Satellite Provider
30
9 IPv6 ranges for MW Malawi
31
** 중략 **
32
136 IPv6 ranges for ZA South Africa
33
667 IPv4 ranges for ZA South Africa
34
11 IPv6 ranges for ZM Zambia
35
64 IPv4 ranges for ZM Zambia
36
10 IPv6 ranges for ZW Zimbabwe
37
58 IPv4 ranges for ZW Zimbabwe
38
39
합계 47300
40
drwxr-xr-x 2 root root 12288 123 17:23 BE/
41
-rw-r--r-- 1 root root 825130 129 19:37 GeoIP-initial.dat
42
-rw-r--r-- 1 root root 835223 218 19:53 GeoIP.dat
43
-rw-r--r-- 1 root root 4079692 218 19:53 GeoIPASNum.dat
44
-rw-r--r-- 1 root root 4914518 218 19:53 GeoIPASNumv6.dat
45
-rw-r--r-- 1 root root 8505106 22 22:40 GeoIPCountryWhois.csv
46
-rw-r--r-- 1 root root 4182797 218 19:53 GeoIPv6.csv
47
-rw-r--r-- 1 root root 1567099 218 19:53 GeoIPv6.dat
48
-rw-r--r-- 1 root root 19136630 218 19:53 GeoLiteCity.dat
49
drwxr-xr-x 2 root root 12288 129 18:06 LE/
50
-rwxr-xr-x 1 root root 13897 129 19:37 csv2bin
51
-rw-r--r-- 1 root root 1046148 218 19:53 geoipdb.bin
52
-rw-r--r-- 1 root root 1470 218 19:53 geoipdb.idx
Copied!
geoip-csv2bin 명령을 실행을 하면 다음의 작업을 하게 됩니다.
  1. 1.
    GeoIP database 갱신
    1
    * GeoIP.dat - IPv4 Country database
    2
    * GeoIPASNum.dat - IPv4 Network AS Number database
    3
    * GeoIPASNumv6.dat - IPv6 Network AS Number database
    4
    * GeoIPv6.dat - IPv6 Country database
    5
    * GeoLiteCity.dat - IPv4 City database (한국 환경에서는 매우 부정확함)
    6
    * GeoIPCountryWhois.csv - IPv4 Country database CVS format
    7
    * GeoIPv6.csv - IPv6 Country database CVS format
    Copied!
  2. 2.
    GeoIPCountryWhois.csv 와 GeoIPv6.csv를 이용하여 netfilter용 database 생성
    1
    * /usr/share/GeoIP/BE/ - Big endian을 사용하는 cpu용
    2
    * /usr/share/GeoIP/LE/ - intel machine용
    Copied!
  3. 3.
    GeoIPCountryWhois.csv 와 GeoIPv6.csv를 이용하여 netfilter용 이전 database 생성
    1
    * 안녕 리눅스 1/2 에서 사용하는 format
    2
    * geoipdb.bin
    3
    * geoipdb.idx
    Copied!
GeoIP database가 준비 되었다면, /etc/oops-firewall/user.conf 에서 다음의 rule을 이용하여 관리할 수 있습니다.
1
# Rusia로 부터의 접근을 모두 막는다.
2
%-A INPUT -m geoip --src-cc RU -j DROP
3
4
# 한국을 제외하고 ssh 연결을 모두 막는다.
5
%-A INPUT -p tcp --dport 22 -m geoip ! --src-cc KR -j DROP
Copied!
다음, geoip database 업데이트를 Cronjob에 등록해 줍니다.
1
[[email protected] ~] cat /etc/cron.d/geoip-update
2
# GeoIP database update cronjob
3
#
4
# GeoIP Lite/Free database는 매월 4~7일 사이에 업데이트가 됩니다.
5
# 그러므로, 한국 시간으로 8~10 사이에 업데이트를 등록해 놓으면 됩니다.
6
#
7
# 여러대에서 동시에 업데이트를 하면 block이 되니 여러대를 관리할 경우
8
# 한대에서 다운로드 받은 다음, 다른 서버로 배포하는 정책으로 운영하세요.
9
#
10
# Example of job definition:
11
# .---------------- minute (0 - 59)
12
# | .------------- hour (0 - 23)
13
# | | .---------- day of month (1 - 31)
14
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
15
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
16
# | | | | |
17
# * * * * * user-name command to be executed
18
19
# 매월 11일 새벽 3시 14분에 실행
20
14 3 11 * * root /usr/bin/geoip-csv2bin &> /dev/null
Copied!
Last modified 2yr ago
Copy link