본문 바로가기

IT/NAS

[자작NAS] 우분투 서버에 Docker로 Let's Encrypt 적용하기

반응형

NAS를 운영하다보면 개인 도메인이나 무료 DDNS 등을 통해서 외부 접속을 설정합니다.

다양한 DDNS 서비스 중에서 Duck DNS는 무료로 사용이 가능하며 안정적 서비스입니다.

Duck DNS를 사용하고 HTTPS 연결을 지원하기 위해서는 인증서를 사용해야 합니다.

인증서는 대부분 유료로 발급해야 하지만 Let's Encrypt를 통해 무료 인증서 적용이 가능합니다.

90일 동안 유효한 인증서를 제공해주며 갱신을 통해 계속 사용이 가능합니다.

이번 포스트의 목적은 다음과 같습니다.

  1. Duck DNS 설정 및 Let's Encrypt 적용
  2. 리버스 프록시 설정으로 서비스에 인증서 적용

Duck DNS에 Let's Encrypt를 적용하고 리버스 프록시를 설정하는 과정은 다음과 같습니다.


=============================================================================

해당 방법은 현재 적용되지 않으며 아래 링크를 통해서 Let's Encrypt를 설정하면 됩니다.

2019/02/13 - [IT/NAS] - [자작NAS] 우분투 서버에 Docker로 Let's Encrypt 적용 (DuckDNS)

=============================================================================


1. Duck DNS 및 포트포워딩 설정

먼저 Duck DNS에서 DDNS 주소를 등록하고 IP를 매핑해줍니다.

가운데 sub domain에 원하는 서브 도메인을 입력하고 add domain 버튼을 누르면 생성이 됩니다.

IP는 수시로 바뀔 수 있기 때문에 주기적으로 Duck DNS에 IP를 업데이트를 해줘야 합니다.

아래 링크를 통해서 Duck DNS Updater 컨테이너를 실행할 수 있습니다.

2018/07/27 - [IT/NAS] - [자작NAS] Docker로 Duck DNS Updater 설치

컨테이너를 생성하면 약간의 시간이 지나고 current ip 부분이 채워집니다.

그리고 공유기를 통한 네트워크 환경일 때 80번 포트와 443번 포트를 먼저 열어야 합니다.

각 공유기의 포트포워딩 설정에 맞춰서 진행하면 됩니다.

ASUS 공유기의 경우 WAN > 가상 서버 / 포트 포워딩에서 설정이 가능합니다.

포트는 Let's Encrypt 컨테이너를 실행시킬 NAS나 PC로 열어주면 됩니다.


2. Let's Encrypt 컨테이너 실행

Duck DNS 설정을 완료하고 해당 주소로 접속하면 안전하지 않은 연결로 표시됩니다.

웹브라우저마다 표시가 약간 다르지만 비슷한 내용으로 표시됩니다.

이제 linuxserver/letsencrypt 이미지를 사용해서 Let's Encrypt 컨테이너를 실행합니다.

sudo docker create \
--cap-add=NET_ADMIN \
--name=letsencrypt \
-v /data/letsencrypt/config:/config \
-e PGID=$(id -g $USER) \
-e PUID=$UID \
-e EMAIL=<EMAIL 주소> \
-e URL=duckdns.org \
-e SUBDOMAINS=<Duck DNS 도메인> \
-e ONLY_SUBDOMAINS=true \
-e VALIDATION=http \
-p 80:80 \
-p 443:443 \
-e TZ=Asia/Seoul \
--restart=unless-stopped \
linuxserver/letsencrypt

config 디렉토리로 사용할 디렉토리를 설정하고 EMAIL과 SUBDOMAINS은 실제 주소를 입력하면 됩니다.

컨테이너가 생성되면 아래 명령어로 컨테이너를 실행합니다.

sudo docker start letsencrypt

다음 명령어로 컨테이너 실행 과정의 로그를 확인할 수 있습니다.

sudo docker logs -f letsencrypt

에러가 발생하는 경우 포트포워딩이나 Duck DNS 도메인에 IP가 매핑되었는지 확인하면 됩니다.


3. Reverse Proxy(리버스 프록시) 설정

먼저 서치 엔진에 검색되지 않도록 하기 위한 설정이 필요합니다.

볼륨 마운트로 설정한 config 디렉토리의 nginx/ssl.conf 파일을 수정하면 됩니다.

sudo nano /data/letsencrypt/config/nginx/ssl.conf

파일의 마지막 라인에 아래 내용을 추가합니다.

add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive";

다음으로 리버스 프록시 설정을 진행합니다.

프록시 설정은 /config/nginx/proxy-confs에 위치시키면 됩니다.

기본적으로 Plex나 Transmission 등 자주 사용하는 서비스들의 설정은 subfolder와 subdomain으로 제공됩니다.

subdomain.duckdns.org/plex 식의 연결은 subfolder 예제를 사용하면 됩니다.

파일의 .sample 부분을 지우고 파일명이 .conf로 끝나도록 변경하면 됩니다.

원본을 보존하기 위해 원본 파일을 복사한 이후에 변경하는 것을 추천합니다.

cd /data/letsencrypt/config/nginx/proxy-confs/
sudo cp plex.subfolder.conf.sample plex.subfolder.conf

기본적으로 제공되는 리버스 프록시 설정에서 $upstream_plex 부분만 IP로 변경하면 정상적으로 동작합니다.

proxy_pass http://192.168.1.123:32400;

그 외 guacamole 등 제공되지 않는 서비스는 각 서비스명 + reverse proxy로 검색하면 내용을 찾을 수 있습니다.

필요한 리버스 프록시 설정을 추가하고 아래 명령어로 컨테이너를 재시작하면 됩니다.

sudo docker restart letsencrypt

이제 웹브라우저에서 https://<subdomain>.duckdns.org/plex 등으로 서비스에 접근 가능합니다.

정상적으로 Let's Encrypt 인증서가 적용되면 웹브라우저에서 Secure Connection이 표시됩니다.

반응형