参照了 wordsmith 的 和云端的第一次接触-使用Amazon EC2,
顺利地有了第一次的EC2的经验后,
碰上了需用 Dynamic DNS 类似功能,
动态来绑 IP 及 DNS。
不求甚解
自己用网路的环境都是固定IP,
管理的Server更是固定IP,
所以对ddns的猜测了解,
大概只知道 ddns 的原理可能是:
去注册个帐号、主机名称,
然后在自己的电脑装个什么软体,
开机后就会去告知 ddns 自己的IP是什么,
然后 ddns 就透过 script 来把你的IP及所注册的主机名称,
写到 /var/named 里的 DNS 的设定档,
这样就会动态更新 DNS 上的 IP 了…
所以在想,那 script 要怎么写才能自动更新那 DNS 的记录。
使用需求
在 EC2 上的使用,从外部来看,
都是以 public IP 连入,
但内部是用 private IP 给各个虚拟主机,
而且是动态地分配,
所以一阵子后才开机的话,
获得的IP会与之前的不同,
就需要上网站查自己server的IP为何,
然后才 ssh 进 EC2 的虚拟机器。
自己有个 Bind 的 DNS,
也已有自己申请的 Domain,
当然就要建个自用的 Dynamic DNS。
以为要花力气写修改 /var/named 下档案的 script,
找方案的过程才知道:
Linux的client端早就内建有 nsupdate 的工具,
来做动态IP的更新。
而在 Bind 上也要做个简单的设定就完工。
简单实作
参考旧旧文 动态 DNS 设定技巧 上的作法,
大致的步骤都有效,
只有一些要配合成自己的环境,
在此把所进行的步骤记录一下:
(与上述的文章的作法,几乎一样,
只有一些改为适合 ec2 的环境)
0.环境假设
自己 DNS server 的主机名称为 ns、 IP 为 1.2.3.4
所管理的 Domain Name 为 abc.com
在EC2上的 IP 不详,但希望在网路上能用 ec2.abc.com 来绑其动态IP。
1.製作 DNS 的 key
在 ec2 或 ns 上製作皆可:
$ dnssec-keygen -a HMAC-MD5 -b 128 -n HOST ec2Kmail.+157+44587
结果会产生了档名类似 Kmail.+157+44587.key 与 Kmail.+157+44587.private 两个档案。
这两档要放在 ec2 上,
因更新的时候要用到 .key 这档。
.key 的内容类似像这样:
ec2. IN KEY 512 3 157 BJ7y6dzxchy3u0B4hRLksQ==
那串编过的码就是 key。
2.修改 DNS 的设定
在 ns 的 /etc/named.con 上
options {....};key "ec2" {algorithm hmac-md5;secret "BJ7y6dzxchy3u0B4hRLksQ==";};zone "abc.com" {type master;file "named.example";update-policy {grant ec2 name ec2.abc.com. A;};};
再重新启动 named 就生效。
3.EC2 上的 client 设定
依该文提供的 script 来设成适自己的环境,
在 /home/USER/Keys 目录下放 .key, .private 的档案,
以及下列的档案:
tmp.txt 的 内容:
server 1.2.3.4
zone abc.com
update delete ec2.abc.com. A
update add ec2.abc.com. 86400 A SERVER_NEW_IP
send
newip.sh 的内容:
#!/bin/sh
exe_path=/home/USER/Keys
#new_IP=/sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f 2 | cut -d' ' -f1
new_IP=curl http://showmyip.abc.com/whatismyip
/bin/cat $exe_path/tmp.txt | sed s/SERVER_NEW_IP/$new_IP/g > $exe_path/update.txt
/usr/bin/nsupdate -k $exe_path/Kmail.+157+44587.key -v $exe_path/update.txt
不用上述的原始第3行,
是因为 EC2 里 ifconfig 所获得的 IP 为 private IP,
所以只能 query 外部的网页来获知自己的 IP为何,
而改用第4行来获取自己的public IP的资讯。
然后在 /etc/rc.local 上执行 /home/USER/Keys/newip.sh,
这样每次开机就会更新 IP 的资讯。
4.侦测query的IP
上述第四行 http://showmyip.abc.com/whatismyip
所query的结果,就只是出现一串IP。
在 rails 上的程式码是:
def whatismyip render :text => request.env['HTTP_X_FORWARDED_FOR'] #render :text => request.env.inspectend
由于我是rails + nginx,
来query相关的IP变数各不同,
可先利用第3行列出所有HTTP的环境变数,
再观察要用哪个变数。
其他程式环境也很容易建出这显示IP的功能。