개발자 블로그를 위한 일곱걸음

홈서버를 운영하는 사람들은 홈서버에 접근하기 위해 ip를 외우거나 도메인을 구입해서 해당 ip를 연결해두어야 합니다. 서비스를 운영하기 위해 필수적으로 필요한 요소이지만 테스트를 위한 기능을 알려드리겠습니다. 대부분의 공유기에는 DDNS라는 기능을 통해 이러한 불편한 점을 해결해줍니다. 이를 통해 도메인과 인증서에 대해 한걸음 다가보겠습니다.
ip 주소는 참고만 하시고, 해킹 및 공격을 할 경우 민형사 상의 책임이 발생 할 수 있음을 알려드립니다.
현재 블로그를 운영하는 서버도 iptime 공유기를 통해 구축되어 있고, iptime의DDNS 기능을 통해, 이를 통해 손쉽게 외부에서 홈서버로 접근할 수 있습니다.

하지만 iptime의 DDNS는 한계점이 있기 때문에 이에 대한 실패와 대체재를 공유하려합니다.
DDNS란?
동적인 IP 주소를 사용하는 장치나 네트워크에 대해 고정된 도메인 이름을 매핑해주는 서비스입니다. 일반적으로 인터넷 서비스 제공업체(ISP)는 사용자의 IP 주소를 주기적으로 변경하는데, DDNS는 이러한 동적 IP 주소 변경에도 도메인 이름을 통해 항상 장치에 접근할 수 있도록 도와줍니다.
인터넷은 보통 ip가 변경되므로 장치(공유기)에서 변경된 ip를 바라보는 도메인주소 제공 서비스 라고 요약할 수 있습니다.
외부에 나와있는 상태에서 ip가 변경된다면 DDNS가 없다면, 내 홈서버의 ip를 확인 할 수 없기 때문에 NAS, CCTV, IOT 등 같은 장치들을 이용할 수 없게 됩니다. 따라서 굳이 사용하지 않더라도 외우기 쉬운 형태로 공유기 DDNS를 설정해두는 것이 좋습니다.
테스트 준비
이후 테스트를 위해 몇가지 설정을 진행하겠습니다.
먼저 ddns 네임스페이스를 생성해 이곳에서만 테스트를 진행하고 삭제할 예정입니다.
kubectl create namespace ddns
kubectl get namespace | grep ddns

그리고 helm을 통해 간단한 nginx sample을 서비스를 시작합니다.
helm upgrade --install nginx-test-1 bitnami/nginx -n ddns --set service.type=ClusterIP
kubectl get all -n ddns

--set service.type=ClusterIP 을 지정하는 이유는 metalLB가 설치된 이후로는 서비스가 자동으로 로드밸런스에 '직접' 연결되기 때문에 ingress를 활용하기 위해선 수동으로 CLusterIP로 만들어지게 합니다.
iptime DDNS 란?

iptime 공식 DDNS 설정 방법 문서
ipTIME에서 지원하는 DDNS 기능도 큰 문제 없이 사용할 수 있습니다. 설정방법은 공식 사이트의 문서를 참고해주시고, 그러나 ipTIME의 DDNS을 서비스 또는 테스트로도 사용하기 어렵게 하는 문제점이 있기 때문에 실제 테스트를 하면 살펴보도록 하겠습니다.
iptime DDNS 테스트
vi ddns-nginx-ingress-iptime.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress-iptime
namespace: ddns
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: nginx
tls:
- hosts:
- poorm.iptime.org
secretName: nginx-tls-iptime
rules:
- host: poorm.iptime.org
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-test-1
port:
number: 80
kubectl apply -f ddns-nginx-ingress-iptime.yaml
kubectl get cert -n ddns

iptime의 DDNS을 통해서는 TLS인증서 발급이 되지 않습니다.

https://poorm.iptime.org https로 들어갈 순 있지만 인증을 위한 fake 인증서만 존재해서 오히려 더 위험해 보입니다.
이는 DDNS 제공자인 ipTIME의 DDNS로 너무 많은 인증서 발급이 시도하고 실패했기 때문에 인증기관에서 인증서 발급을 차단하고 있기 때문입니다.

Duckdns 란?

이름부터 D(Duck)DNS같아 보이는 Duckdns는 첫 화면의 문구부터
free dynamic DNS hosted on AWS
무료 동적 DNS 호스트를 AWS를 통해 제공해주고 있습니다.
사용법은 다음과 같습니다.
- 간단하게 가입을 합니다.
- 중앙의 sub domain 으로 빈칸에 원하는 서브도메인 (예시로 hyobin을 입력) 입력합니다.
- add domain 버튼을 누릅니다.
- 하단에서 해당 도메인을 설정할 수 있도록 테이블이 생성됩니다.
- current ip에 서버의 ip를 입력합니다.

Duckdns 테스트
vi ddns-nginx-ingress-duckdns.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress-duckdns
namespace: ddns
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: nginx
tls:
- hosts:
- hyobin.duckdns.org
secretName: nginx-tls-duckdns
rules:
- host: hyobin.duckdns.org
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-test-1
port:
number: 80
kubectl apply -f ddns-nginx-ingress-duckdns.yaml
kubectl get cert -n ddns

ipTIME과는 다르게 duckdns는 정상적으로 인증서가 생성되었습니다.

이제 https://hyobin.duckdns.org 로 접속하면, 사용자-인터넷-공유기-포트포워딩-서버-metallb-ingress-인증서-어플리케이션 순으로 전달되어 서비스 중인 어플리케이션으로 접속하게 됩니다.
공유기의 DDNS는 통신사에서 할당하는 IP가 변경될 수 있으니 지정해서 사용
Duckdns의 DDNS는 어플리케이션을 SSL을 활용해 서비스할 때 테스트로 사용
테스트 과정 중 몇번의 시도를 거치며 도메인과 ssl설정을 위해 작업을 진행 할 수 있기 때문에 연습을 위한 과정으로 포스팅을 진행했습니다. 해당 포스팅을 이해하셨다면 굳이 적용하지 않고 다음 포스팅으로 이동해 도메인을 구하는 방법을 확인해 보시길 바랍니다.
실제로 어플리케이션을 서비스한다면 도메인을 직접 구매하는 것이 가장 좋습니다.