[OMV6] 리버스 프록시 이용하여 Container 외부 접속하기

 안녕하세요?

지난번 포트포워딩을 이용해 외부에서 OMV6의 Container에 접속하는 방법을 알아 보았습니다. 하지만 이 방법은 NAS 자체가 인터넷에 바로 노출이 되어 있어, 보안에 문제점이 있습니다. 저희가 항상 신뢰할 만한 환경에서만 NAS를 이용 가능한게 아니기 때문에, 환경에 구애받지 않고 안전하게 NAS를 이용할 방법을 찾아야겠지요? 그래서 이용하는 방법이 오늘 말씀드릴 리버스 프록시입니다.

본격적인 설정 전에 간단히 프록시 서버에 대해 알아보겠습니다.

먼저 포워드(정방향) 프록시는 저희들이(A) 서버(C)에 접속하려 할 때, 프록시 서버를 앞에 두어 사용자(A)와 서버(C)간에 직접적인 접근을 막는 방법입니다.

정방향 프록시 - 출처 : CloudFlare

이 방법은 원래 인터넷 속도 향상을 위해 고안 되었지만, 현재는 IP 주소를 숨기는 용도로 많이 사용하는 것 같습니다. 서버는 인터넷에 직접 노출이 되어 있어, 서버 자체는 전문가가 아니라면 위험할 수 있습니다.

즉, 포워드 프록시는 사용자를 보호하고 돕는 방법으로 이해할 수 있습니다. 하지만 저희 NAS를 이용하는 데에 저희를 숨길 필요도 보호할 필요도 없기 때문에, 이 방법은 저처럼 개념정도만 아셔도 무방할 것 같습니다.

반대로 오늘의 주인공인 리버스 프록시는 이런 형태로 배치가 됩니다.

역방향 프록시 - 출처 : CloudFlare

리버스 프록시는 서버 앞에 프록시 서버가 위치하기 때문에, 어떤 사용자(D)도 원본 서버(F)와 직접적으로 통신이 불가능 하며, 서버(F)는 인터넷에 직접 노출되어 있지 않습니다. 그렇기 때문에 서버를 보호할 수 있는 것이지요. 그리고 기타 캐시 작업 및 부하 분산 등의 기능도 합니다. NAS를 운영하고 보호하고자 하는 우리들에겐 필수라고 할 수 있겠습니다.

이론적 탐구는 여기까지 하고 본격적인 설치 방법을 알아 보겠습니다. 이번엔 특히 하나의 Container만 설치하는 것이 아니라, 두가지 Container를 통합하여 설치해 보겠습니다.

먼저, Docker Hub로 접속하여 jc21/nginx-proxy-manager를 검색 합니다.

 jc21/nginx-proxy-manager Container

설치 방법을 확인하기 위해 Overview에서 Installation and Documentation으로 이동합니다.

jc21/nginx-proxy-manager Overview 페이지

해당 페이지에 접속하면 좌측 메뉴 화면에서 [Setup Instructions]-[Using MySQL/MariaDB Database] 페이지로 이동합니다.

Nginx Proxy Manager 설치 가이드

그럼 익숙한 Docker Compose의 예시가 보입니다. 복잡해 보이지만 어렵지 않습니다. 복사해서 OMV6의 Compose로 붙여 넣습니다.

** MariaDB는 DMBS라고 데이터 베이스 관리 시스템입니다. DMBS는 사용자가 여러 응용 프로그램을 이용해 접속을 하면, 데이터 베이스 앞에서 교통정리해 주는 관리자 역할을 합니다. 저희에겐 중요하지 않습니다. 패스!

Nginx Proxy Manager Docker Compose 예시

아래는 각 환경변수에 대한 주석을 달아 보았습니다. 참고하여 각자 환경에 맞게 수정하도록 합니다.


version: '3.8'

services:

  app:

    image: 'jc21/nginx-proxy-manager:latest'

    restart: unless-stopped

    ports:

      # These ports are in format <host-port>:<container-port>

      - '80:80' #http로 접속할 때 사용하는 port

      - '443:443' #https로 접속할 때 사용하는 port

      - '81:81' #관리자 페이지

      # Add any other Stream port you want to expose

      # - '21:21' # FTP

    environment:

      # Mysql/Maria connection parameters: #여기는 db로 연결될 때 옵션인데그대로 둡니다.

      DB_MYSQL_HOST: "db"

      DB_MYSQL_PORT: 3306

      DB_MYSQL_USER: "npm"

      DB_MYSQL_PASSWORD: "npm"

      DB_MYSQL_NAME: "npm"

      # Uncomment this if IPv6 is not enabled on your host

      # DISABLE_IPV6: 'true'

    volumes:

      - ./data:/data #데이터 경로

      - ./letsencrypt:/etc/letsencrypt #SSL 인증서 경로

    depends_on: #아래 db값을 종속시킨단 이야기입니다. db 다음 npm 실행 이런 의미

      - db

 

  db:

    image: 'jc21/mariadb-aria:latest'

    restart: unless-stopped

    environment:

      MYSQL_ROOT_PASSWORD: 'npm'

      MYSQL_DATABASE: 'npm'

      MYSQL_USER: 'npm'

      MYSQL_PASSWORD: 'npm'

    volumes:

      - ./mysql:/var/lib/mysql #데이터 경로



저도 제 환경에 맞게 작성을 해 보았는데요. 예시로 참고하시길 바랍니다. 

제 환경에 맞게 수정한 Nginx Proxy Manager+MariaDB Container 예시

다 작성하셨으면 저장을 하고, [체크]와 [UP]을 클릭하여 Container 설치를 진행 합니다.

Nginx Proxy Manager+MariaDB Container 설치 완료

설치가 완료되면, Nginx Proxy Manager(이하 NPM)의 관리자 페이지로 들어갑니다. 웹브라우저에서 라즈베리파이 내부 IP 주소:81을 입력합니다.

NPM 관리자 페이지 내부 주소

그럼 아래와 같은 로그인 창이 보이는데, 초기 아이디와 비밀번호를 입력합니다.

NPM 관리자 페이지 최초 로그인


아이디

비밀번호

admin@example.com

changeme


최초 로그인시 아이디 비밀번호를 바꾸는 창이 팝업되는데, 적당한 것으로 설정해 줍니다.

최초 로그인시 아이디 및 비밀번호 변경

로그인 하셨으면, 프록시를 설정하여 외부 도메인과 내부 서버 사이를 이어보겠습니다. 메뉴에서 [Hosts]-[Proxy Hosts]로 이동합니다.

NPM 관리자 페이지 메인화면

Add Proxy Host를 클릭합니다.

NPM Proxy host 추가

Proxy Host를 설정하는 창이 팝업 되는데, 아래의 주석을 참고하여 자신의 환경에 맞게 기입합니다. 저는 WebDAV 기준으로 기입해 보겠습니다.

NPM Proxy host 설정

기입 완료 후 저장을 하시면 아래와 같이 리스트가 되는데, Online이면 정상적인 상태입니다.

Proxy Server Online 상태

여기까지만 한다면, 약간의 아쉬운 부분이 남습니다. 엄연히 지금 설정하는 것도 외부와 통신을 하기 때문에, 패킷 등이 누출 될 수 있는데요. 이를 방지하기 위해 SSL을 설정해 보겠습니다.

SSL 인증서는 이 인증서가 적용된 도메인은 통신 시 패킷 등이 암호화 되어, 보다 안전하게 서버를 이용 가능하게 하는 역할을 합니다. 흔히, 인터넷 주소에 https://로 시작되는 도메인들이 SSL 인증서가 적용되어 있는 것입니다.

SSL 인증서 발급엔 약간의 비용이 발생합니다만, Let's Encrypt란 곳에서 개인에게 무료로 SSL 인증서를 발급해 주고 있습니다. 지금 설치한 NPM은 Let's Encrypt에서 SSL 인증서 발급 기능까지 내장되어 있기 때문에, 프록시를 설정하며 SSL 인증서도 발급 및 적용을 할 수 있습니다.

비영리 SSL 인증서 발급기관

본격적인 SSL 인증서 발급에 앞서, 사전 작업이 필요한데요. Let's Encrypt는 SSL 인증서 발급에 80 port를 이용하기 때문에, 사전에 공유기 환경설정에서 포트포워딩을 해 두시는게 좋습니다. 또, SSL 인증서를 적용한 도메인은 공통적으로 443 port를 이용하기 때문에, 두 포트 모두를 미리 열어 두겠습니다.

공유기 관리자 페이지로 접속하여, 아래처럼 80, 443 port를 포트포워딩 합니다.

iptime 포트포워딩 설정

그리고 NPM 관리자 페이지로 돌아와, Proxy 설정해 둔 도메인의 우측에 점 세개 버튼을 눌러 Edit을 클릭합니다.

NPM Proxy Host 수정

팝업된 창의 상단에 보이는 SSL이란 메뉴로 이동하여, Request a new SSL Certificate를 선택하고, 다른 옵션들도 선택해 줍니다.

SSL 인증서 발급

설정을 다 하셨으면, 저장을 누른 뒤에 설정한 도메인에 접속해 봅니다. 지난번 포트포워딩을 이용한 방법관 다르게 이번엔 도메인 주소만 입력하시면 됩니다.

프록시+SSL 인증서 적용여부 확인

익숙한 WebDAV 로그인창이 보입니다. 로그인 해 봅니다.

프록시 적용이 된 도메인을 통한 WebDAV 접속

도메인 주소 앞에 잠금쇠 모양이 잠겨 있으면 SSL 인증서가 잘 적용되어 있다는 의미입니다.

SSL 인증서 적용 확인

리버스 프록시를 통한 이 접속 방법은 포트포워딩과는 다르게, 한 도메인에 한 내부 포트만 연결이 가능합니다. DuckDNS는 총 5개의 무료 도메인을 지원해주기 때문에, 문제가 없습니다. 동일하게 Transmission과 기타 Container들도 연결해 보도록 합니다.

지금까지 리버스 프록시를 설정하는 방법을 알아 보았는데요. 어떠셨는지 모르겠습니다. 확실히 포트 번호를 적기보다, 저희가 지정한 Sub Domain으로 Container들을 연결하기 때문에, 도메인을 관리하기도 편하고, 포트도 여러개 열어 둘 필요 없고, SSL 인증서도 적용하여 이용한다는 점에서 더 안전한 방법입니다.

잘 활용하시어 즐겁고 안전한 NAS 이용하시길 바라겠습니다.

이상, 리버스 프록시를 이용하여 OMV6에 설치한 Container를 접속하는 방법을 알아 보았습니다.

감사합니다.

댓글

이 블로그의 인기 게시물

[OMV6] WebDAV 설치 및 설정하기

[OMV6] Transmission 설치 및 설정하기

[OMV6] Gluetun을 이용하여 Transmission에 VPN 적용하기