태그 글 보관함: 방화벽

우분투 18.04 에서 iptables 애드온 xtables 로 국가 별로 접속 차단 허용

2020/6/25 업데이트
xtables-addons-common, xtables-addons-dkms이 업데이트 되면서 설치한 xtables 최신버전(이글에서 xtables-addons-3.9.tar.xz 파일로 설치한 것)이 덮어씌워지면서 iptables 에 geoip 설정 내용이 적용 안되게 된다. xtables-addons-3.9.tar.xz 파일로 다시 설치하면 복구되니 아래 인스톨 방법대로 한번 더 설치해주면 된다.

2020년1월부터 maxmind사가 제공하는 geoip 정보 파일이 회원가입제로 바뀌었다. 다른 방법으로 국가별 IP 정보를 얻어서 차단하거나 허용하는 방법에 대해서 자세히 설명. iptables 애드온 xtables 와 KRNIC 에서 제공하는 국가별 IP 정보를 사용한다.

우분투 18.04 에서 방화벽 iptables 의 애드온 xtables 를 이용해 국가 별로 접속 차단 또는 허용하는 방법을 쓰려고 했는데 여러가지 문제에 부딪혀 아주 긴 글이 될 것 같다.
일단 과정을 기록하면서 쭉 써보겠는데 너무 글이 난잡해서 어려워지면 나중에 설정 순서만 따로 정리해보도록 해야겠다.

자, iptables 에 xtables 라는 애드온을 설치해서 국가별로 접속을 차단하거나 허용하는 설정을 해 보겠다.

===== 경고!!! =====
클라우드 서비스나 VPS 를 사용하고 있는 서버에서 SSH 접속 포트에 이 글의 내용을 적용할 경우에는 iptables 에 대한 충분한 지식을 갖고 설정하지 않으면 서버에 접속이 불가능해 질 수가 있으니 꼭!!! 잘 확인하고 적용하도록 합시다. 최소한 리부팅하면 되돌아 올 수 있도록 iptables 에 재기동시 디폴트 파일에는 적용하지 않을 것을 추천합니다! 이 블로그에서도 iptables 에 대한 내용은 많이 다루었으니 먼저 읽어 보시는걸 추천합니다.

원격 접속 상태에서 iptables 의 안전한 적용 방법
우분투 서버 18.04 iptables 서버 재기동으로 초기화 되는 문제

xtables 설치

관련 팩키지가 많아서 170메가쯤… 크다. 설치는 이게 전부.

xtables 에서 사용할 국가별 IP 바이너리 파일 작성

xtables 를 사용하기 위해선 /usr/lib/xtables-addons 에 국가별 IP 정보가 들어있는 파일을 다운로드하는 스크립트와 빌드하는 스크립트가 있는데 실행해도 작동하지 않는다.
원래라면 이 두 스크립트로 차례대로 실행해 CSV 파일로 되어 있는 국가별 IP 정보를 다운로드 하고, CSV 파일을 다시 바이너리 파일로 빌드해야 xtables 가 작동하게 된다.

Xtables-addons Git 에서 최신 버전 스크립트를 찾아서 열어보면, 다운로드 스크립트는 maxmind 라는 회사에서 제공하는 geoip 정보를 다운로드 하도록 만들어져 있다.
그런데 이 회사는 2020/01/01부터 정책을 변경해서, 회원가입을 해서 다운로드를 받도록 하고 있기 때문에 스크립트도 동작하지 않고, 회사 사이트에서 회원가입하고 geoip 정보는 받는것도 난 쓰기가 싫어서 다른 방법을 찾아봤다.

IP 를 관리하는 각 대륙별 인터넷 레지스트리에서 자기들이 할당한 IP 리스트에 IP 정보와 함께 국가 정보도 들어있다. 아래가 각 대륙별 인터넷 레지스트리들이 제공하는 IP 할당 정보 파일.

포멧은 CSV형식으로 되어있는데 자세한 포맷에 대해선 여기 문서에 잘 나와있다. (별거 없음)

이 파일들로 국가별로 정리하고 연속된 IP는 합치고하는 출력하는 프로그램을 자바로 다 만들고 나서 여기까지 글을 쓰는 도중에 발견한…
KRNIC (한국인터넷정보센터) 에서도 같은 국가별 IP 할당 정보를 전국가분을 하나의 CSV 파일로 제공하고 있는것이다… 두둥…
다운받은 시점으로 3일전 등록한 내용까지 있으니 꽤 자주 업데이트 되는것 같다. 이건 차차 더 보기로 하고.

xtables-addons 의 빌드 스크립트(파일명:xt_geoip_build 갱신일:2020/01/07)에서 사용하는 파일 포맷은 DB IP 라는 회사에서 제공하는 geoip 정보가 담긴 csv 파일인데, 구조가 시작IP,끝IP,국가코드(두자리) 이다.

KRNIC 에서 받은 CSV 파일을 위 형식으로 변환하고, 빌드 스크립트를 돌려서 바이너리 데이터베이스 파일을 만들면 xtables 설정을 위한 준비가 끝나는 것이다.
DB IP 포맷으로 변환한 파일은 자바로 작성해서 바로 출력했다.
변환시 사용한 자바 코드 – https://github.com/elmitash/geoip_convert_krnic2dbip/
go로도 만들었다. 실행파일과 쉘스크립트도 있으니 이쪽을 사용하는게 편하다. https://github.com/elmitash/geoip_krnic2dbip
CSV 파일명을 dbip-country-lite.csv 로 바꾸고 아무데나 넣어두고 그자리에서 빌드 스크립트를 실행하면 된다.

xt_geoip_build 스크립트 실행시 에러가 나온다.

구글링 해보니 아래 라이브러리가 필요하단다. 설치하자.

다시 실행하면 잘 될거다. 안되면 구글링…

빌드 스크립트를 실행한 디렉토리에 국가별로 바이너리로 빌드 된 파일들이 생기게 된다. xtables가 인식하는 지정된 디렉토리가 있으니 거기에 넣어야한다. 디렉토리를 작성해서 .iv4 .iv6 파일을 모두 이동시키자. 인터넷에서 xtables 설치 과정을 보면 xt_geoip 디렉토리 아래 BE 와 LE 디렉토리 이야기가 많이 나와서 BE 는 도대체 뭔가 했는데 Big Endian 과 Little Endian 의 약자이다. 우분투는 Little Endian 시스템이니까 LE 에 넣으면 될 것 같다.

문제 발생

뭔가 버그가 있는건지 뭘 잘못한건지 모르겠는데, iptables 에 REJECT 를 한줄 추가하면 국가를 뭘로 지정하든 모든 국가가 다 블럭되는것 같다.
아주 수상한 상황이니 사용할 때는 꼭 리붓하면 되돌아 올 수 있도록 설정하고 사용해 보자. 클라우드 서버에서 SSH 막히면 망한다.

해결방법을 찾았다. xtables 를 최신 버전으로 빌드해서 설치하면 잘 작동된다.

xtables 최신버전 설치

소스포지에 xtables-addons 의 다운로드 페이지에 가서 최신버전의 xtables 압축파일을 다운로드 받자.
이 글에서는 xtables-addons-3.9.tar.xz 파일을 받아서 설치하는 방법으로 진행한다.

다운받은 파일을 서버에 올리고, xz 압축 파일을 써 본적이 없을 경우에 설치부터 해서 아래 명령으로 압축 해제.

압축해제된 디렉토리로 이동해서 configure 실행.

내경우에는 에러가 나서 에러 내용으로 검색해보니 pkg-config, iptables-dev 가 부족해서 설치했다.

다시 실행하니 문제 없음.

설치가 무사히 끝나면 다운로드 스크립트와 빌드 스크립트가 /usr/local/libexec/xtables-addons/ 디렉토리에 설치된다. 다운로드는 작동 안할 것이고, 빌드는 이글 위에서 사용했던 것과 같은 버전(최신버전)이 설치 된다.

이미 국가별 IP 파일은 모두 빌드해서 /usr/share/xt_geoip/LE 디렉토리에 넣어놓았으면 다시 빌드할 필요는 없다.
iptables 에 geoip 설정을 넣으니 에러가 발생해, 내용을 보니 이번 최신버전 xtables 는 LE 디렉토리를 사용하지 않는다.
/usr/share/xt_geoip 디렉토리에 빌드된 국가별 IP 파일을 넣어야한다.

파일들을 옮기고, LE 디렉토리는 필요없으니 지우자.

이렇게 xtables 최신버전을 설치하고, 국가별 IP 파일도 옮기고 나니 아래에서 설정한 내용들이 잘 적용 된다. 만세 ㅠㅠ

iptables 에 국가별 차단 허용 등록

참고글:원격 접속 상태에서 iptables 의 안전한 적용 방법

안전하게 하려면 현재 iptables 내용을 파일로 백업하고 백업한 파일을 복사해서 geoip 설정을 추가한 파일을 만든 후에 iptables-apply 로 적용해 본다.

iptables.geoip 파일을 열어 필요에 따라서 아래 예시를 참고해서 적당히 추가

예시: 포트 22 (SSH)로 들어오는 한국, 일본, 미국 IP 이외를 모두 블럭한다.

예시: 포트 22 (SSH), 80 (http), 443 (https)로 들어오는 중국, 인도 IP 를 모두 블럭한다.

예시: 포트 22 (SSH)로 들어오는 한국 IP 만 허용한다. ACCEPT 의 디폴트 폴리시가 ACCEPT 가 아닐 경우에는 아래 두번째 줄도 필요.

iptables.geoip 내용을 iptables에 적용 후, 10초 동안 적용할지 말지 선택하지 않으면 원래대로 되돌린다.

시험삼아 JP, US 를 블럭하니 SSH 접속이 끊겨버렸다. ㅋㅋㅋ
잘 적용 되었으니 이제부터는 SSH 포트로 접속하는 수많은 나라들 안녕!

===== 경고!!! =====
아래 내용은 클라우드 서비스나 VPS 를 사용하는 서버에서는 SSH 접속 포트에는 적용하지 않는 것이 안전합니다! 서버 재기동시 접속이 불가능해질 수 있습니다!

마지막으로 서버 재기동시 읽혀지는 iptables 디폴트 파일에도 같은 내용을 넣어주면, 서버가 재기동 되더라도 적용될 것이다.
참고글:우분투 서버 18.04 iptables 서버 재기동으로 초기화 되는 문제

국가코드는 아래에서 보자.
국가코드 조회

원격 접속 상태에서 iptables 의 안전한 적용 방법

iptables 의 특성

일단 iptables 의 특성에 대해서 알아보자. iptables를 쓴다면 알아야한다…

iptables 에 입력한 내용은 바로 적용된다.
단, 시스템 재기동을 하면 디폴트 파일로 초기화 되어, 추가된 내용은 사라진다.
디폴트 파일은 우분투 18.04의 경우에는 /etc/iptables/rules.v4, /etc/iptables/rules.v6 에 저장되어 있다. 시스템에 따라서 파일 위치나 파일명이 많이 다른듯하니 자신의 시스템명으로 검색해 볼것.
즉, 이 파일들을 수정해 주지 않으면 재기동으로 인해 iptables 에 설정한 내용이 사라진다는 것.

주의할 점이 있는데 fail2ban이나 openvpn 등에서는 이 iptables 가 재기동하면 초기화 된다는걸 반영해서, 시스템 재기동 후에 iptables 에 내용을 추가하도록 스크립트가 짜여져 있다.
그래서 현재 iptables 내용을 보는 iptables -L 명령으로 확인 후, 아래 iptables 내용을 저장하는 커맨드로 그 내용을 재기동시 읽어들이는 디폴트 파일에 아무생각 없이 덮어써버리면 디폴트 파일의 내용과 fail2ban의 기동 스크립트 내용이 중복되어 iptables 에 등록되게 된다. 뭐 같은 내용이기 때문에 중복으로 되어도 딱히 문제는 없지만, 이과들은 이런거 기분이 좋지 않겠지? ㅎㅎ
그래서 그렇게 중복되는 부분이 없도록 잘 생각해서 디폴트 파일에 내용을 덮어 써야한다.

iptables 저장 방법

저장한 내용을 복원하는 방법

iptables 의 안전한 적용 방법

자, 본론인 원격 접속 상태에서 iptables 내용을 안전하게 적용하는 방법을 알아보자.

원격으로 접속했을 때도 그렇지만, 특히 클라우드의 VPS 환경이라면 실제 단말에는 접속이 불가능하고 항상 원격으로 SSH 로 접속하기 때문에, 넣는 즉시 적용되어버리는 iptables 에 잘못된 내용을 넣으면, 영영 접속을 할 수 없는 경우가 생긴다. 돌아올 길은 서버 재기동 설정이 있는 환경이라면 서버 재기동으로 디폴트 파일로 인해 iptables가 초기화 되면서 그나마 접속할 수 있게 되지만, 서버 재기동 방법이 제공되지 않거나, 어떻게 하는지 모를 경우에는 참 위험하지 않을 수 없다.

iptables-apply 커맨드를 사용하면 안전하게 iptables를 적용할 수 있다. 아래 커맨드는 iptables.conf 파일의 내용을 적용해서 30초 후까지 응답이 없을 경우 원래 iptables 의 내용으로 되돌려 준다.

실제 커맨드를 실행하면 아래와 같이 진행된다.

30초간 아무 선택을 하지 않을 경우…

그래 문제가 안생기면 리눅스가 아니지…
일단 fail2ban 에 ipset 로 설정된 세트가 제대로 반영이 안되는것 같은데, fail2ban 0.10.2 버전에서는 고쳐진 것 같은데, 이것 때문에 귀찮게 버전업하지는 않겠다.
그냥 fail2ban 재기동으로 iptables 에 fail2ban 설정이 다시 들어가니 그냥 서비스 재기동 하자.

에러는 안났지만, openvpn 의 iptables 설정도 날아가버리던데, openvpn은 서비스 재기동을 해도 iptables 설정이 살아나지 않는다. 서버 재기동 해야할듯.

어쨋든 iptables-apply 명령을 쓰면 안전하게 iptables 내용을 되돌려 준다는 것은 확인했으니, 잘 이용해 보도록 하자.

참고: Is it enough adding iptables rules without restart?

관련글: 우분투 서버 18.04 iptables 서버 재기동으로 초기화 되는 문제

오라클 클라우드 방화벽 설정에 대한 모든 것

오라클 클라우드에서 메인인 오라클 리눅스가 아닌 우분투를 써서 그런가 사사건건 방화벽 때문에 시간을 잡아 먹게 된다.
원인은 iptables 설정에 있는데, 알아먹기도 힘들뿐더러 서버 재기동으로 설정이 되돌아가버리고…
이 문제를 최종적으로 완전히 해결해 버리는 방법이 있다.

스택오버플로우에 있는 오라클 클라우드에서 포트80을 열고 싶어하는 질문에 대한 답변
https://stackoverflow.com/a/54810101

우분투는 기본적으로 ufw 쓰니 iptables 내용을 그냥 다 날리자.라는 내용인데.
ufw 활성화하고 오라클 클라우드 보안 목록에서 이미 다 막고 있으니 iptables 내용은 다 지워도 별 상관없을 것 같다.

현재 iptables 내용을 백업

들어오는 연결에 기본값을 허용으로 설정,
나가는 연결에 기본값을 허용으로 설정,
포워드 연결에 기본값을 허용으로 설정,
체인을 모두 삭제.

이걸 다 하지는 말고, 웹서버나 FTP 서버 같은 경우는 보통 들어오는 연결만 허용하면 되니, 들어오는 연결만 모두 허용하도록 기존 설정을 다 지우면 될듯하다.

만약에 설정을 다 지우더라도 vpn 같은걸 설치한 경우는 포워드 설정에도 관련이 있으니 백업한 파일에서 찾아서 되돌리도록.

OUTPUT 나가는 쪽 설정에는 오라클 관련한게 많이 들어있던데 지울 경우에는 오라클 인스턴스 정보 같은게 제대로 안나올 수도 있으니 안지우는게 좋을듯.

관련글: 오라클 클라우드 프리티어로 이사
우분투 서버 18.04 iptables 서버 재기동으로 초기화 되는 문제

우분투 서버 18.04 iptables 서버 재기동으로 초기화 되는 문제

오라클 클라우드는 우분투 서버 방화벽 서비스로 ufw 가 아니라 iptables 를 사용하고 있다.
아마도 다른 리눅스 배포판에서도 공통으로 쓸 수 있는 iptables 로 간단하게 설정하기 위해서 그런것 같은데, 덕분에 이것저것 문제가 생기네.

업데이트 적용으로 우분투 서버를 재기동하고나니 웹서버 접속이 안되서 왜 그러나 했더니, 열어두었던 http, https 포트가 다시 막혀서 그런 것이었다.

iptables 설정 내용 확인

여기 분명히 설정했었던 내용이 사라져 있어서 검색.
이것저것 거친 후에 결론은 /etc/iptables/rules.v4 파일의 내용으르 iptables 설정이 저장/로드 되니 이 파일에 설정 내용을 저장하라는 것.

현재 iptables 설정 내용을 저장하는 방법. (지워진 내용을 다시 추가한 다음에 실행할 것.)
백업하고 하자.

내 경우에는 sudo 를 썼는데도 퍼미션 디나이드가 떠서 루트로 바꾼 후에 저장했다.

이제 서버 재기동해도 저장된 내용이 잘 살아있는걸 볼 수 있다.

혹시 iptables-save 명령이 없으면 iptables-persistent 를 설치.

기타

openvpn-install.sh 로 openvpn을 설치하면 iptables에 이것저것 내용을 추가하는 서비스가 설치된다.

매번 서버 재기동할 때마다 추가되니 현재 iptables 내용을 rules.v4 파일에 저장했으면 서비스는 끄자.

관련 글: 오라클 클라우드 방화벽 설정에 대한 모든 것

오라클 클라우드 프리티어로 이사

블로그를 한동안 방치하고 있었는데 서버를 오라클 클라우드 프리티어(https://www.oracle.com/kr/cloud/free/)로 이사했다.
무료로 두개까지 가상서버를 사용할 수 있으니 관심 있는 분들은 찾아 보라.
서버 위치로 서울 리전으로 했으니 저번보다는 좀 빨라지려나.
근데 이거 업로드 속도가 처참해서 그렇게 기대는 못하겠는데…

이사하면서 HTTPS 대응도 하고, 도메인도 만료 된거 그냥 죽였는데, 다른 도메인으로 새로 구입했다.
일본에 오나마에 쓰고 있었는데 도메인 만료 전에 도메인 갱신하라고 메일을 얼마나 보내는지 아주 질리도록 보내더라.
만료 후에도 다시 살릴 수 있는 기간동안엔 살리라고 메일이 또 오고.
질려서 구글 도메인에서 page 도메인을 구입했다. (제일 싼거)
가격도 가격인데 이름 선택권이 닷컴보다는 여유로워서 좋은 듯하다.

오라클 클라우드 팁 하나 던지자면 이걸 몰라서 엄청 고생했는데,
HTTP나 HTTPS나 포트를 열때 오라클 클라우드 설정 화면에서 가상 클라우드 네트워크 – 보안목록(security list) – 수신 규칙에서 포트 지정하는건 알겠는데 아무리 해도 접속이 안되더라.
나 같은 경우는 가상서버 OS는 우분투 서버 18.04를 선택했는데 다른 리눅스계열은 다 비슷할듯한데, 포트 열어도 접속이 안될때는 서버에 접속해서 iptables 꼭 확인해 보자.
ufw 설치해서 거기서 포트를 열어도 iptables 에 미리 정의된 내용이 있어서 ufw 건드려도 아무것도 안되더라.
iptables 에 직접 포트 열도록 설정해 주니 바로 되서 좀 어이가 없었다.
그냥 내가 멍청한 탓이지…
근데 ufw 깔면 iptables 안봐도 되는줄 알았어…

버려둔거 다시 살렸으니 종종 글을 올려봐야겠다.
일단 오늘은 이정도로.