헤놀로지 CloudFlare + NPM SSL 인증서 자동 갱신

안녕하세요!

헤놀로지 (XPEnology)에서는 기본적으로 와일드카드 SSL 인증서의 자동 갱신이 쉽지 않습니다.
따라서 이 글에서는 CloudFlare와 Nginx Proxy Manager(NPM)를 활용해서
헤놀로지에서 와일드카드 SSL 인증서를 자동으로 갱신하는 방법을 정리합니다.
인증서 만료 걱정 없이, 여러 서브도메인도 한 번에 안전하게 관리할 수 있습니다.

준비물 – CloudFlare 도메인

다른 업체에서 구입한 도메인이어도 상관없지만, 대부분의 국내 업체가 리셀이므로
아직 도메인을 구입하지 않았다면 CloudFlare에서 구입하는 것을 추천드립니다.


CloudFlare DNS 레코드

CloudFlare에 접속하여 도메인을 클릭합니다.

좌측 메뉴에서 DNS를 클릭합니다.

레코드 추가를 클릭합니다.

  • 유형 : A
  • 이름 : 구입한 도메인 (필자의 경우 noriarchive.com)
  • IPv4 주소 : 공인 IP (확인하기)
  • 프록시 DNS 전용으로 만들기

정확히 입력하고 저장을 클릭합니다.

레코드를 하나 더 추가합니다.

  • 유형 : CNAME
  • 이름 : * (애스터리스크)
  • 대상 : 구입한 도메인 (필자의 경우 noriarchive.com)
  • 프록시 DNS 전용으로 만들기

정확히 입력하고 저장을 클릭합니다.

똑같은 방식으로, 이름만 www로 변경하여 하나 더 추가합니다.

시놀로지 DDNS에 CloudFlare 추가

제어판 > 작업 스케줄러에 진입합니다.

생성 > 트리거된 작업 > 사용자 정의 스크립트를 클릭합니다.

일반 탭에서 사용자를 root로, 이벤트를 부트업으로 지정합니다.

작업 설정 탭에서, 사용자 정의 스크립트에 다음 내용을 붙여 넣습니다.

curl https://raw.githubusercontent.com/namukcom/SynologyCloudflareDDNS/master/setddns.py | python3 -

우클릭하여 실행하고, 위와 같은지 확인합니다.

제어판 > 외부 엑세스 > DDNS > 추가를 클릭합니다.

서비스 공급자에 Cloudflare가 있는지 확인합니다.

CloudFlare Global API Key

우측 상단의 아이콘을 클릭하여 프로필에 진입합니다.

좌측 메뉴에서 API 토큰을 클릭합니다.

Global API Key 보기를 클릭합니다.

CloudFlare의 계정 비밀번호를 입력합니다.

클릭하여 복사합니다.

이제 시놀로지의 DDNS 추가에서 다음과 같이 설정합니다.

  • 서비스 공급자 : Cloudflare
  • 호스트 이름 : 구입한 도메인
  • 사용자 이름/이메일 : CloudFlare 계정
  • 패스워드/키 : Global API Key
  • 외부 주소(IPv4) : 자동 (공인 IP가 맞는지 확인하기)

정확히 입력했다면, 연결 테스트를 클릭하고 정상이 뜨는지 확인한 후, 저장합니다.

CloudFlare API 토큰 발급

토큰 생성 버튼을 클릭합니다.

영역 DNS 편집의 템플릿 사용을 클릭합니다.

권한과 영역 리소스를 위 화면과 같이 설정하고, 구입한 도메인 주소를 선택합니다.

토큰을 생성하고, 생성된 토큰은 재확인이 불가능하므로, 잘 보관해 둡니다.

DNS 레코드의 메모에 넣어두면 편리합니다.

Docker 경로 지정

docker 경로에 npm 폴더를 생성하고
내부에 data, letsencrypt 폴더를 생성합니다.
config.json 파일을 다운로드하여 업로드합니다.

Docker NPM 설치

제어판 > 작업 스케줄러에 진입합니다.

상단의 생성 > 예약된 작업 > 사용자 정의 스크립트를 클릭합니다.

일반 탭에서 사용자를 root로 변경하고, 활성화됨의 체크를 해제합니다.

스케줄 탭에서 다음 날짜에 실행을 선택하고, 반복하지 않음으로 지정합니다.

작업 설정 탭에서 아래 내용을 사용자 정의 스크립트에 붙여 넣고 저장합니다.

docker run -d --name=nginx_proxy_manager \
-p 8341:80 \
-p 8181:81 \
-p 8766:443 \
-e TZ=Asia/Seoul \
-v /volume1/docker/npm/config.json:/app/config/production.json \
-v /volume1/docker/npm/data:/data \
-v /volume1/docker/npm/letsencrypt:/etc/letsencrypt \
--restart always \
jc21/nginx-proxy-manager

추가된 NPM 스케줄을 우클릭하여 실행합니다.

이제 내부망IP:8181을 이용하여 NPM에 접속합니다.

기본 ID와 비밀번호는 다음과 같습니다.

admin@example.com
changeme

로그인이 됐다면, 관리자 계정과 비밀번호를 설정합니다.

포트포워딩

이제 공유기 관리 페이지에 접속하여 포트포워딩을 할 차례입니다.

최대한 우선순위를 올려주시기 바랍니다.

NPM SSL 인증서 발급

SSL Certificates > Add SSL Certificate > Let’s Encrypt를 클릭합니다.

구입한 도메인을 입력하고, 와일드카드도 입력합니다.

  • 필자의 경우
    • noriarchive.com
    • *.noriarchive.com

먼저 Use a DNS Challenge에 동의하면 다음과 같은 화면이 나타납니다.

DNS Provider를 Cloudflare로 변경하고
드래그된 부분을, 위에서 발급한 API 토큰으로 대체합니다.

약관에 동의하고 Save를 클릭하면, 1분 내로 SSL 인증서가 발급됩니다.

NPM Proxy 설정

Hosts > Proxy Hosts를 클릭합니다.

Add Proxy Host를 클릭합니다.

먼저 테스트로, NPM을 외부에서 접속할 수 있게 해 봅시다.

  • Domain Names : npm.구입한 도메인
  • Scheme : http
  • Forward Hostname / IP : 시놀로지 내부망 IP
  • Forward Port : 8181 (포트를 변경했다면 변경한 포트로)

만약 https를 사용해야 할 경우에는, Websockets Support에 체크하시는 것을 권장합니다.

이후 상단의 SSL 탭을 클릭합니다.

None을 클릭하여, 위에서 발급한 SSL 인증서를 선택합니다.

모든 설정이 끝났다면 Save를 클릭합니다.

잘 추가됐는지, 접속은 잘 되는지 확인합니다.

같은 방식으로, 기존의 DSM에서 역방향 프록시로 사용하던 것을 NPM에서 똑같이 구현할 수 있습니다.

시놀로지 Web Station의 경우, 포트를 80/443에서 다른 포트로 변경하시기 바랍니다.


도커 컨테이너, NPM 프록시로 실제 IP 받아오기

iptable을 추가하는 것으로 간단히 해결이 가능합니다.

작업 스케줄러에서 생성 > 트리거된 작업 > 사용자 정의 스크립트를 클릭합니다.

사용자를 root로 하고, 이벤트를 부트업으로 둡니다.

스크립트에 아래 코드를 붙여 넣습니다.

#!/bin/bash
currentAttempt=0
totalAttempts=10
delay=15

while [ $currentAttempt -lt $totalAttempts ]
do
	currentAttempt=$(( $currentAttempt + 1 ))
	
	echo "Attempt $currentAttempt of $totalAttempts..."
	
	result=$(iptables-save)

	if [[ $result =~ "-A DOCKER -i docker0 -j RETURN" ]]; then
		echo "Docker rules found! Modifying..."
		
		iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
		iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL ! --dst 127.0.0.0/8 -j DOCKER
		
		echo "Done!"
		
		break
	fi
	
	echo "Docker rules not found! Sleeping for $delay seconds..."
	
	sleep $delay
done

추가할 예정

  • 권한 문제로 SSL 인증서 생성 안 됨
  • host header

지금까지 CloudFlare와 Nginx Proxy Manager를 활용해
시놀로지(헤놀로지) NAS에서 와일드카드 SSL 인증서를 자동으로 갱신하고
안전하게 여러 서브도메인을 관리하는 방법을 살펴봤습니다.

한 번만 제대로 설정해두면, 더 이상 인증서 갱신 날짜를 신경 쓰지 않아도 되어 훨씬 편리하고 안정적으로 서비스를 운영할 수 있습니다.

이제 인증서 갱신 걱정 없이, 원하는 도메인 환경을 자유롭게 구축해 보시기 바랍니다.

감사합니다!

Leave a Comment