DoVirus.kr

728x90

자신이 보유한 도메인을 DDNS 서비스 하듯이 IP에 따라서 변경을 하고

해당 도메인에 대해서 SSL 인증서를 적용하자

 

자 일단 이 일의 시작은 시놀로지의 HDD 절전 때문이다.

시놀로지는 그냥 패킷 하나 발생해도 절전모드를 해제해 버리기 때문에 절전모드는 그냥 포기하는게 좋을 것 같다

아무튼 그 빈도를 하나라도 줄이고자 synology.me 라던지 하는 시놀로지 제공 DDNS 와 quickconnect 를 꺼버렸다.

iptime 공유기도 사용하기 때문에 iptime.org 도메인으로 ddns 연결은 가능하지만 인증서 발급이 안되는 도메인이기에...

 

자 시작하자.

준비물 asus 공유기(멀린펌) 또는 시놀로지 NAS 또는 라즈베리파이 등등 리눅스 서버

 

 

가. 개인 도메인을 DDNS로 연결하기

참고 seolin.tistory.com/118

 

1. 보유 도메인의 DNS 변경

1차 samara.ns.cloudflare.com

2차 watson.ns.cloudflare.com

자신이 보유한 도메인 관리 업체에 로그인하여 위와 같이 바꾼다.

위 DNS는 바뀌기도 하니 www.cloudflare.com  에서 직접 확인해 보도록 하자.

 

2. cloudflare.com 가입하기

무료 회원 가입하면 된다.

 

3. DDNS로 사용할 도메인 주소 등록

Type : A 

Name : nas (예제)

IPv4 address : 1.1.1.1 (일단 임시 등록)

 

자세한 내용은 seolin.tistory.com/118 참고하도록 한다.

 

4. DDNS 자동 갱신

등록 절차를 마쳤으면 API 주소 확인하기.

토큰이니 zone id 이니 있는데 전부 메모장에 기재하도록 하자.

중요한 데이터이니 외부에 노출되는 일이 없도록 하자.

라즈베리는 위 링크 따라하도록하고

asus 공유기는 blog.gomgom.net/setting-cloudflare-ddns-on-asus-router/

 

ASUS 공유기에서 개인도메인 CloudFlare DDNS 설정하기 (멀린롬 사용) [2016/07/24 전면개정]

ASUS 공유기를 통해 CloudFlare DNS(DDNS)를 이용하고 싶을 때, 멀린롬을 활용하여 CloudFlare에 동적 IP를 전송하는 방법에 대해 설명합니다.

blog.gomgom.net

이 절차를 따라하도록 하자.

하나 수정 하자면 현재 자신의 IP 주소가 나와 있는 스크립트

 

NEW_IP='wget http://ipinfo.io/ip -qO -' 이 부분을

 

NEW_IP=$(wget http://ipinfo.io/ip -qO -) 이렇게 수정 하자

 

위의 절차대로 API 값 입력하여 파일 생성 및 자동 갱신 등록 완료 되었다면

해당 스크립트를 실행 하면 cloudflare.com 에서 현재 IP 주소로 갱신이 되는걸 볼 수 있다.

-- 아래 내용 변경 사항 추가 --

 

 

이제 절반 왔다.

 

6. 인증서 발급 받기

이제 자신의 도메인으로 인증서를 발급 받아야 한다.

Let's encrypt 에서 받는다. 3개월마다 갱신해야 하는대신 무료이다.

귀찮으면 1년짜리 돈주고 사면 된다.

 

인증서 발급 참조 blog.naver.com/jcjee2004/221831609605

 

[Synology] 시놀로지에 Let's Encrypt 와일드카드 인증서 적용하기

시놀로지의 제어판에서 발급 받을 수 있는 Let's Encrypt 인증서는 90일 짜리 SSL 인증서 입니다...

blog.naver.com

시놀로지는 GUI상에서 발급 받을수 있도록 하는 메뉴가 있는데 이상하게 잘 안된다.

그냥 와일드 카드로 받아버리면 만사 해결 도 되고 추가로 리버스 프록시 주소 생성해서 확장하기에도 좋다.

 

-내용 추가-

갑자기 어느 순간부터 갱신이 안된다

2가지 문제가 있었는데

첫번째는 인증서 발급 절차에서

Domain: '_acme-challenge.내 도메인'

TXT value: "키 값"

 

위 값이 추가 되었다(변경 되었다?) 그래서 본인은 총 4개의 값을 dns에 입력하였다

 

두번째는 인증서 갱신 위치 변경

/usr/syno/etc/certificate/_archive

본래 위의 경로 하단에 있는 위치에서 인증서 갱신을 해주고 nginx 리로딩 또는 리스타트를 해주면 적용이 되었는데

/usr/syno/etc/certificate/system/default/

이 경로도 같이 바꿔줘야 적용이 되었다

리버스 프록시 때문인지 암튼 저 경로들 추가하면 되었다.

 

 

-내용 추가-

먼저 _acme-challenge 값이 너무 자주 바뀐다 1개월에 한번은 바뀌는 것 같다

그래서 이걸 자동 등록 해주는 스크립트를 짜 봤다

 

우선 기존에 시놀로지에 등록하는 발급 acme.sh 가

/파일 경로/acme.sh --renew --dns --force -d 도메인.kr --yes-I-know-dns-manual-mode-enough-go-ahead-please

이와 같았을 건데

 

/파일 경로/acme.sh --renew --dns --force -d 도메인.kr --yes-I-know-dns-manual-mode-enough-go-ahead-please --server letsencrypt &> /파일 경로/acme_result.txt 2>&1

 

이와 같이 수정하면

acme.sh 가 있는 경로에 acme_result.txt 라는 파일에 _acme-challenge 값의 기록이 남게 된다.

 

그럼 dns_txt_record.sh 라는 스크립트를 하나 더 만들어서 위의 내용을 cloudflare 에 curl 을 이용하여 등록 하게 되는 것인데 이게 조금 복잡 하다

 

먼저 4번 항목에서 기존에 사용하던 주소가 아니다 api 주소가 다르다

 

curl -X GET "https://api.cloudflare.com/client/v4/zones/{API 키 영역ID}/dns_records/" \
     -H "X-Auth-Email: {이메일 주소 입력}" \
     -H "X-Auth-Key: {Global API Key 입력}" \
     -H "Content-Type: application/json" \

위의 정보를 입력하면 _acme-challenge 필드의 ID 값을 알 수 있다

위의 api 키 영역 ID와 _acme-challenge 라고 써 있는 필드에 선두에 있는 id 값이 그것에 해당 한다

그 필드의 content 값을 변경해 주면 acme.sh 를 통하여 자동 업데이트 스크립트가 완성 되는 것이다.

 

cat /파일 경로/acme_result.txt | grep value > /파일 경로/acme_result_txt.txt
sed "s/...........................................//" /파일 경로/acme_result_txt.txt > /파일 경로/acme_result_txt1.txt
sed "s/.$//" /파일 경로/acme_result_txt1.txt > /파일 경로/acme_result_txt2.txt
sed "2d" /파일 경로/acme_result_txt2.txt > /파일 경로/acme_result_txt2_1.txt
sed "1d" /파일 경로/acme_result_txt2.txt > /파일 경로/acme_result_txt2_2.txt

value1=$(</파일 경로/acme_result_txt2_1.txt)

if ! [ -z $value1 ]; then
curl -X PUT "https://api.cloudflare.com/client/v4/zones/{영역id 값}/dns_records/{수정할 필드의 id값}" \
     -H "X-Auth-Email: {이메일 주소}" \
     -H "X-Auth-Key: {글로벌 키값}" \
     -H "Content-Type: application/json" \
     --data "{\"type\":\"TXT\",\"name\":\"_acme-challenge\",\"content\":\"$value1\",\"ttl\":1,\"proxied\":false}"

#위에 --data 한 줄임

else

echo "fail"

fi

 

위의 내용을 dns_txt_record.sh 라는 파일에 넣고 

chmod 755 dns_txt_record.sh 

로 실행 권한을 주고

 

시놀로지 스케쥴러에 acme.sh 밑에 줄에 같이 등록해 주면 된다.

acme.sh 에서 실행 되는 응답 값을 acme_result 에 저장하고 그 값에서 _acme 값을 추출하여

해당 값만 놔두고 나머지를 하나하나 지우는 방식의 작업으로 진행 했다

 

사실 저 행위 전체를 변수로 진행해도 결과는 같았을 것이라 문제 없지만

진행 상황을 한단계씩 확인 하기 위해서 저렇게 만들 었다가 수정하기 귀찮아서 그냥 쓰는 중이다.

 

 

 

 

728x90