---
title: ipset을 사용하여 iptables에 국가 필터링하기
date: 2020-05-22
slug: /blog/ipset
tags: blog, dev, linux, 해외IP, 해외접속
---
서비스를 운영하다보면, 종종 특정 국가에서만 접속을 허용하거나, 특정 국가에서 접속하지 못하도록 화이트리스트/블랙리스트를 구성해야 하는 경우가 있습니다.
이러한 `ipset`을 이용하여 이런 목록들을 구성하고, `iptables`을 이용하여 해당 목록으로 접속을 차단하거나 허용하도록 규칙을 추가해보았습니다.
## ipset 설치
먼저 리스트를 구성하기 위해 패키지 관리자를 통해 ipset을 설치합니다.
### CentOS
```bash
yum install ipset -y
```
### Ubuntu
```bash
apt-get install ipset -y
```
## IP 목록 다운로드
필요한 IP CIDR 목록 파일을 다운로드 받습니다.
아래는 한국 IP에서만 접속을 허용하기 위해 작성된 목록입니다.
```bash
curl https://ludorum.keybase.pub/ipset/kr.zone -o kr.zone
```
- [IPDeny](https://www.ipdeny.com/ipblocks/)
- [한국 IP목록](https://ludorum.keybase.pub/ipset/kr.zone)
## ipset 설정
ipset을 생성하고 ip대역을 추가합니다.
```bash
ipset -N kr hash:net
for a in $(cat kr.zone); do ipset -A kr $a; done
```
추가된 목록을 확인합니다.
```bash
ipset list | less
```
## iptables 설정하기
아래 예시를 참고하여 iptable을 설정합니다.
### 예시) 허용된 KR IP외에 모든 IP에서 80, 443포트 차단하기
```bash
iptables -A INPUT -p tcp -m set --match-set kr src --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m set --match-set kr src --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j DROP
iptables -A INPUT -p tcp --dport 80 -j DROP
```