๋ณธ ์๋ฆฌ์ฆ๋ Ubuntu Server 20.04 ๋ฒ์ ์ ๊ธฐ์ค์ผ๋ก ํ๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ DDNS๋ฅผ ์ค์ ํ๋ ๊ณผ์ ์ ๋ค๋ฃฐ ์์ ์ด๋ค.
DDNS, Dynamic DNS๋ ์ค์๊ฐ์ผ๋ก DNS๋ฅผ ๊ฐฑ์ ํ๋ ๋ฐฉ์์ด๋ค.
์ฃผ๋ก ๋๋ฉ์ธ์ IP๊ฐ ์ ๋์ ์ธ ๊ฒฝ์ฐ ์ฌ์ฉ๋๋ค. IP๊ฐ ๋ฐ๋์ด๋ DDNS๋ก ์ค์ ํ ๋๋ฉ์ธ ๊ฐ์ ๋ณํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฉ์ดํ๊ฒ ์ ์ ๊ฐ๋ฅํ๋ค.
ํ์์ ๊ฒฝ์ฐ์๋ ์ผ๋ฐ ๊ฐ์ ์ ์ธํฐ๋ท ํ์ ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ณต์ธ IP ์ฃผ์๊ฐ ๋ณ๊ฒฝ๋ ์ ์๊ธฐ์ DDNS ์ค์ ์ด ๋ฐ๋์ ํ์ํ๋ค.
๋ง์ฝ AWS, GCP ๋ฑ์ ํด๋ผ์ฐ๋ ์๋น์ค๋ฅผ ์ด์ฉํ๋ค๋ฉด DDNS ์ค์ ๊ณผ์ ์ ์๋ตํด๋ ๋ฌด๋ฐฉํ๋ค.
ํ์๋ API๋ฅผ ์ด์ฉํด DDNS๋ฅผ ์ฌ์ฉํ ์ ์๋ Cloudflare๋ฅผ ์ด์ฉํ ์์ ์ด๋ค.
๋ง์ผ ๋ณธ์ธ์ ๋๋ฉ์ธ์ ์ฐ๊ฒฐ๋ DNS๊ฐ DDNS ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค๋ฉด ๊ทธ๊ฒ์ ์ด์ฉํด๋ ๋ฌด๋ฐฉํ๋ค.
Cloudflare์ ๊ฐ์ ํ์.
๋ฌด๋ฃ ์๊ธ์ (Free Plan)์ ์ ํํ๋ฉด ๋๋ค.
Cloudflare ๊ฐ์ ์ดํ์๋ ๋ณธ์ธ ๋๋ฉ์ธ์ Cloudflare์ ์ฐ๊ฒฐํ๋ค.
๋๋ฉ์ธ์ ์ฐ๊ฒฐํ ์ดํ์๋ DNS ๋ ์ฝ๋์ ์์ ์ด ๊ธฐ์กด์ ์ฌ์ฉํ๋ DNS ๋ ์ฝ๋๋ฅผ ๋น ์ง์์ด ์ ๋ ฅํ๋ค.
๋ก๊ทธ์ธ์ด ๋ ์ํ๋ผ๋ฉด Cloudflare API Key ํ์ธ ๋งํฌ์ ์ ์ํด Global API Key๋ฅผ ํ์ธํ๊ณ ๋ฉ๋ชจํด๋์.
nano ํธ์ง๊ธฐ๋ฅผ ์ด์ฉํด ์ ์คํฌ๋ฆฝํธ ํ์ผ์ ์์ฑํ์.
(vi๋ฅผ ์ด์ฉํด๋ ๋ฌด๋ฐฉํจ)
sudo nano /usr/local/etc/ddns-cloudflare.sh
์๋ ์คํฌ๋ฆฝํธ ์ค Login_Email
, Global_API_Key
, Domain
, A_Record
ํญ๋ชฉ์ ๋ณธ์ธ์ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค.
#!/bin/bash
### CloudFlare A Recoard Updater
### A_Record : Separate the contents with commas (,)
### Proxied : true or false
### TTL : Between 120 and 2147483647 seconds, or 1 for automatic
### To force updating, run with -f
Login_Email=id@example.com
Global_API_Key=hadbkv85sf68hgueaf89o9svgoidbki73o92
Domain=example.com
A_Record=example.com,sub.example.com
Proxied=true
TTL=1
[ ! -f /var/tmp/ip.txt ] && touch /var/tmp/ip.txt
CIP=$(curl -s "https://ipv4.icanhazip.com/")
PIP=$(cat /var/tmp/ip.txt)
echo -e "CloudFlare A Recoard Updater v1.0.9"
echo -e "Current IP: $CIP"
echo -e "Previous IP: $PIP"
if [ "$CIP" == "$PIP" ] && [[ $1 != "-f" ]]; then
echo "No need to update"; exit 0
elif [[ $1 == "-f" ]]; then
echo "Force updating A recoard......"
elif [ "$CIP" != "$PIP" ]; then
echo "Updating A recoard......"
fi
echo $CIP > /var/tmp/ip.txt
V4="https://api.cloudflare.com/client/v4/zones"
H1="-HX-Auth-Email:$Login_Email"
H2="-HX-Auth-Key:$Global_API_Key"
H3="-HContent-Type:application/json"
ZN=$(curl -s -X GET "$V4?name=$Domain" \
$H1 $H2 $H3 | grep -Po '(?<="id":")[^"]*' | head -1)
string=$A_Record
IFS=',' ARARY=(${string})
function AID() {
for AREC in "${ARARY[@]}"
do
(curl -s -X GET "$V4/$ZN/dns_records?name=$AREC" \
$H1 $H2 $H3 | grep -Po '(?<="id":")[^"]*' | head -1)
done
}
IFS=$'\n' AIDARY=($(AID))
ATOTAL=${#ARARY[*]}
for ((i=0; i<$ATOTAL; i++))
do
(curl -s -X PUT "$V4/$ZN/dns_records/${AIDARY[$i]}" $H1 $H2 $H3 \
--data "{\"type\":\"A\",\"name\":\"${ARARY[$i]}\",\"content\":\"$CIP\",\"proxied\":$Proxied,\"ttl\":$TTL}" \
| grep -Po '(?<="name":")[^"]*|(?<="content":")[^"]*|(?<=Z"},)[^}]*|(?<="success":false,)[^$]*|(?<=\s\s)[^$]*' | xargs)
done
Login_Email
: CloudFlare์ ๋ก๊ทธ์ธํ ๋ ID๋ก ์ฌ์ฉํ๋ ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ์
๋ ฅํ๋ค.
Global_API_Key
: ์์ ํ์ธํ CloudFlare์ Global API Key๋ฅผ ์
๋ ฅํ๋ค.
Domain
: CloudFlare์ ๋ฑ๋กํ ๋๋ฉ์ธ์ ์
๋ ฅํ๋ค. 1๊ฐ๋ง ์ ์ฉ์ด ๊ฐ๋ฅํ๋ค.
A_Record
: Domain ํญ๋ชฉ์ ์
๋ ฅํ ๋๋ฉ์ธ์ ๋ฃจํธ ๋๋ฉ์ธ ๋ฐ ์๋ธ๋๋ฉ์ธ์ ๋ชจ๋ ๊ธฐ์
ํ๋ค.
๊ฐ๊ฐ์ ๊ตฌ๋ถ์ ์ผํ ,๋ก ํ๋ค. ์ด ๋๋ฉ์ธ๋ค์ ๋ชจ๋ CloudFlare์ DNS ๋ ์ฝ๋์ ๋จผ์ ์์ฑ๋์ด ์์ด์ผ ํ๋ค.
Proxied
: CloudFlare์ CDN, SSL ๋ฑ์ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ด์ฉํ๋ ค๋ฉด true๋ฅผ ์
๋ ฅํ๊ณ , ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ด์ฉํ์ง ์๊ณ DNS๋ง ์ด์ฉํ๋ ค๋ฉด false๋ฅผ ์
๋ ฅํ๋ค.
TTL
: TTL ๊ฐ์ ์ด ๋จ์๋ก ์
๋ ฅํ๋๋ฐ, ์ด๋ ์์ ๋ถํฐ TTL์ ์์๋ก ๋ณ๊ฒฝํ ์ ์๊ฒ ๋์๋ค. ๋ฐ๋ผ์ 1์ ์
๋ ฅํด Auto๋ก ์ค์ ํ๋ค. ๋ค๋ฅธ ๊ฐ์ ์
๋ ฅํด๋ Auto๋ก ์ ์ฉ๋๋ค.
์ด ์คํฌ๋ฆฝํธ๋ Domain ํญ๋ชฉ์ 1๊ฐ์ ๋๋ฉ์ธ๋ง ์ ๋ ฅํ ์ ์์ผ๋ฏ๋ก, ๋ง์ผ CloudFlare์ ์ฌ๋ฌ ๊ฐ์ ๋๋ฉ์ธ์ ๋ฑ๋กํ๋ค๋ฉด ์ด ์คํฌ๋ฆฝํธ ํ์ผ์ ์ฌ๋ฌ ๊ฐ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
ํธ์ง์ ๋ง์ณค์ผ๋ฉด Ctrlํค์ xํค๋ฅผ ๋์์ ๋๋ฌ์ nano ํธ์ง๊ธฐ๋ฅผ ๋น ์ ธ๋์ค๋ฉด์ ์ ์ฅํ๋ค.
์คํฌ๋ฆฝํธ์ ์คํ ๊ถํ์ ๋ถ์ฌํ๋ค.
sudo chmod u+x /usr/local/etc/ddns-cloudflare.sh
-f ์ต์ ์ผ๋ก ์ด ์คํฌ๋ฆฝํธ๋ฅผ ์คํํด์ CloudFlare์ DNS๋ฅผ ์ต์ด๋ก ์ ๋ฐ์ดํธํ๋ค.
sudo /usr/local/etc/ddns-cloudflare.sh -f
-f ์ต์ ์ ๋ถ์ด๋ฉด ์ฐ๋ถํฌ ์๋ฒ์ IP ์ฃผ์ ๋ณ๊ฒฝ ์ฌ๋ถ์ ์๊ด์์ด ํ์ฌ์ IP ์ฃผ์๋ก CloudFlare์ DNS๋ฅผ ์ ๋ฐ์ดํธํ๊ณ , -f ์ต์ ์์ด ์คํํ๋ฉด IP ์ฃผ์๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง CloudFlare์ DNS๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
์
๋ฐ์ดํธ์ ์ฑ๊ณตํ์ผ๋ฉด example.com 123.123.123.123 success:true,errors:[],messages:[]
ํํ์ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๊ณ , CloudFlare ๋์๋ณด๋์์ DNS ๋ ์ฝ๋๋ฅผ ํ์ธํ๋ฉด IP ์ฃผ์๊ฐ ์
๋ฐ์ดํธ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ทธ๋ค์, ์ด ์คํฌ๋ฆฝํธ๋ฅผ ์ฐ๋ถํฌ ์๋ฒ์ ์์ ์ค์ผ์ค๋ฌ์ ๋ฑ๋กํด์ ์ฃผ๊ธฐ์ ์ผ๋ก IP ์ฃผ์๋ฅผ ํ์ธํ๊ณ ์ ๋ฐ์ดํธํ๋๋ก ์ค์ ํ์.
์ฐ๋ถํฌ ์๋ฒ์ ์์ ์ค์ผ์ค๋ฌ crontab์ ํธ์ง ๋ชจ๋๋ก ์คํํ๋ค. ๋ง์ผ ์ด๋ค ํธ์ง๊ธฐ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๊ณ ๋ฌผ์ด์ค๋ฉด nano ํธ์ง๊ธฐ๋ฅผ ๋ปํ๋ ์ซ์๋ฅผ ์ ๋ ฅํ๋ค.
sudo crontab -e
์ํ๋ ์๊ฐ์ ์ฃผ๊ธฐ๋ก ddns ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋๋ก ์ค์ ํ์.
*/5 * * * * /usr/local/etc/ddns-cloudflare.sh
*/5 * * * *
๋ถ๋ถ์ ์ผ์ชฝ๋ถํฐ ๋ถ, ์, ์ผ, ์, ์์ผ์ ์๋ฏธํ๋ค.
์์ ๊ฐ์ด ์์ฑํ๋ฉด 5๋ถ๋ง๋ค ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ค.
๋ณธ์ธ์ด ์ํ๋ ์ค์ผ์ค์ crontab์ ๋๋ถ๋ถ์ ๊ธฐ๋กํ๊ณ , Ctrl ํค์ x ํค๋ฅผ ๋์์ ๋๋ฌ nano ํธ์ง๊ธฐ๋ฅผ ๋น ์ ธ๋์ค๋ฉด์ ์ ์ฅํ๋ค.
sudo crontab -l
๋ช
๋ น์ผ๋ก crontab์ ๋ด์ฉ์ ํ์ธํ ์ ์๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ DDNS๋ฅผ ์ค์ ํ๋ ๊ณผ์ ์ ๋ค๋ค๋ค.
๋ค์ ํฌ์คํ ์์๋ Let's Encrypt ๋ฌด๋ฃ ์ธ์ฆ์ ๋ฐ๊ธ ๋ฐ ์๋๊ฐฑ์ ์ค์ ๊ณผ์ ์ ๋ค๋ฃฐ ์์ ์ด๋ค.
์๋ ํ์ธ์. ์์ ๋ถํฐ ์ ๋ณด๊ณ ๋ฐ๋ผํ๊ณ ์์ต๋๋ค.
/usr/local/etc/ddns-cloudflare.sh: line 31: /var/tmp/ip.txt: Permission denied
mydomain.com myip success:true,errors:[],messages:[]
code: 1001, error: method_not_allowed
31๋ฒ Line Prermission denied ๋ฉ์์ง๊ฐ ์ฐํ๋๋ฐ.... ์ด๊ฑฐ ์ ์ด๋ฐ๊ฑธ๊น์???
๋ณด๊ณ ๋ฐ๋ผ๋ง ํ ์ค ์๋ ์ด๋ณด์ ๋๋ค.^^ ๊พธ๋ฒ
์ด๋ฒ์ ubunto 22.04 ์๋ฒ ํด๋ฆฐ ์ค์น ํ ๋ค์ ์ธํ ํ๊ณ ์์ด์..ใ ใ
ํด๋ผ์ฐ๋ํ๋ ์ด์ ๊ฐ์ ํ์ธํ๋ IP๋ ์ ๋ฐ์ดํธ๊ฐ ๋๋๋ฐ...์ค์ ์ porxy๋ก ๋ ์ฝ๋ ์์ฑ์ด ๋ณ๊ฒฝ์ด ๋๋ค์...ใ ใ
ํด๋น ํด๋์ ์ฌ์ฉ์ ๊ถํ์ด ์์ด์ ๊ทธ๋ฌ์ด์....ใ ใ
๊ฒ์ํด์ ์ ํด๊ฒฐํ์ต๋๋ค.