--- 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 ```