티스토리 뷰

GCE는 기본적으로 VM을 실행하면 외부 IP(공인 IP, Public IP, External IP)을 제공한다.

근데 이 IP는 재기동을 할 때마다 변동이 되어 도메인을 사용하여 VM IP를 지정할때 불편한 점이 있다.


그렇다고 고정 IP를 사용하자니 추가적으로 돈이 발생하는데 굳이 고정 IP까지는 필요 없는 상황이다.


하여, DDNS를 사용하여 재기동 시마다 자동적으로 바뀌는 외부 IP를 설정해주어 보자.


필자의 환경

1. GCE VM Instance

2. CentOS 7

모든 내용은 VM 내 쉘에서 진행이 된다.


먼저 나는 CloudFlare에서 제공하는 api를 사용하여 DDNS 서비스를 사용하고 있다.


위 서비스를 사용하기 위해선

1. 자신의 도메인을 CloudFlare에 등록한다.

2. VM을 등록한 A Record를 등록한다.

3. Global API Key를 발급받는다.


자 인제 API를 사용하여 VM에서 변동이되는 외부 IP를 찾아 A Record에 있는 IP를 변경시켜보자.


그런데 CloudFlare에서는 A Record 변경을 위한 api를 호출할 때, A Record의 Record ID 값을 알아야 한다. 근데 그게 웹에서는 안보이는... =-=


하여, 아래 쉘을 실행하여 자신이 등록한 A Record ID를 알아보자.

물론 본인에 알맞게 수정하고..


EMAIL=hdj997@gmail.com # Your CloudFlare E-mail address

ZONE=ddangjin.com # The zone where your desired A record resides

API=0a0a0a0a0a0a0a0a0a0a0a # Your CloudFlare API Key


curl -k https://www.cloudflare.com/api_json.html \

  -d "a=rec_load_all" \

  -d "tkn=$API" \

  -d "email=$EMAIL" \

  -d "z=$ZONE"


그러면 엄청 긴 내용을 받을 수 있다.

예를 들어 자신이 등록한 a 레코드가 "test" 라면 display_name이 test인 애의 숫자로만 이루어져 있는 rec_id 값을 갖고오면 된다.


자, 인제 레코드 id 값도 알았겠다.

레코드 값을 변경하는 api를 날리는 쉘 스크립트를 짜보자.

자신이 원하는 이름으로 아래 쉘을 저장한다.

필자는 change-ddns.sh 로 저장하겠다.


#!/usr/bin/sh


EMAIL=hdj997@gmail.com # Your CloudFlare E-mail address

ZONE=ddangjin.com # The zone where your desired A record resides

RECORDID=0000000000 # ID of the A record

RECORDNAME=test # Name of the A record

API=0a0a0a0a0a0a0a0a0a0a0a # Your CloudFlare API Key

IP=`curl -s "http://metadata/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip" -H "X-Google-Metadata-Request: True"`


curl -fs -o /dev/null https://www.cloudflare.com/api_json.html \

  -d "a=rec_edit" \

  -d "tkn=$API" \

  -d "email=$EMAIL" \

  -d "z=$ZONE" \

  -d "id=$RECORDID" \

  -d "type=A" \

  -d "name=$RECORDNAME" \

  -d "ttl=1" \

  -d "content=$IP"


위 IP 변수 지정 부부은 GCE에서 제공하는 메타데이터를 사용한 공인 ip를 알아오는 방법이다.


자 그러면, VM이 재기동 될때마다 IP가 변동이 되는 것이니 VM이 시작될 때 위 스크립트가 실행되게 해보자.


CentOS 7에서 systemd를 사용하면서 기존에 있던 /etc/rc.d/rc.local을 기본적으로 실행하지 않는다.


물론 systemd를 사용한 시작 스크립트 등록 방법도 있지만 여기선 간단하게 rc.local을 사용해 보겠다.


방법은 간단하다. rc.local에 실행권한을 주면 된다.

chmod +x /etc/rc.d/rc.local


그 후, 우리가 만든 스크립트를 실행하는 내용을 rc.local의 마지막 줄에 적어주자.

/path/to/change-ddns.sh


그리고, 우리 스크립트에도 실행권한을 주자.

chmod +x /path/to/change-ddns.sh


자 인제, 재부팅을 하여 정상작동하는지 확인해 보자.


잘 작동되는 것을 확인할 수 있을 것이다!

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함