各种域名跳转方式

一个是使用bind的view功能。
这个首先就需要定义一个ACL列表,然后在name.conf中include一下就可以了。Acl定义的格式如下:


 acl "company"{ 1.1.1.1/32; 2.2.2.2/32; }; 

每行定义记得用分号结尾就行。

下面这个是named.conf的配置。View也就是这里进行配置完成的。记得所有的zone必须在view中。


 options { directory "/usr/local/bind/var"; }; include "/usr/local/bind/var/company_acl.conf"; view "view_company"{ match-clients { company; }; #这里的company就是你前面acl中定义的acl名字 zone "abc.com" { type master; file "abc.com.company"; allow-update { none; }; }; zone "." in { type hint; file "named.root"; }; zone "0.0.127.in-addr.arpa" in { type master; file "empty"; }; }; view "view_any"{ match-clients { any; }; zone "abc.com" { type master; file "abc.com.ns"; allow-update { none; }; }; zone "." in { type hint; file "named.root"; }; zone "0.0.127.in-addr.arpa" in { type master; file "empty"; }; }; 

这些定义完成之后就是添加zone记录了。
下面这个是view_company的实例,其他类似就成。


 $TTL 3h @ IN SOA abc.com. ns.abc.com. ( 2009071601; serial 3h ; Refresh after 3hours 1h ; Retry after 1 hour 1w ; Expire fter 1 week 1h ) ; Negative caching TTL of 1 hour ; ;name server IN NS ns.abc.com. ; ;address ;address @ in mx 30 mail abc.com. IN MX 10 mail.abc.com. mail IN A 10.2.9.98 ns IN A 10.2.9.99 * IN CNAME update.microsoft.com. 

总结一下,使用view功能就很容易可以把自己访问和其他访问进行区分对待,这个CDN的原理的一部分就是这样的。但是由于DNS本身是需要所有DNS来进行学习的。所以每次生效和失效当中的间隔比较长,如果只是短期更改,那最好不要使用DNS来进行。

第二种方式是用IPTABLES的转发功能来进行。
这里我们假设有2台机器。10.2.9.118是我本机。这个IPTABLES是设置在10.2.9.33上,10.2.9.99是被转发的机器,也就是除了我10.2.9.118能够正常访问10.2.9.33,其他人的访问都转发到10.2.9.99:80上。这里主要用到iptables得nat功能和filter功能。在redhat中就是替换/etc/sysconfig/iptables的内容。


 # Firewall configuration written by system-config-securitylevel \*nat :--PREROUTING ACCEPT \[0:0\] :OUTPUT ACCEPT \[0:0\] :--POSTROUTING ACCEPT \[0:0\] #上面3行都没有--这个符号,这里没办法才加的 -A PREROUTING -s ! 10.2.9.118 -p tcp --dport 80 -j DNAT --to-destination 10.2.9.99:80 #这个表示除了10.2.9.118来的访问10.2.9.33的80端口全部转发到10.2.9.99:80上 -A POSTROUTING -o eth0 -j MASQUERADE COMMIT # Manual customization of this file is not recommended. \*filter :INPUT ACCEPT \[0:0\] :FORWARD ACCEPT \[0:0\] :OUTPUT ACCEPT \[0:0\] :RH-Firewall-1-INPUT - \[0:0\] -A INPUT -j RH-Firewall-1-INPUT -A FORWARD -j RH-Firewall-1-INPUT -A RH-Firewall-1-INPUT -i lo -j ACCEPT -A RH-Firewall-1-INPUT -i eth1 -j ACCEPT -A FORWARD -i eth0 -p tcp --dport 80 -d 10.2.9.99 -j ACCEPT #这个表示允许10.2.9.33可以转发到10.2.9.99上。 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT #上面2个表示开通本机的22和80端口允许任何人访问 COMMIT 

上面修改完成后海不能算最后生效,还需要打开10.2.9.33的ip转发功能。修改


/etc/sysctl.conf 中net.ipv4.ip_forward = 1 

默认这个值为0,表示禁止转发,改成1就行,然后执行


sysctl –p /etc/sysctl.conf

就行了。
最后我们还要在10.2.9.99上建立一个默认网站。因为iptables中转发过来的是ip+端口的形式。所以必须让10.2.9.99有默认网站。这个默认网站上。在nginx中,在配置文件最上面的网站就是默认网站。


 server { listen 80; server_name update.abc.com; location / { root /opt/update/; expires 180d; index index.html index.htm; access_log logs/defalut.access.log main; } error_page 500 502 503 504 /index.htm; error_page 404 /index.htm; location = /index.htm { root /opt/update/; } } 

这里设置了所有的404和500错误全部被转向到index.htm上了。当然你可以使用rewrite来完成这样的功能。这样无论用户访问10.2.9.33上的任何网站都会被转到10.2.9.99的默认网站,除了我自己以外,哈哈!

最后一种重定向方式就是使用nginx的geo模块。这个在以前的日志已经有写,可以参考http://zauc.wordpress.com/2008/11/22/nginx-ge/