본문 바로가기
데브옵스

iptables을 활용하여 해외 ip차단하기 (feat. Docker, geoip)

by __Minnie_ 2024. 3. 9.

ec2에 api server를 구축하고 EIP를 연결했더니, 해외 ip에서 계속해서 공격이 들어왔습니다. php 취약점 공격, actuator 취약점 공격, .env 파일 조회 등 정말 다양한 나라에서 다양한 요청이 들어왔습니다. 경력이 오래 되신 분께 여쭤보니 aws의 EIP는 어느정도 대역이 정해져 있고 해당 ip를 돌려서 사용하는 것이기 때문에, 많은 공격이 들어온다고 하셨습니다.

 

이를 막을 수 있는 방법을 2가지 정도 알려주셨는데, 1가지는 aws서비스 중 하나인 waf이고, 다른 하나는 iptables 같은 방화벽 프로그램을 사용하는 것입니다. iptables은 os단에서 막는 것이고, 해외 ip 대역을 특정하기가 어렵기 때문에 관리가 많이 필요한데 반해서 waf는 ec2보다 더 앞에서 LB, api gateway, cloud front 등에서 막는 것이기 때문에 더 안전하고 관리가 필요하지 않다는 장점이 있다고 합니다.

 

그러나, 저의 경우에는 LB, api gateway, cloud front 처럼 waf를 달 수 있는 서비스를 사용하고 있는 것이 없었고, 해외 ip차단을 위해서 다른 서비스를 또 구축할 순 없어서, iptables를 사용하여 해외 ip를 차단하는 방법을 선택하였습니다.

 

참고로, 제가 사용하고 있는 ec2의 스펙은 다음과 같습니다.

AMI: amazon linux 2023
아키텍처: x86_64
인스턴스 유형: t3.small (cpu: 2개, memory: 2g)
storage: gp2 8g

 

인터넷 검색을 해보았을 때, iptables와 geoip를 사용하여 해외 ip를 차단하는 예시는 대부분 xtables(?)를 사용하는 것이 많았습니다. 그러나, xtables(?)를 다운로드 해보니 404 에러가 떴습니다. 그래서 찾은 방법은 geoip csv 파일에서 한국을 제외한 나라들의 ip리스트를 추출하고, 해당 ip들을 iptables에 하나하나 drop 명령어로 등록하는 것입니다. 그런데, 한국을 제외한 나라들의 ip리스트들을 추출하니 파일이 7M가 넘었고, 해당 ip들을 쉘 스크립트를 만들어서 등록하니 약 60%정도 등록하니 점점 서버가 렉이 걸리기 시작했습니다. 그래서 이 방법도 안되겠다고 판단했고, 이렇게 한국을 제외한 국가들의 ip를 블랙리스트로 등록하지말고 기본적으로 모든 접근을 막되 한국의 ip만 화이트리스트로 등록하는 방법을 적용하기로 했습니다. 

 

참고! Docker를 사용하고 있는 경우에 도커로의 접근을 관리하고 싶다면 INPUT 체인에 적용하는 것이 아니라, DOCKER-USER 체인에 적용해야 합니다.

 

 

화이트리스트 등록하기

1. geoip csv 다운로드

wget "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country-CSV&license_key=<라이센스키>&suffix=zip" --no-check-certificate -O ./GeoLite2-Country-CSV.zip

 참고! 라이센스 키의 경우 블로그글을 참고하여 발급받으면 됩니다. 

 

2. 압출 풀기

 

3. 한국 id 추출

grep 'South Korea' ./GeoLite2-Country-Locations-en.csv | cut -d, -f1 > kr_id.txt

 

4. 한국 ip 추출

grep -f kr_id.txt ./GeoLite2-Country-Blocks-IPv4.csv | cut -d, -f1 > kr_ips.zone

 

5. DOCKER-USER 체인 초기화

sudo iptables -F DOCKER-USER

 

6. DROP 정책 등록

sudo iptables -I DOCKER-USER -i <본인 이더넷> -j DROP

주의할 점!! 처음 drop정책을 등록할 때 -i 옵션을 빼고 등록했었는데, 그렇게 하니 8번의 화이트 리스트를 등록해서 정상적으로 동작하지 않았습니다. 화이트 리스트가 정상적으로 동작하지 않는다면 -i 옵션을 주시길 바랍니다. 

 

7. 컨테이너에서 인터넷 연결을 위한 정책 등록

sudo iptables -I DOCKER-USER -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

 

8. white list 등록

sudo iptables -I DOCKER-USER -s <ip> -j ACCEPT

4번에서 저장한 ip리스트들을 한 줄 씩 가지고 와서 white list를 등록합니다.

 

9. 해외 ip 접속 테스트

https://tools.pingdom.com/

위 사이트에서 해외 ip 접속을 테스트할 수 있습니다. 여기서 접속이 되지 않고, 한국 ip에서는 정상적으로 접속된다면 설정 성공!!!