리버스 프록시 서버 Caddy에서 접속 IP 제한하기

웹서버에 대한 접근제한은 IP를 기준으로 1차로 방화벽에서 수행하고 2차로는 Apache 웹서버의 경우 .htaccess 에서 수행할 수 있다. 당연하게도 NginX도 nginx.conf에서 IP를 기준으로 접근을 통제할 수 있다. 하지만 Apache 서버나 NginX 서버를 도커d에서 컨테이너로 설치할 경우 이런 설정파일의 변경 시 컨테이너를 다시 빌드해서 배포하거나 이 파일들을 호스트에 마운트 시키고 수정 후 컨테이너를 재실행해야 한다. 이런 작업 방식은 꽤나 번거롭고 비효율적이다.

여러 도메인 주소의 웹사이트를 서비스할 때 실제 웹사이트의 IP주소는 숨기고 도메인 주소에 따라 해당 웹사이트로 접근할 수 있도록 연결해주기 위해서 Reverse Proxy를 흔히 사용한다. 그리고 앞에서 비밀번호 관리도구인 Vaultwarden을 컨테이너로 설치하는 포스트에서 편리하게 사용할 수 있는 Reverse Proxy 서버인 Caddy의 설정방법에 대하여 설명한바 있다.

Caddy의 동작 방식

Vaultwarden에는 매우 중요한 개인정보가 대량으로 저장되기 싶다. 회원으로 등록되어 있는 웹사이트의 주소와 ID 그리고 비밀번호까지 저장된다. 다만 Master Password를 알아야만 해독이 가능하도록 암호화 되어 있다. 하지만 누군가 비 인가자가 접근을 시도하는 것 자체가 꽤나 큰 리스크로 느껴졌다.

그래서 강구한 보호대책이 바로 Vaultwarden에 접근할 수 있는 IP를 제한하는 것이다. 어느 단계에서 접근허용 IP를 정의하고 나머지 접근은 차단할 것인지 한참을 고민했다. 다양한 방법 중 가장 마음에 드는 것은 바로 Reverse Proxy인 Caddy에서 접근을 허용할 IP의 목록을 등록하고 나머지는 모두 차단하는 방법이다.

예를 들어 www1.techblog.co.kr 과 www2.techblog.co.kr의 주소를 갖는 2개의 컨테이너가 도커에서 실행 중인 상황이라면 Caddy는 Caddyfile의 설정에 따라 이 두 주소로 접근하는 HTTP와 HTTPS 트래픽을 HTTP헤더에 포함된 도메인 주소에 따라 각각의 컨테이너로 분배해준다. 다음이 Caddyfile 예제다.

www1.techblog.co.kr {
        reverse_proxy vaultwarden:80
}
www2.techblog.co.kr {
  reverse_proxy calibre-web:8083
}

매우 간단한 예제다. www1.techblog.co.kr 의 주소로 접근하는 트래픽은 reverse_proxy라는 도커 네트워크 인터페이스에 연결된 vaultwarden 이라는 컨테이너의 TCP/80 으로 전달하고 www2.techblog.co.kr 로 접근하는 트래픽은 마찬가지로 reverse_proxy라는 도커 네트워크 인터페이스에 연결된 calibre-web 이라는 컨테이너의 TCP/8083으로 전달하는 정책이다. 80과 8083은 각각의 컨테이너에서 웹 서버가 Listen하고 있는 포트여야 한다.

당연히 vaultwarden과 calibre-web 컨테이너는 외부 직접 노출되도록 호스트의 브릿지 인터페이스를 사용하면 안되고 Caddy가 도커 네트워크와 연결하기 위해 생성되어 있는 도커 네트워크 인터페이스 즉 위에서는 reverse_proxy 네트워크에만 연결되어 있어야 한다.

Caddy의 IP 접근 허용 기능 설정

Caddy는 각각의 도메인주소에 접근할 수 있는 IP를 제한할 수 있다. 먼저 모든 접근을 차단하고 특정 IP 대역들만 접근을 허용하는 정책의 예제다.

www1.techblog.co.kr {
    @allowed { # SKT, KT, LGU Mobile IP, for LTE Router
        remote_ip 115.161.0.0/16 122.202.0.0/16 223.38.0.0/16 223.32.0.0/16 122.32.0.0/16
        remote_ip 211.234.0.0/16 121.190.0.0/16 233.39.0.0/16 223.33.0.0/16 223.62.0.0/16
        remote_ip 203.226.0.0/16 175.202.0.0/16 175.223.0.0/16 223.57.0.0/16 175.252.0.0/16
        remote_ip 210.125.0.0/16 211.246.0.0/16 39.7.0.0/16 118.235.0.0/16 114.200.0.0/16
        remote_ip 117.111.0.0/16 211.36.0.0/16 106.102.0.0/16 61.43.0.0/16 125.188.0.0/16
        remote_ip 211.234.0.0/16 106.101.0.0/16
    }
    handle @allowed {
        reverse_proxy vaultwarden:80
    }
    handle {
        respond "Access Not Allowed" 403
    }
}
www2.techblog.co.kr {
  reverse_proxy calibre-web:8083
}

이 정책은 SKT, KT, LGU+의 LTE 이동통신 네트워크의 IP 주소 대역이다. 즉 이동통신3사의 스마트폰이 LTE 네트워크에 연결되었을 때 할당받는 주소에서만 접근을 허용한 것이다. 따라서 다른 유선 네트워크에서는 접속이 불가하다.

단, 아래의 www2.techblog.co.kr 도메인 주소에 대한 접근은 IP를 제한하지 않는다. 만약 접근 불가 IP에서 접근하게 되면 기본 handle이 실행된다. 즉 브라우저 화면에 “Access Not Alllowed” 메시지를 표시하고 403 에러를 리턴해준다.

필자의 Caddyfile이다.

#reverse_prox #리버스프록시 #caddy

Caddy의 IP 접근제한에 의해 차단된 화면 예시

Caddy의 Caddyfile에 접근이 허용된 @allowed 핸들에 등록되지 않은 IP에서 접근할 경우 다음과 같이 차단화면이 표시되면서 웹페이지 또는 브라우저의 플러그인인 비트워든 플러그인에서 접근이 차단된다.

화면에 표시된 메시지가 Caddyfile의 handle에서 표시된 메시지와 동일한 것을 확인할 수 있다.

#caddy #reverse_proxy #리버스프록시 #ip접근제한

답글 남기기

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