--------------------------------------------------------------------------------
유동 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 |