自己搭建VPS系列文章,介绍了如何利用自己的计算机资源,通过虚拟化技术搭建VPS。
在互联网2.0时代,每个人都有自己的博客,还有很多专属于自己的互联网应用。这些应用大部分都是互联网公司提供的。对于一些有能力的开发人员(geek)来说,他们希望做一些自己的应用,可以用到最新最炫的技术,并且有自己的域名,有自己的服务器。这时就要去租一些互联网上的VPS主机。VPS主机就相当于是一台远程的计算机,可以部署自己的应用程序,然后申请一个域名,就可以正式发布在互联网上了。本站“@晒粉丝” 就使用的Linode主机VPS在美国达拉斯机房。
其实,VPS还可以自己搭建的。只要我们有一台高性能的服务器,一个IP地址,一个路由。可以把一台高性能的服务器,很快的变成5台,10台,20台的虚拟VPS。我们就可以在自己的VPS上面的,发布各种的应用,还可以把剩余的服务器资源租给其他的互联网使用者。 本系列文章将分为以下几个部分介绍:“虚拟化技术选型”,“动态IP解析”,“在Ubuntu上安装KVM并搭建虚拟环境”,“VPS内网的网络架构设计”,“VPS租用云服务”。
关于作者:
- 张丹(Conan), 程序员Java,R,PHP,Javascript
- weibo:@Conan_Z
- blog: http://blog.fens.me
- email: bsspirit@gmail.com
转载请注明出处:
http://blog.fens.me/vps-ip-dns
目录
- 什么时候会用到动态IP解析
- 环境准备
- 实现原理
- 动手实践
1. 什么时候会用到动态IP解析?
家用PC通过PPPoE(宽带连接)拨号上网,如果一天二天没有关机,我们会神奇的发现IP变了。通过PPPoE获得的IP并不是固定的,每隔一段时间IP会被重新分配一次。
创业初期租不起外面的服务器,所以只好把服务器放在家中,面向互联网用户提供服务。但如果IP天天变,我们总不能天天盯着,发现变了人工去修改对应用的域名重新绑定新IP。这个时候,就会想到动态IP解析技术了。这个领域最有名的程序就是“花生壳”。其实这个技术实现起来并不复杂,接下来我们自己开发一套动态IP解析的程序。
2. 环境准备:
- 1台内网服务器A (拨号上网) (xx.xx.xx.xx),linux(cron, bash, curl)
- 1台固定IP的外网服务器B(173.255.193.179) : linux(bind9, PHP)
- 1个域名:wtmart.com
3. 实现原理:
- 把域名绑定到服务器B: ip.wtmart.com ==> 173.255.193.179
- 在服务器B创建一个web应用收集请求,并写入本地文件
- 服务器A每分钟向服务器B发送请求,告诉服务器B,服务器A的IP是什么。
- 服务器B收到A的IP,发现变化写入本地文件存储,并更新本地域名服务器(bind9),用新IP指向lin.wtmart.com
- 客户端机器C,手动选择DNS服务设置173.255.193.179。
- 客户端机器C,SSH远程登陆服务器A,ssh root@lin.wtmart.com
4. 下面我们一步一步实践一下:
1). 把域名绑定到服务器B: ip.wtmart.com ==> 173.255.193.179
wtmart.com的域名是从godaddy.com上面购买的,通过dnspod做域名解析,难得的好服务。
注: 这里我们只需要关注ip.wtmart.com 其他的设置不用关心。
2). 在服务器B创建一个web应用收集请求,并写入本地文件
创建PHP程序
~ /deploy/dyip# pwd
/root/deploy/dyip
~ /deploy/dyip# ls -l
-rw-r--r-- 1 root root 38 Jun 2 13:40 getip.php
-rw-r--r-- 1 root root 13 Jun 12 03:52 ip
-rw-r--r-- 1 root root 807 Jun 2 15:52 sendip.php
接收IP的PHP脚本,sendip.php
~ vi sendip.php
<?php
#http://lin.wtmart.com/sendip.php?pwd=xxx
$content = file_get_contents('ip');
if ($_GET["pwd"] == 'xxx'){//简单认证
$ip = $_SERVER["REMOTE_ADDR"];
if ($content != $ip) {
$file = fopen('ip', 'w');
$result = fwrite($file, $ip);
fclose($file);
if ($fwrite === false) {
echo "update error!<br/>";
} else {
echo "Change to " . $ip;
echo "<br/>Write to DNS server";
}
} else {
echo "No change " . $ip;
}
} else {
echo "Sorry,you don't have permission<br/>";
echo "Server ip: " . $content;
}
简单认证是防止其他人,访问时IP被修改。
查看IP的PHP脚本,getip.php
~ vi getip.php
<?php
echo file_get_contents('ip');
IP写入到本地文件,ip
~ vi ip
116.24.133.86
现在116.24.133.86就是服务器A,所用的IP地址,这个地址每天都会改变。
配置PHP环境,我在这里就跳过了,也可以使用其他语言的程序。
3). 服务器A每分钟向服务器B发送请求,告诉服务器B,服务器A的IP是什么
在服务器A,设置cron定时器。
*/1 * * * * curl http://ip.wtmart.com/sendip.php?pwd=xxx
通过curl实现每分钟,发送一次请求。
4). 服务器B收到A的IP,发现变化写入本地文件存储,并更新本地域名服务器(bind9),用新IP指向lin.wtmart.com
刚才的 sendip.php的脚本已经实现了,写入本地文件存储,接下来我们改一下sendip.php实现配置本地域名服务器(bind9)
修改sendip.php,增加rebind方法
~ vi sendip.php
<?php
#http://lin.wtmart.com/sendip.php?pwd=xxx
$content = file_get_contents('ip');
if ($_GET["pwd"] == 'xxx'){//简单认证
$ip = $_SERVER["REMOTE_ADDR"];
if ($content != $ip) {
$file = fopen('ip', 'w');
$result = fwrite($file, $ip);
fclose($file);
if ($fwrite === false) {
echo "update error!<br/>";
} else {
echo "Change to " . $ip;
echo "<br/>Write to DNS server";
rebind($ip);
}
} else {
echo "No change " . $ip;
}
} else {
echo "Sorry,you don't have permission<br/>";
echo "Server ip: " . $content;
}
# lin 在最后一行
function rebind($ip){
$f = "/etc/bind/db.wtmart.com";
$str=file_get_contents($f);
$a=preg_replace('/\\nlin(.+?)\\n/',"\nlin IN A ".$ip."\n",$str);
echo $a;
file_put_contents($f,$a);
exec('/etc/init.d/bind9 restart');
}
安装并配置域名服务器bind9
~ sudo apt-get install bind9
~ cd /etc/bind
# 打开域名转身的配置
~ vi named.conf.options
forwarders {
8.8.8.8;
8.8.4.4;
};
# 设置wtmart.com域
~ vi named.conf.local
zone "wtmart.com" {
type master;
file "/etc/bind/db.wtmart.com";
};
# 增加ip域名指向本地IP(服务器B),lin的域名指向服务器A的IP
~ vi db.wtmart.com
$TTL 604800
@ IN SOA wtmart.com. root.wtmart.com. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS wtmart.com.
@ IN A 173.255.193.179
@ IN AAAA ::1
ip IN A 173.255.193.179
lin IN A 116.24.133.86
注: lin的域名,必须写到最后一行,并且上下都有空行。sendip.php中rebind方法。
重启bind9域名服务器
sudo /etc/init.d/bind9 restart
5). 客户端机器C,手动选择DNS服务设置173.255.193.179
linux配置DNS
6). 客户端机器C,SSH远程登陆服务器A,ssh root@lin.wtmart.com
win7中命令行登陆
我们完成了 动态IP解析。 通过域名服务器(bind9),我们把动态IP和域名进行绑定。
另外,可能还有一些更简单的需求,比如服务器A的web工程,像这个功能我们在服务器B,配置一个nginx反向代理就可以实现了。
对于创业初期服务器放在家里的同学,希望对你们有用。
转载请注明出处:
http://blog.fens.me/vps-ip-dns