본문 바로가기
Tip

ip가 동적으로 변경될때 ddns를 사용해서 도메인으로 접속 duckdns, ssl 인증 (zelossl), 윈도우스케줄러 스크립트 cmd 숨기기, nest 외부접속

by leopard4 2025. 3. 23.

# 개인참고용 이므로 많이 축약됨

 

고정아이피는 유료 서비스이다.

때문에 DDNS를 이용해서 아이피가 변경되더라도 외부접속을 가능하게하려고 했다.

 

Cloudflare 가입후 api키를 발급받으면 편하다.

그런데 나는 duckDNS를 재미삼아 해봤다.

 

[window10에서 테스트]

 

1. DuckDNS의 특징

  • 무료 : 광고나 제한 없이 완전히 무료로 사용 가능합니다.
  • 커스텀 도메인 : yourname.duckdns.org 형식의 서브도메인을 제공합니다.
  • 다양한 플랫폼 지원 : Windows, Linux, macOS, 라즈베리파이, 공유기 등에서 클라이언트 실행 가능.
  • 간단한 API : IP 업데이트를 위해 HTTP 요청만으로 관리할 수 있습니다.
  • IPv6 지원 : IPv4와 IPv6 모두 호환됩니다.

2. DuckDNS 사용 방법

1단계: 계정 생성

  1. DuckDNS 홈페이지 에 접속합니다.
  2. Sign Up 을 클릭하고, Google계정으로 로그인합니다.
    • 이메일 주소나 별도의 비밀번호는 필요 없습니다.

2단계: 도메인 추가

  1. 대시보드에서 **"Add Domain"**을 클릭합니다.
  2. 원하는 이름(예: myhome)을 입력하면 myhome.duckdns.org가 생성됩니다.
  3. "Create" 버튼을 눌러 저장합니다.

3단계: 클라이언트 설정 (IP 자동 업데이트)

DuckDNS는 IP가 변경될 때마다 도메인 레코드를 업데이트하는 클라이언트 스크립트 를 제공합니다.
아래 방법 중 하나를 선택해 설정합니다.

 

레코드란 말은 그냥 신경쓸 필요없다. 그냥텍스트다

ip -> 도메인 연결하는 텍스트를 레코드라고 하는듯

 

duckdns_update.bat 파일 :   (이 코드는 duckdns에 ip갱신 업데이트를 보내는거다)

@echo off
set DUCKDNS_TOKEN="your duck token"
echo [%date% %time%] DuckDNS 업데이트 시작 >> C:\duckdns_update.log
curl -k "https://www.duckdns.org/update?domains='your domain'&token=%DUCKDNS_TOKEN%" >nul 2>&1
echo [%date% %time%] DuckDNS 업데이트 완료 >> C:\duckdns_update.log
exit

이 파일을 윈도우 스케줄러에 등록하고 5분간격으로 실행하게 하면된다 .

근데 이렇게하면 cmd창이 5분마다 켜져서 거슬리는데

 

때문에 업데이트 로그 찍는거랑 

 >nul 2>&1 

exit 같은걸로 해결해보려고 했지만 안됬다.

 

아무튼 해당스케줄 속성에서 일반 - 보안옵션 - 사용자의 로그온 여부에 관계없이 실행 체크- 가장높은 수준 권한 체크-

숨김 체크 하면 된다.

 

그다음 공유기에서 필요한 포트를 개방한다.

 

그리고 테스트로 nestjs 서버를 띄우고 

3000번 포트로 접속하면

신뢰할수없는 사이트라고 뜨는데 

 

ca인증을 받아야 ssl 통신이 가능하다. 

서버단에서 nginx로 설정도 가능하긴하다고 하는거같으나 뭐암튼 

받으면 좋으니 받는다.

 

보통 Certbot으로 받는거같은데 

 

나는 DNS-01 챌린지로 발급 했다.

1.acme.sh 스크립트 설치:

curl https://get.acme.sh | sh

2.DuckDNS API 키 설정 :

export DUCKDNS_TOKEN="your token"

3.인증서 발급:

acme.sh --issue --dns dns_duckdns -d "your domain"

 

그런데 이렇게하면 아마 에러가 뜰거다.

 

경로문제면 

# acme.sh 전체 경로로 실행
/c/Users/W10/.acme.sh/acme.sh --issue --dns dns_duckdns -d "your domain"

 

환경변수 문제면

Windows 시스템 PATH 추가

  1. 환경 변수 설정 :
    • 제어판 → 시스템 → "고급 시스템 설정" → "환경 변수".
    • 시스템 변수 에서 Path 선택 → 편집 .
    • C:\Users\W10\.acme.sh 추가.
  2. 터미널 재시작 :
    • Git Bash 또는 CMD를 완전히 종료 후 다시 실행.

3. 인증서 발급 명령어 재시도

# DUCKDNS_TOKEN 설정 확인

export DUCKDNS_TOKEN="토큰"



# 인증서 발급 (DNS-01 챌린지)

/c/Users/W10/.acme.sh/acme.sh --issue --dns dns_duckdns -d "도메인"

 

socat경고는 무시한다.

  • acme.sh는 자동으로 인증서 갱신 작업을 스케줄링합니다.

인증서 설치 확인

  • 인증서 저장 경로 :
     
    gitbash
ls -l ~/.acme.sh/도메인_ecc

 

마지막 _ecc에 주의하자

 

그런데 아마 없을거다 왜냐면

요새는 ZeroSSL이 기본인증기관으로 사용된다고 하는듯

이거 로그인해야함

 

# 이메일 주소로 ZeroSSL 계정 등록

BASH

/c/Users/W10/.acme.sh/acme.sh --register-account -m your_email@example.com

그럼 콘솔에 머 사이트인증하라고 하는데 누르면댐

 

인증서 재발급

# DNS 챌린지로 인증서 발급
/c/Users/W10/.acme.sh/acme.sh --issue --dns dns_duckdns -d 도메인

 

근데아마 또 안될건데

 

bash

# 환경 변수에 DuckDNS 토큰이 설정되었는지 확인
echo $DUCKDNS_TOKEN

출력결과로 토큰이 나와야댐

 

근데 안나올건데 

환경변수 미인식 문제임

 

시스템 환경변수에 새로만들기하고 

변수이름 DuckDNS_Token

변수값 토큰 넣고 

 

bash 재실행한다음에 재인증하면댐

/c/Users/W10/.acme.sh/acme.sh --renew -d 도메인 --force --debug

 

 

잘됬으면 

C:\Users\W10\.acme.sh\도메인_ecc  디렉토리안에

도메인.key 이거랑 

fullchain.cer 이게 있어야함. (이게중요함 이건 인증되야만 생김)

 

typescript 예시

// main.ts
const certPath = path.join('C:', 'Users', 'W10', '.acme.sh', '도메인.org_ecc');
const httpsOptions = {
  key: fs.readFileSync(path.join(certPath, '도메인.key')),
  cert: fs.readFileSync(path.join(certPath, 'fullchain.cer')),
};

 

인증서 파일위치 시각화

C:\Users\W10\.acme.sh
└── 도메인.org_ecc
    ├── 도메인.key
    ├── fullchain.cer
    └── ...

 

포트포워딩 예시

외부 포트
내부 IP
내부 포트
프로토콜
3000
192.168.x.x (서버 IP)
3000
TCP/UDP
80
192.168.x.x
80
TCP

 

내컴터는 172로 시작하더라 

아무튼 172랑 192가 표준규격임

 

cmd 에서 ipconfig 치면 나옴

 

포트 열렸는지 확인

CanyouSeeMe 에서 3000 포트가 열렸는지 확인

 

HTTP → HTTPS 리다이렉트 수정

  • 포트 80 리스닝 확인 :
  •  
// main.ts
http.createServer(httpApp).listen(80, '0.0.0.0', () => {
  console.log('HTTP server running on port 80');
});

 

이렇게 하면 외부에서

도메인:80 포트로 접속했을때 

3000으로 매핑?? 리디렉션?? 암튼 그렇게되서 연결됨