各种域名跳转方式

一个是使用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模块。这个在以前的日志已经有写,可以参考https://zauc.wordpress.com/2008/11/22/nginx-ge/

bind安装笔记

本文中一些bind参数参考自http://www.19830102.com/

dns是任何一个公司都会用到,而bind又是dns服务器的首选。

oreilly也出过<dns and bind>这本书

http://oreilly.com/catalog/9780596001582/

虽然windows上也可以做dns服务器,但windows的dns服务器的安全性只能用这个一个垃圾桶来描述。

这次由于公司需要,所以我们也自己安装了3个bind服务器,一个master,两个slave.

基本安装方式网上都有,而我这次主要是由以下几点。

一个是启动named的用户必须是nologin用户,于是就要新建用户named,同时涉及到named的一些文件夹的权限也要赋予named用户权限。最后启动时候用


named -u named -c /usr/local/named/etc/named.conf

同时由于是自己根域的master dns,所以没有必要开启递归查询,所以只要如下设置就可。


recursion  no

其次named默认是把日志记录在/var/log/messages中,这样并不是一个很好的选择,bind本身支持记录多种类型的日志。以下设置是记录的对于bind服务器的warning日志和查询日志。这样一旦出了问题就能很快的查找到相关原因。


logging {
        channel warning
        { file "log/named.log" versions 3 size 2048k;
        severity warning;
        print-category yes;
        print-severity yes;
        print-time yes;
        };
        channel query
        { file "log/query.log" versions 3 size 2048k;
        severity info;
        print-category yes;
        print-severity yes;
        print-time yes;
        };
        category default { warning; };
        category queries { query; };
};

bind还可以记录以下的日志类型,大家可以根据自己的需要来选择。

category 参数:

default: 默认分类,没有分类的日志都使用这个分类的配置.

general: 没有分类的日志都记录在此分类中.

database: 服务器内部使用存储zone和缓存数据.

security: 允许/拒绝的请求.

config: 配置文件分析和处理.

resolver: DNS解析,被dns缓存服务器进行递归查询.

xfer-in: 接收区域传输.

xfer-out: 发送区域传输.

notify: NOTIFY协议.

client: 客户端请求进程.

unmatched: 未匹配的查询?

network: 网络操作.

update: 动态更新.

update-security: 允许/拒绝更新请求.

queries: 客户端队列日志.

dispatch: 数据包传送日志.

dnssec: DNSSEC和TSIG协议处理.

lame-servers: 远端的配置错误的服务器发送的请求.

delegation-only: NXDOMAIN的结果将被强制定义到delegation-only区域

具体语法如下

logging {
   [ channel channel_name {
     ( file path name
         [ versions ( number | unlimited ) ]
         [ size size spec ]
       | syslog syslog_facility
       | stderr
       | null );
     [ severity (critical | error | warning | notice |
                 info | debug [ level ] | dynamic ); ]
     [ print-category yes or no; ]
     [ print-severity yes or no; ]
     [ print-time yes or no; ]
   }; ]
   [ category category_name {
     channel_name ; [ channel_name ; ... ]
   }; ]
   ...
};

最后由于自己dns分为master和slave模式,所以这之间互相的传输需要特别注意安全。同时我们知道dns协议是分为udp和tcp两种,tcp是用来dns互相之间传递zone文件,而udp是用来响应用户dns查询的请求。

关于互相之间进行zone安全传递,bind本身有比较多的解决方案,分别为TSIG和DNSSEC技术。

同时除了这种技术,本身也可以对于zone传递的限制参数。

区域传输(Zone Transfer):

also-notify: 定义一个向在全局的地址列表的服务器发送通知信息当刷新或者加载区域的时候.
max-transfer-time-in: 当区域传入运行的时间大于设定的分钟将被中断,默认为120 minutes,最大值为28天,40320 minutes.
max-transfer-idle-in: 当区域传入运行处于传输等待的状态,大于设定的时间将被中断,默认为60 minutes,最大值为28天.
max-transfer-time-out: 当区域传出运行的时间大于设定的时间,将被中断,默认为120 minutes,最大为28天.
max-transfer-idle-out: 当区域传出运行处于传输等待的状态,大于设定时间将被中断,默认为60 minutes,最大为28天.
serial-query-rate: 从服务器定期去主服务器查询区域的serial数字是否发生改变.默认为20秒.
serial-queries: BIND9忽略此参数,使用serial-query-rate代替.
transfer-format: 区域的传输可以使用两种不同的格式,one-answers和many-answers,one-answers传输每个记录使用一个DNS信息,many-answers近可能把资源记录打成一个包,默认为many-answers
transfer-in: 设定当前同时传入的区域的最大数目,默认为10个.区域的请求超过限制将被拒绝.
transfer-out: 设定当前同时传出的区域的最大数目,默认为10个,区域的传出请求超过限制将被决绝.
transfer-per-ns: 设定同时进行传输的区域从给定的name服务,默认为2.
transfer-source: 指定通过哪个IPV4的源地址进行域的传送.
transfer-source-v6: 指定通过哪个IPV6的源地址进行域的传送.
alt-transfer-source: 指定,如果transfer-source发生故障,通过哪个IPV4的源地址进行域的传松.
alt-transfer-source-v6: 同上.
use-alt-transfer-source: 指定是否通过alt-transfer-source进行域的传松,默认为yes,兼容BIND8.
notify-source: 指定哪个本地地址,以及本地端口被用来作为发送通知信息的源.此项受限于allow-notify.
notify-source-v6: 同notify-source.

named.conf文件中的一些基本解释

创建主要的配置文件:
# vi /usr/local/named/etc/named.conf
===========================named.conf=======================
acl “trust-lan” { 127.0.0.1/8; 192.168.0.0/16;}; //访问控制列表就是一个有名字的地址匹配列表

options {
directory "/usr/local/named/etc/";         //启动服务器的目录
pid-file "/var/run/named/named.pid";
version "0.0.0";                                        //服务器的真实版本号
datasize 40M;
allow-transfer {
"trust-lan";};
recursion yes;                                   //是否代表客户机查询其他DNS服务器
allow-notify {                                   //如果notify设为yes,并且named是一个或多个区的主服务器,那么每当区数据库有变化时,named会自动地通知相应的那些区的从服务器。