花生壳动态域名解析曾经风靡一时,把域名指向某台随时改变IP的机器。我从来没用过花生壳,不过大致也明白它的基本道理,自己也时常遇到需要访问某动态IP机器的问题,其实可以用很简单的方式来实现类似的功能。
现在有许多专门做查询IP的网站,一个基本功能就是你一上去马上就可以看到自己的IP. 嗯,一般情况下你访问网站时对方就会获知你的IP地址。
实现这个功能,只要在外网有一个固定IP的服务器(或者共享空间)就可以了。比如说,我的网站有个子目录叫”ip”. 第一步,我想在访问http://qingbo.org/ip/的时候,显示出我家计算机的IP地址。
- 在ip子目录里放一个ip.php文件,内容如下:
<?php $file = fopen("index.html",'w'); fwrite($file, $_SERVER["REMOTE_ADDR"]); fclose($file); ?>- 在家里的计算机上访问http://qingbo.org/ip/ip.php
- 不论我在哪里,打开地址”http://qingbo.org/ip/”都可以看到家里的IP了。因为访问ip.php的时候,它把IP写入了index.html文件。
这样有几个问题存在。首先,家里用的是ADSL(其它的网络提供商大部分也都如此),IP地址是不定期变化的,总不能家里老是放个人不停上网吧 🙂 其次,如果别人在别的地方访问ip.php,这不是捣乱吗?这个捣蛋鬼的IP会被记录下来,而家里的IP则不见了。最后,我们想访问http://qingbo.org/ip/的时候,直接转到家里的服务器去浏览网页(这是一台不太正规的web server)。
第一个可以用cron来解决,让它定期自动执行。执行命令”crontab -e”,然后加入这一行:
0 * * * * wget -q -O /dev/null http://qingbo.org/ip/ip.php
Windows应该可以用计划任务,不过我没有试过。
第二个,应该加个认证码(相当于密码)。只要在ip.php里记录IP的时候加一个判断:
if ($_POST["code"] === "strongauthenticationcode") { ... } ?>
这样,只有提供了正确的认证码,IP才会被记录下来,防止别人瞎捣乱。(这是cron task的最终版本)
0 * * * * wget -q -O /dev/null –post-data ‘code=strongauthenticationcode’ http://qingbo.org/ip/ip.php
第三个问题,只要把写入index.html的内容改一下,让它作自动转向就可以了(最终版本):
<?php if ($_POST["quqi"] === "_-5QzdkhxNnI5EOM6ucW") { $file = fopen("index.html",'w'); fwrite($file, '<html><head><title>Redirecting...</title><meta http-equiv="refresh" content="1;url=http://' . $_SERVER["REMOTE_ADDR"] . '/"></head><body>You have crossed the oceans of time, to find me.</body></html>'); fclose($file); } ?>
现在一般的家庭网络都是由一台路由器自动拨号,这样的话,内网有一台机器不停访问外网服务器的IP记录程序就可以了,不一定非得是要做服务器的那台机器。当然了,路由器上要设置好NAT,好让外部可以访问到内部的服务器。
写该文的时候手头没有合适的测试环境,所以文中可能有些错误 🙂 希望能帮助大家,也希望给我指出错误。
Leave a Reply