linux

유동 IP 서버 접속 가이드: Cloudflare와 리눅스 DDNS 자동화

jhinux 2025. 12. 16. 22:16


--------------------------------------------------------------------------------
유동 IP 서버 접속 가이드: Cloudflare와 리눅스 DDNS 자동화 
--------------------------------------------------------------------------------

이 가이드는 유동적인 공인 IP를 사용하는 홈 서버에 도메인으로 접속할 수 있도록 Cloudflare를 이용해 DDNS 자동화를 구축하고, 장비 부팅 시 한 번만 IP를 업데이트하도록 설정하는 방법입니다.

----- 1단계: 도메인 구매처 네임서버 변경 (Cloudflare 연결) -----

1.  Cloudflare 가입 및 도메인 추가: Cloudflare에 가입 후, 도메인(예: [YOUR_DOMAIN])을 추가하고 Free 플랜을 선택합니다.
2.  네임서버 주소 확인: Cloudflare가 제공하는 2개의 네임서버 주소를 복사합니다.
3.  네임서버 변경: 도메인 구매처(가비아 등)에 접속하여 도메인의 네임서버를 Cloudflare 주소로 변경합니다. (전파 완료까지 대기)

----- 2단계: Cloudflare DNS 레코드 설정 -----

1.  Cloudflare 대시보드에서 [DNS] 메뉴로 이동합니다.
2.  레코드 추가 설정:
    * Type: A
    * 이름: [YOUR_SUBDOMAIN] (예: jhwork)
    * IP 주소: 현재 사용 중인 공인 IP 주소를 임시로 입력합니다.
    * 프록시 상태: 끄기 (회색 구름)로 설정합니다.
3.  [저장]을 클릭합니다.

----- 3단계: DDNS 자동화를 위한 API 토큰 발급 -----

1.  Cloudflare [내 프로필] → [API 토큰]으로 이동합니다.
2.  'Create Custom Token'을 선택하고 다음 권한을 설정합니다.
    * Permissions: Zone -> DNS -> Edit (수정)
    * Zone Resources: Include -> Specific Zone -> [YOUR_DOMAIN]
3.  토큰을 생성하고, 화면에 나타나는 API 토큰 문자열과 도메인의 영역 ID (Zone ID)를 안전하게 보관합니다.

----- 4단계: 리눅스 DDNS 스크립트 작성 (서버 작업) -----

### A. 스크립트 파일 생성 및 권한 부여 (YOUR_USERNAME 수정)

mkdir -p /home/[YOUR_USERNAME]/bin
nano /home/[YOUR_USERNAME]/bin/ddns.sh
chmod +x /home/[YOUR_USERNAME]/bin/ddns.sh

### B. ddns.sh 스크립트 내용 (YOUR_... 부분 수정 필수)

#!/bin/bash

# --- 1. Cloudflare 인증 정보 (필수 수정) ---
CF_API_TOKEN="[YOUR_API_TOKEN]"  # 3단계에서 발급받은 토큰 입력
CF_ZONE_ID="[YOUR_ZONE_ID]"      # 도메인의 영역 ID 입력

# --- 2. DDNS 설정 정보 ---
DDNS_RECORD_NAME="[YOUR_SUBDOMAIN]"  # 예: jhwork
DDNS_FULL_NAME="${DDNS_RECORD_NAME}.[YOUR_DOMAIN]" # 예: jhwork.hyeon.store

# --- 3. 실행 환경 설정 ---
CF_API_ENDPOINT="https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records"
CURRENT_IP=$(curl -s https://api.ipify.org)
# 로그 디렉토리와 파일 설정
LOG_DIR="/home/[YOUR_USERNAME]/ddns-log"
mkdir -p "$LOG_DIR"
LOG_FILE="$LOG_DIR/ddns.log"

# --- 함수: 로그 기록 ---
log() {
    echo "[$($(which date) '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}

# --- 함수: DNS 레코드 ID 가져오기 ---
get_record_id() {
    RECORD_ID=$(curl -s -X GET "${CF_API_ENDPOINT}?type=A&name=${DDNS_FULL_NAME}" \
    -H "Authorization: Bearer ${CF_API_TOKEN}" \
    -H "Content-Type: application/json" | $(which grep) -oP '(?<="id":")[^"]*')
    
    if [ -z "$RECORD_ID" ]; then
        log "오류: DNS 레코드 ID를 찾을 수 없습니다."
        exit 1
    fi
    echo "$RECORD_ID"
}

# --- 함수: 현재 Cloudflare에 등록된 IP 가져오기 ---
get_cf_ip() {
    curl -s -X GET "${CF_API_ENDPOINT}?type=A&name=${DDNS_FULL_NAME}" \
    -H "Authorization: Bearer ${CF_API_TOKEN}" \
    -H "Content-Type: application/json" | $(which grep) -oP '(?<="content":")[^"]*'
}

# --- 메인 로직 시작 ---
log "----------------------------------------"
log "현재 공인 IP 확인: ${CURRENT_IP}"

if [ -z "$CURRENT_IP" ]; then
    log "오류: 현재 IP 주소를 가져오지 못했습니다."
    exit 1
fi

CF_IP=$(get_cf_ip)
log "Cloudflare에 등록된 IP: ${CF_IP}"

if [ "$CURRENT_IP" == "$CF_IP" ]; then
    log "IP 주소가 동일합니다. 업데이트 불필요."
    exit 0
fi

log "IP 주소 불일치. 업데이트 시작..."
RECORD_ID=$(get_record_id)

UPDATE_RESPONSE=$(curl -s -X PUT "${CF_API_ENDPOINT}/${RECORD_ID}" \
    -H "Authorization: Bearer ${CF_API_TOKEN}" \
    -H "Content-Type: application/json" \
    --data '{"type":"A","name":"'${DDNS_RECORD_NAME}'","content":"'${CURRENT_IP}'","ttl":120,"proxied":false}')

if echo "$UPDATE_RESPONSE" | $(which grep) -q '"success":true'; then
    log "성공: Cloudflare DNS 레코드 (${DDNS_FULL_NAME})가 ${CURRENT_IP}로 업데이트되었습니다."
else
    log "오류: Cloudflare 업데이트 실패. 응답: ${UPDATE_RESPONSE}"
fi

exit 0

----- 5단계: Systemd 서비스 등록 (부팅 시 1회 실행) -----

1.  서비스 파일 제작 (sudo nano /etc/systemd/system/ddns.service)

[Unit]
Description=Cloudflare DDNS Single-Shot Update
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/home/[YOUR_USERNAME]/bin/ddns.sh
User=[YOUR_USERNAME]
Group=[YOUR_USERNAME]
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

2.  활성화 및 테스트 실행

sudo systemctl daemon-reload
sudo systemctl enable ddns.service 
sudo systemctl start ddns.service

# 로그 확인
cat /home/[YOUR_USERNAME]/ddns-log/ddns.log

--------------------------------------------------------------------------------

'linux' 카테고리의 다른 글

데비안 마클홈 Gemini-CLI  (0) 2026.01.08
rpm 패키지 관리  (0) 2026.01.05
NVM 리눅스 설치 및 사용법  (0) 2025.11.29
외부 접속을 위한 WSL2 SSH  (0) 2025.11.17
WSL2 가이드 정리  (0) 2025.11.15