iptables와 ipset을 이용하여 한국 IP만 허용

ipset을 이용하면 많은 IP들을 효율적으로 iptables로 관리할 수 있다. 한국 IP의 block 수가 많기 때문에 일일이 iptables에 밀어넣는것 보다는 ipset으로 목록을 관리하는것이 좋다.

ipset으로 KRNIC IP 목록 추가

KRNIC에서 제공하는 국내 IP 목록을 다운로드 한다 (https://한국인터넷정보센터.한국/jsp/statboard/IPAS/inter/sec/currentV4Addr.jsp)

KRNIC의 IP 목록 제공 페이지

KRNIC는 /24 블록의 갯수로 IP 대역을 표현한다. csv 다운로드 를 통해서 목록을 다운받으면 된다. ipset은 CIDR로 IP 범위를 설정하므로 우리는 CIDR 블록 목록이 필요하다. /24 블록으로 제공된 목록을 CIDR로 가공 해야한다.

import ipaddress
import sys

csv_file = open(sys.argv[1], mode='r', encoding='utf-8')
ip_str = csv_file.read()
csv_file.close()


## IP 주소 Merge를 위해서 이전 IP 주소를 저장
block_ip_start = None
block_ip_end = None
def generate_ip_cidr(ip_start, ip_end):
    if ip_start == None or ip_end == None:
        return []
    
    while ip_start <= ip_end:
        for i in range(32, -1, -1):
            block_shift = (1 << i)
            bitmask = ((1 << 32) - 1) - (block_shift - 1)

            if ip_start & bitmask < ip_start:
                # print(ipaddress.ip_address(ip_start), ipaddress.ip_address(ip_start & ((2 ^ 32 - 1) - (1 << i - 1))))
                continue
            
            if ip_start + block_shift - 1 > ip_end:
                # 아직 IP Block 만큼 뺄 수 없으면 패스 
                # (/24 블록인데 /23 블록만큼 뺄 수가 없음)
                continue
            
            # 첫번째 Subnet 크기 = 가장 큰 Subnet 크기임
            yield str(ipaddress.ip_address(ip_start)) + '/' + str(32 - i)
            ip_start += block_shift

            break
    
    return []

def is_continuose_ip(ip_start, ip_end):
    if ip_start == None or ip_end == None:
        return False
    
    if ip_end == ip_start - 1:
        return True
    
    return False

def line_to_ip_int(line):
    ip_start, ip_end, *rest = line.split('\t')
    ip_start = int(ipaddress.ip_address(ip_start))
    ip_end = int(ipaddress.ip_address(ip_end))
    return ip_start, ip_end

result = []
for (ip_start, ip_end) in sorted(map(line_to_ip_int, filter(lambda line: line.strip() != '', ip_str.split('\n')[1:]))):
    if block_ip_start == None:
        block_ip_start = ip_start
        block_ip_end = ip_end

        continue
    
    if is_continuose_ip(ip_start, block_ip_end):
        block_ip_end = ip_end

    else:
        result.extend(generate_ip_cidr(block_ip_start, block_ip_end))
        block_ip_start = ip_start
        block_ip_end = ip_end

result.extend(generate_ip_cidr(block_ip_start, block_ip_end))
for ip in result:
    print(ip)

위 파이썬 코드를 csv 파일과 함께 아래 처럼 실행하면 된다. csv 파일만 정확히 지정 해주면 된다.

python3 ipblock.py "국내 IPv4주소 목록_(2024.03.23).csv" > ips.txt

파이썬을 실행하면 아래와 같이 IP 목록이 나온다. 2024년 3월 23일 기준으로 추출한 ip 목록은 다음과 같다. 글이 쓰인지 너무 오래되지만 않았으면 아래의 목록을 그대로 사용해도 문제 없을 것이다.

IP 목록 (922줄)
1.11.0.0/16
1.16.0.0/14
1.96.0.0/12
1.176.0.0/15
1.201.0.0/16
1.208.0.0/12
1.224.0.0/11
14.0.32.0/19
14.0.64.0/18
14.4.0.0/14
14.32.0.0/11
14.64.0.0/11
14.128.128.0/17
14.129.0.0/16
14.138.0.0/16
14.192.80.0/20
14.206.0.0/16
27.0.236.0/22
27.1.0.0/16
27.35.0.0/16
27.96.128.0/18
27.100.128.0/17
27.101.0.0/16
27.102.0.0/16
27.111.96.0/19
27.112.128.0/17
27.113.0.0/17
27.115.128.0/17
27.116.64.0/18
27.116.128.0/17
27.117.0.0/16
27.118.64.0/18
27.118.128.0/17
27.119.0.0/16
27.120.0.0/18
27.122.128.0/17
27.124.128.0/17
27.125.0.0/17
27.126.0.0/18
27.160.0.0/12
27.176.0.0/13
27.232.0.0/13
27.255.64.0/18
36.38.0.0/15
39.4.0.0/14
39.16.0.0/12
39.112.0.0/12
42.8.0.0/13
42.16.0.0/12
42.32.0.0/12
42.82.0.0/16
43.224.104.0/22
43.227.116.0/22
43.227.120.0/22
43.228.160.0/22
43.230.0.0/22
43.230.76.0/22
43.230.80.0/22
43.230.216.0/22
43.241.104.0/21
43.242.112.0/22
43.243.216.0/22
43.246.152.0/22
43.247.104.0/22
43.247.192.0/22
43.250.152.0/22
43.251.120.0/22
43.254.244.0/22
43.255.248.0/21
45.64.140.0/22
45.64.144.0/22
45.64.152.0/22
45.64.172.0/22
45.112.88.0/21
45.112.96.0/20
45.112.112.0/21
45.112.152.0/21
45.112.160.0/21
45.112.168.0/22
45.113.44.0/22
45.113.48.0/22
45.115.152.0/22
45.117.12.0/22
45.119.144.0/22
45.120.64.0/21
45.121.164.0/22
45.125.232.0/22
45.248.72.0/22
45.249.64.0/22
45.249.160.0/22
45.250.204.0/22
45.250.208.0/22
45.250.220.0/22
49.1.0.0/16
49.8.0.0/14
49.16.0.0/12
49.50.0.0/22
49.50.16.0/20
49.50.32.0/19
49.50.128.0/18
49.56.0.0/13
49.128.192.0/19
49.142.0.0/16
49.143.0.0/17
49.143.128.0/18
49.143.192.0/19
49.160.0.0/12
49.236.64.0/18
49.236.128.0/18
49.238.64.0/18
49.238.128.0/17
49.239.128.0/18
49.246.0.0/17
49.247.0.0/16
49.254.0.0/16
58.29.0.0/16
58.65.64.0/18
58.72.0.0/13
58.84.44.0/22
58.87.32.0/19
58.102.0.0/15
58.120.0.0/13
58.138.192.0/18
58.140.0.0/14
58.145.0.0/17
58.146.192.0/18
58.147.176.0/21
58.148.0.0/14
58.180.0.0/16
58.181.0.0/18
58.184.0.0/16
58.224.0.0/12
59.0.0.0/11
59.86.192.0/18
59.150.0.0/16
59.151.192.0/18
59.152.128.0/18
59.186.0.0/15
60.196.0.0/15
60.253.0.0/18
60.253.64.0/19
61.4.192.0/18
61.5.160.0/19
61.14.208.0/22
61.32.0.0/13
61.40.0.0/14
61.47.192.0/18
61.72.0.0/13
61.80.0.0/14
61.84.0.0/15
61.96.0.0/12
61.245.176.0/20
61.245.224.0/19
61.247.64.0/18
61.247.128.0/19
61.247.192.0/19
61.248.0.0/13
101.1.8.0/21
101.1.32.0/19
101.53.64.0/19
101.55.0.0/17
101.79.0.0/16
101.101.128.0/17
101.202.0.0/16
101.235.0.0/16
101.250.0.0/16
103.2.76.0/22
103.2.84.0/22
103.2.92.0/22
103.3.36.0/22
103.4.48.0/22
103.4.148.0/22
103.4.176.0/21
103.5.128.0/22
103.5.144.0/22
103.6.72.0/22
103.6.80.0/22
103.6.100.0/22
103.6.172.0/22
103.7.32.0/22
103.7.190.0/23
103.7.244.0/22
103.8.100.0/22
103.8.230.0/24
103.9.32.0/22
103.9.128.0/22
103.10.92.0/22
103.10.216.0/22
103.11.24.0/22
103.11.44.0/22
103.11.56.0/22
103.11.128.0/22
103.11.248.0/22
103.12.248.0/21
103.13.52.0/22
103.13.160.0/22
103.19.124.0/22
103.20.116.0/22
103.21.188.0/22
103.21.200.0/22
103.22.220.0/22
103.23.80.0/21
103.24.8.0/22
103.25.16.0/22
103.27.128.0/22
103.27.148.0/22
103.28.60.0/22
103.28.64.0/22
103.30.108.0/22
103.30.160.0/22
103.30.204.0/22
103.31.180.0/22
103.38.24.0/22
103.39.36.0/22
103.42.60.0/23
103.42.184.0/22
103.43.64.0/24
103.43.120.0/22
103.49.44.0/22
103.50.40.0/22
103.51.168.0/21
103.51.176.0/22
103.51.184.0/21
103.51.192.0/21
103.51.200.0/22
103.51.240.0/20
103.52.200.0/22
103.53.114.0/24
103.55.35.0/24
103.55.188.0/22
103.57.60.0/22
103.59.156.0/22
103.60.120.0/21
103.62.228.0/22
103.66.188.0/22
103.66.192.0/22
103.67.58.0/23
103.68.96.0/22
103.68.148.0/22
103.68.152.0/22
103.71.4.0/23
103.74.0.0/22
103.77.84.0/22
103.79.132.0/22
103.85.80.0/22
103.87.116.0/22
103.90.209.0/24
103.90.244.0/22
103.104.86.0/24
103.105.156.0/22
103.105.160.0/22
103.106.140.0/22
103.109.64.0/22
103.114.62.0/24
103.114.124.0/22
103.117.0.0/22
103.122.144.0/23
103.122.184.0/22
103.124.100.0/22
103.125.108.0/22
103.126.64.0/22
103.126.234.0/23
103.127.212.0/22
103.129.184.0/22
103.132.32.0/21
103.138.228.0/23
103.139.84.0/23
103.139.118.0/23
103.139.214.0/23
103.139.216.0/23
103.140.12.0/23
103.141.18.0/23
103.141.190.0/23
103.143.78.0/23
103.143.176.0/23
103.144.30.0/23
103.145.214.0/23
103.146.180.0/23
103.150.62.0/23
103.150.160.0/24
103.150.162.0/23
103.150.204.0/23
103.153.44.0/23
103.157.158.0/23
103.157.208.0/23
103.159.160.0/23
103.161.4.0/23
103.162.52.0/23
103.162.180.0/23
103.164.78.0/23
103.166.222.0/23
103.175.200.0/23
103.178.80.0/23
103.182.126.0/23
103.182.250.0/23
103.186.170.0/23
103.187.34.0/23
103.187.108.0/23
103.188.89.0/24
103.194.108.0/22
103.194.252.0/22
103.206.74.0/23
103.212.124.0/22
103.212.244.0/22
103.212.248.0/22
103.214.24.0/22
103.214.88.0/22
103.215.144.0/22
103.216.202.0/23
103.218.156.0/22
103.218.160.0/22
103.219.124.0/22
103.219.128.0/22
103.226.72.0/21
103.226.96.0/22
103.229.156.0/22
103.230.112.0/22
103.231.128.0/22
103.234.4.0/22
103.235.24.0/22
103.237.20.0/22
103.238.248.0/22
103.239.112.0/22
103.239.236.0/22
103.239.240.0/22
103.240.28.0/22
103.240.48.0/22
103.243.200.0/22
103.244.40.0/22
103.244.108.0/22
103.246.56.0/22
103.246.172.0/22
103.246.236.0/22
103.247.220.0/22
103.247.232.0/22
103.248.104.0/22
103.249.28.0/22
103.251.104.0/22
103.253.240.0/22
103.254.248.0/22
106.10.0.0/17
106.96.0.0/13
106.240.0.0/12
110.4.64.0/18
110.5.128.0/17
110.8.0.0/13
110.34.64.0/18
110.35.0.0/18
110.35.96.0/19
110.35.128.0/17
110.44.32.0/19
110.44.192.0/18
110.45.0.0/16
110.46.0.0/15
110.68.0.0/14
110.76.64.0/18
110.76.140.0/22
110.92.20.0/22
110.92.128.0/17
110.93.24.0/21
110.93.112.0/20
110.93.128.0/18
110.165.0.0/19
110.165.64.0/18
110.172.64.0/18
110.232.96.0/20
111.65.128.0/18
111.67.208.0/20
111.67.224.0/19
111.91.128.0/18
111.92.188.0/22
111.118.0.0/17
111.171.0.0/17
111.218.0.0/15
111.221.32.0/21
112.72.16.0/20
112.72.32.0/19
112.72.128.0/17
112.76.0.0/15
112.106.0.0/15
112.108.0.0/16
112.109.32.0/19
112.121.0.0/19
112.121.192.0/18
112.133.0.0/17
112.133.128.0/18
112.136.128.0/17
112.137.176.0/21
112.140.64.0/18
112.140.144.0/20
112.140.192.0/18
112.144.0.0/12
112.160.0.0/11
112.196.192.0/19
112.212.0.0/16
112.213.0.0/19
112.214.0.0/16
112.216.0.0/13
113.10.0.0/18
113.21.0.0/19
113.29.128.0/18
113.29.192.0/20
113.30.0.0/17
113.52.136.0/21
113.52.192.0/19
113.59.128.0/18
113.60.0.0/16
113.61.0.0/19
113.61.104.0/22
113.130.64.0/19
113.130.128.0/17
113.131.0.0/16
113.192.64.0/18
113.197.80.0/20
113.198.0.0/16
113.199.0.0/17
113.216.0.0/15
114.29.0.0/17
114.29.128.0/18
114.30.0.0/19
114.30.48.0/20
114.30.128.0/17
114.31.32.0/19
114.31.112.0/20
114.52.0.0/15
114.70.0.0/15
114.108.0.0/17
114.108.128.0/18
114.110.24.0/21
114.110.128.0/17
114.111.32.0/19
114.111.192.0/18
114.129.64.0/18
114.129.192.0/18
114.141.0.0/19
114.141.40.0/21
114.141.224.0/19
114.199.0.0/18
114.199.128.0/17
114.200.0.0/13
115.0.0.0/12
115.16.0.0/13
115.31.96.0/19
115.40.0.0/15
115.68.0.0/16
115.69.96.0/19
115.71.0.0/16
115.84.160.0/21
115.85.160.0/19
115.86.0.0/16
115.88.0.0/13
115.126.192.0/18
115.136.0.0/13
115.144.0.0/15
115.160.0.0/17
115.161.0.0/16
115.165.176.0/21
115.178.32.0/20
115.178.64.0/19
115.187.20.0/23
115.187.80.0/21
116.32.0.0/12
116.67.0.0/17
116.68.32.0/19
116.68.232.0/21
116.84.0.0/16
116.89.160.0/19
116.90.216.0/21
116.93.160.0/19
116.93.192.0/18
116.120.0.0/13
116.193.80.0/20
116.199.160.0/21
116.200.0.0/15
116.212.0.0/19
116.255.64.0/18
117.16.0.0/15
117.20.80.0/20
117.20.192.0/18
117.52.0.0/16
117.53.64.0/18
117.53.192.0/18
117.55.128.0/18
117.58.128.0/20
117.110.0.0/15
117.123.0.0/16
118.32.0.0/11
118.67.128.0/18
118.91.0.0/17
118.91.144.0/20
118.103.192.0/19
118.107.160.0/20
118.127.192.0/18
118.128.0.0/14
118.139.192.0/18
118.176.0.0/16
118.216.0.0/13
118.234.0.0/15
119.17.0.0/19
119.17.64.0/18
119.18.64.0/18
119.30.128.0/18
119.31.240.0/20
119.42.160.0/19
119.56.128.0/17
119.59.0.0/18
119.63.224.0/19
119.64.0.0/13
119.75.64.0/18
119.75.128.0/18
119.77.96.0/19
119.82.32.0/19
119.148.112.0/20
119.148.128.0/19
119.149.0.0/16
119.161.0.0/19
119.192.0.0/11
119.235.192.0/20
119.235.240.0/21
120.29.128.0/20
120.50.64.0/18
120.50.128.0/19
120.73.0.0/16
120.136.64.0/18
120.142.0.0/16
120.143.160.0/19
120.143.192.0/18
121.0.64.0/18
121.0.128.0/17
121.1.64.0/18
121.50.16.0/20
121.50.64.0/18
121.50.224.0/19
121.53.0.0/16
121.54.192.0/18
121.55.64.0/18
121.55.128.0/18
121.64.0.0/14
121.78.0.0/16
121.88.0.0/16
121.100.64.0/18
121.101.192.0/20
121.101.224.0/19
121.124.0.0/15
121.126.0.0/16
121.127.64.0/18
121.127.128.0/18
121.128.0.0/10
121.200.64.0/18
121.252.0.0/15
121.254.0.0/18
121.254.128.0/17
122.0.8.0/21
122.0.32.0/19
122.32.0.0/12
122.49.64.0/18
122.99.128.0/17
122.100.32.0/19
122.101.0.0/16
122.128.32.0/19
122.128.64.0/20
122.128.128.0/17
122.129.208.0/21
122.129.240.0/20
122.152.96.0/19
122.153.0.0/16
122.199.64.0/18
122.199.128.0/17
122.202.32.0/19
122.202.128.0/17
122.203.0.0/16
122.252.64.0/18
122.252.192.0/19
122.254.128.0/17
123.0.0.0/20
123.32.0.0/12
123.98.160.0/19
123.98.192.0/19
123.99.64.0/18
123.100.160.0/19
123.108.16.0/20
123.108.160.0/19
123.109.0.0/16
123.111.0.0/16
123.140.0.0/14
123.199.0.0/17
123.200.64.0/18
123.212.0.0/14
123.228.0.0/15
123.248.0.0/16
123.250.0.0/15
123.253.172.0/22
123.254.64.0/19
123.254.128.0/17
124.0.0.0/14
124.5.0.0/16
124.28.0.0/17
124.28.128.0/18
124.46.0.0/16
124.48.0.0/12
124.66.176.0/20
124.66.208.0/20
124.80.0.0/16
124.111.0.0/16
124.136.0.0/14
124.146.0.0/18
124.153.128.0/17
124.194.0.0/16
124.195.160.0/19
124.195.224.0/19
124.197.128.0/18
124.197.192.0/19
124.198.0.0/17
124.199.0.0/18
124.199.128.0/17
124.216.0.0/16
124.217.192.0/19
124.243.0.0/17
124.254.128.0/17
125.7.128.0/17
125.31.128.0/18
125.57.0.0/16
125.60.0.0/17
125.61.0.0/17
125.62.216.0/21
125.128.0.0/11
125.176.0.0/12
125.208.64.0/18
125.208.192.0/18
125.209.0.0/18
125.209.192.0/18
125.240.0.0/13
125.248.0.0/14
125.252.0.0/18
128.134.0.0/16
129.254.0.0/16
134.75.0.0/16
137.68.0.0/16
139.5.224.0/22
139.150.0.0/16
141.223.0.0/16
143.248.0.0/16
144.48.40.0/21
144.48.92.0/22
144.48.100.0/22
147.6.0.0/16
147.43.0.0/16
147.46.0.0/15
150.107.68.0/22
150.107.80.0/21
150.129.224.0/22
150.150.0.0/16
150.183.0.0/16
150.197.0.0/16
150.242.132.0/22
150.242.144.0/22
152.99.0.0/16
152.149.0.0/16
154.10.0.0/16
155.230.0.0/16
156.147.0.0/16
157.119.32.0/21
157.197.0.0/16
158.44.0.0/16
160.202.172.0/22
160.202.176.0/22
161.122.0.0/16
163.53.156.0/22
163.152.0.0/16
163.180.0.0/16
163.213.0.0/16
163.222.0.0/16
163.229.0.0/16
163.239.0.0/16
163.255.0.0/16
164.124.0.0/15
165.132.0.0/15
165.141.0.0/16
165.186.0.0/16
165.194.0.0/16
165.213.0.0/16
165.229.0.0/16
165.243.0.0/16
165.244.0.0/16
165.246.0.0/16
166.79.0.0/16
166.103.0.0/16
166.104.0.0/16
166.125.0.0/16
168.78.0.0/16
168.115.0.0/16
168.126.0.0/16
168.131.0.0/16
168.154.0.0/16
168.188.0.0/16
168.219.0.0/16
168.248.0.0/15
169.140.0.0/16
169.208.0.0/12
175.28.32.0/20
175.41.0.0/20
175.45.160.0/21
175.45.192.0/18
175.106.64.0/18
175.107.64.0/18
175.111.16.0/20
175.112.0.0/12
175.158.0.0/19
175.176.128.0/20
175.192.0.0/10
180.64.0.0/13
180.80.0.0/14
180.92.64.0/18
180.92.240.0/20
180.94.4.0/24
180.131.0.0/18
180.132.0.0/14
180.148.180.0/22
180.150.192.0/19
180.150.224.0/21
180.182.0.0/16
180.189.64.0/18
180.189.176.0/20
180.210.0.0/17
180.210.192.0/21
180.211.0.0/18
180.222.220.0/22
180.224.0.0/13
180.233.192.0/18
180.236.0.0/14
182.31.0.0/16
182.50.32.0/19
182.161.96.0/19
182.161.128.0/17
182.162.0.0/16
182.163.128.0/17
182.172.0.0/16
182.173.80.0/20
182.173.96.0/19
182.173.160.0/19
182.192.0.0/13
182.208.0.0/12
182.224.0.0/13
182.237.32.0/19
182.237.64.0/18
182.237.192.0/18
182.252.0.0/18
182.252.128.0/17
182.255.128.0/17
183.78.128.0/19
183.78.192.0/18
183.86.192.0/18
183.90.128.0/19
183.91.192.0/18
183.96.0.0/11
192.5.90.0/24
192.100.2.0/24
192.104.15.0/24
192.132.15.0/24
192.132.247.0/24
192.132.248.0/22
192.195.39.0/24
192.195.40.0/24
192.203.138.0/23
192.203.140.0/22
192.203.144.0/23
192.203.146.0/24
192.245.249.0/24
192.245.250.0/23
192.249.16.0/20
202.3.16.0/20
202.6.95.0/24
202.8.160.0/19
202.14.90.0/23
202.14.103.0/24
202.14.165.0/24
202.20.82.0/23
202.20.84.0/23
202.20.86.0/24
202.20.99.0/24
202.20.119.0/24
202.20.128.0/17
202.21.0.0/21
202.22.32.0/19
202.30.0.0/15
202.43.48.0/20
202.59.216.0/21
202.68.224.0/19
202.73.132.0/22
202.86.8.0/21
202.89.124.0/22
202.89.248.0/22
202.90.252.0/22
202.126.112.0/21
202.128.100.0/23
202.131.24.0/21
202.133.16.0/20
202.136.112.0/20
202.136.128.0/19
202.148.48.0/22
202.150.176.0/20
202.158.144.0/20
202.163.128.0/19
202.165.56.0/22
202.167.208.0/20
202.171.248.0/22
202.174.88.0/22
202.179.148.0/22
202.179.176.0/21
203.17.226.0/24
203.81.8.0/22
203.81.128.0/19
203.82.219.0/24
203.82.220.0/23
203.82.240.0/21
203.83.128.0/19
203.84.240.0/20
203.90.32.0/19
203.100.160.0/19
203.109.0.0/19
203.123.192.0/19
203.128.160.0/19
203.128.192.0/19
203.128.236.0/22
203.129.6.0/23
203.130.64.0/18
203.130.176.0/20
203.132.160.0/19
203.133.160.0/19
203.142.160.0/19
203.142.216.0/23
203.149.112.0/20
203.152.160.0/19
203.153.144.0/20
203.160.130.0/23
203.166.208.0/21
203.169.4.0/23
203.170.96.0/19
203.171.160.0/19
203.173.96.0/19
203.175.32.0/19
203.175.188.0/22
203.190.4.0/22
203.190.26.0/23
203.191.134.0/23
203.207.16.0/20
203.210.16.0/20
203.210.32.0/19
203.212.96.0/19
203.212.160.0/19
203.215.192.0/19
203.216.160.0/19
203.217.192.0/18
203.223.96.0/19
203.223.177.0/24
203.224.0.0/11
210.0.32.0/19
210.2.32.0/19
210.4.88.0/21
210.4.216.0/21
210.16.192.0/18
210.57.224.0/19
210.87.192.0/19
210.89.160.0/19
210.90.0.0/15
210.92.0.0/14
210.96.0.0/11
210.178.0.0/15
210.180.0.0/14
210.192.64.0/19
210.204.0.0/14
210.210.192.0/18
210.211.0.0/20
210.211.64.0/19
210.216.0.0/13
211.32.0.0/11
211.104.0.0/13
211.112.0.0/13
211.168.0.0/13
211.176.0.0/12
211.192.0.0/10
218.36.0.0/14
218.48.0.0/13
218.101.128.0/17
218.144.0.0/12
218.209.0.0/16
218.232.0.0/13
219.240.0.0/15
219.248.0.0/13
220.64.0.0/11
220.103.0.0/16
220.116.0.0/14
220.120.0.0/13
220.149.0.0/16
220.230.0.0/16
221.132.64.0/19
221.133.48.0/20
221.133.128.0/18
221.138.0.0/15
221.140.0.0/14
221.144.0.0/12
221.160.0.0/13
221.168.0.0/16
222.96.0.0/12
222.112.0.0/13
222.120.0.0/15
222.122.0.0/16
222.231.0.0/18
222.232.0.0/13
222.251.128.0/17
223.26.128.0/17
223.28.128.0/17
223.32.0.0/11
223.130.64.0/18
223.130.128.0/17
223.131.0.0/16
223.165.128.0/17
223.168.0.0/13
223.194.0.0/15
223.222.0.0/16
223.253.0.0/16
223.255.192.0/19

이제 추출된 목록을 ipset을 이용해 집어 넣는다.

# 목록 이름을 KRNIC_COUNTRY_240323 으로 했다. 목록명은 본인이 이해하기 편하게 수정해도 된다.
ipset create KRNIC_COUNTRY_240323 hash:net
while read line; do ipset add KRNIC_COUNTRY_240323 $line; done < ips.txt

생성된 ipset을 iptables에 추가한다

iptables -I INPUT -m set --match-set KRNIC_COUNTRY_240323 src -j ACCEPT

IP whitelist 모드로 작동하기 위해서 Input 체인의 정책을 Drop으로 수정한다. SSH등이 끊길수 있으니 다음 두가지를 체크해야 한다 (iptables -L -n -v 로 체크)

  1. RELATED,ESTABLISHED 상태에 대한 Accept 정책 (이미 연결된 통신에 대한 패킷은 허용 / iptables은 stateful이어서 통신이 연결중인지 체크 가능)
    -> sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  2. 루프백 장치에 대한 Accept 정책 (없을 경우 systemd-resolved로 DNS 요청이 실패할 수 있음)
    -> sudo iptables -A INPUT -i lo -j ACCEPT

이후, policy를 drop으로 수정한다

iptables -P INPUT DROP

결과적으로 iptables -L -n -v 를 실행하면 다음과 같이 보인다:

match-set KRNIC ~~~가 보이면 된다.

ipset 자체는 영구 유지가 되지 않는다. 즉, 부팅시에 ipset이 풀린다. 부팅시에도 적용을 위해서는 관련된 글들을 찾아보자: https://selivan.github.io/2018/07/27/ipset-save-with-ufw-and-iptables-persistent-and.html

한국 IP

글에 들어가기 앞서서 “한국 IP”에 대해 정리를 해야한다. 개인적으로는 국내에 존재하는 서버로 연결된 IP를 한국 IP라고 불러야 한다고 생각한다. (단, Anycast는 별도로 생각) 해당 기준으로는 GCP, AWS, Oracle등의 한국 리전에 연결된 IP가 포함된다.

아쉽게도, 국내 통신사들은 위의 KRNIC에서 제공하는 IP만을 “한국 IP” (국내 IP) 라고 인정한다. AWS, Oracle 등의 한국 리전을 사용해도 “해외 트래픽”으로 판정한다.

이 글에서도 국내 IP를 KRNIC를 기준으로 했다. 즉, AWS, Oracle 등의 한국 리전에서는 접속이 되지 않을것이다. 이들에 대해서는 별도의 iptables 정책을 추가해야 한다. 예를들어, 다음과 같이 해외 IP만을 위한 ipset을 만들 수도 있다. (ipset은 comment 기능이 있기 때문에, 별도의 메모를 넣을 수도 있다)

ipset create FOREIGN_IP hash:ip comment
ipset add FOREIGN_IP 123.123.123.123 comment "2024-02-26 added, from AWS sv-1"

KRNIC의 IP 목록

KRNIC는 국내 IP를 제공해 준다. 이 IP 목록이 호스팅 업체 등에서 말하는 “국내 IP”의 기준이 된다. 그러나 이 목록은 바로 CIDR로 써먹기는 불가능하다.

언제 부터 “csv”에서 쉼표가 탭이 됐는지 알 수가 없다.
몇몇 IP블록은 합쳐 놓았으면서
몇몇 IP 블록은 다 해체해 놓았다. (211.192.0.0/10 = 211.192.0.0 ~ 211.255.255.255)

네트워크 흐름

whitelist를 적용하기 위해서는 “수신 패킷은 기본적으로 차단” 한다는 규칙이 들어간다. 혹시나 별도로 규칙을 만들지 않았다면 ssh 등이 접속되지 않을 수 있다. 반드시 한번 더 확인하자.

루프백(인터페이스: lo)을 별도로 추가해 주는 이유는 systemd-resolved 때문이다. systemd-resolved는 로컬 통신임에도 127.0.0.1 대신 127.0.0.53 에서 DNS 포트를 사용한다. 이 과정에서 netfliter를 거치게 된다. 별도로 systemd-resolved에 대한 처리를 하지 않을 경우 DNS 요청이 불가해 진다. 이 글에서는 루프백 통신에 대해선 무조건 허용하는 정책을 만들었다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

댓글을 작성하기 위해 아래의 숫자를 입력해 주세요. *Captcha loading…

목차