星期一, 二月 05, 2007

"变态" DNS

如今南北互通成了一个大问题。这大约也算是一种行政不作为的体现吧。既然衙门没办法,那只好自己想办法,当然最后买单的还是平头老百姓了:P

办法呢就是在网通那边上一个 squid 做缓存。这需要对域名的解析做些变化,当然是希望从电信来的用户走电信的通路,从网通来的走网通的缓存。

注意,这里所谓电信和网通的用户不仅只是指客户的 PC 机所使用的 IP 地址,也包括他们所使用的 DNS 域名服务器的 IP 范围,因为实际的查询是由他们指定的 DNS Server 提交到这个域名服务器,再由它们将查询结果返回给客户主机的。

所以对 BIND9 做如下配置:
options {
directory "/var/named";
allow-query { any; };
recursion yes;
allow-transfer { none; };
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
listen-on { 192.168.0.222; };
};
logging {
channel "querylog" {
file "/var/log/named.log" versions 3 size 100m;
print-time yes;
print-severity yes;
};
category queries { querylog; };
};

acl cnc_ip {
192.168.0.222;
58.16.0.0/13;
58.100.0.0/15;
58.211.0.0/16;
58.240.0.0/12;
60.0.0.0/11;
60.52.145.0/24;
60.55.0.0/24;
60.194.192.0/24;
60.208.0.0/12;
61.4.64/20;
61.14.128.0/23;
61.29.146.0/23;
61.48.0.0/13;
......
};

view "from_cnc" {
match-clients { cnc_ip; };
zone "." {
type hint;
file "named.ca";
};
zone "0.0.127.in-addr.arpa" {
type master;
file "named.local";
};

zone "example.com" {
type master;
file "example.com.cnc_zone";
allow-update { none; };
};
};

view "from_telcom" {
match-clients { any; };
zone "." {
type hint;
file "named.ca";
};
zone "0.0.127.in-addr.arpa" {
type master;
file "named.local";
};

zone "example.com" {
type master;
file "example.com.zone";
allow-update { none; };
};
};

sh# cat example.com.zone
;
; BIND data file for local loopback interface
;
$TTL 10
$ORIGIN example.com.
@ IN SOA example.com. admin.example.com. (
2006120602 ; Serial
10s ; Refresh
10 ; Retry
10 ; Expire
10 ) ; Negative Cache TTL
IN NS ns1.example.com.
ns1 IN A 192.168.0.222
@ IN A 124.74.193.210
www IN A 192.168.0.210
bbs IN CNAME www
test IN A 124.74.193.210

sh# cat example.com.cnc_zone
;
; BIND data file for local loopback interface
;
$TTL 10
$ORIGIN example.com.
@ IN SOA example.com. admin.example.com. (
2006120602 ; Serial
10s ; Refresh
10 ; Retry
10 ; Expire
10 ) ; Negative Cache TTL
IN NS ns1.example.com.
ns1 IN A 192.168.0.222
@ IN A 210.51.46.227
www IN A 192.168.0.210
bbs IN CNAME www
test IN A 210.51.46.227
然后可以使用 dig 来查看结果。首先在 acl cnc_ip{} 部分不加入 192.168.0.222(本机),则运行 dig:
sh# dig test.example.com @192.168.0.222
;; ANSWER SECTION:
test.example.com. 10 IN A 124.74.193.210
而 acl cnc_ip{} 部分加上本机地址后:
sh# dig test.example.com @192.168.0.222
;; ANSWER SECTION:
test.example.com. 10 IN A 210.51.46.227
这种办法解析针对不同来源的 client 到不同的 IP,但与通常的DDNS(动态域名服务)又不同,而实际上又不是那么"智能",所以只好命名为"变态" DNS 了 !^_^

这种办法不一定很好,但我也不知道有什么其他的办法,这也是从别人那偷学来的。不过以我看来,是不太愿意在这些问题上浪费太多的时间的。"再多的天才也不能胜任对细节的专注",问题是层出不穷,永远也解决不完的,但是一个好的设计却可以避免很多问题,特别是那些机械重复的、本来应该由机器来处理的问题。

如果某个客户,比如是网通的用户,他查询的结果不对,也就是查出的结果到电信去了,那么先看看他本身的 IP 地址是否在 cnc_ip 的范围之内,如果在其中,则查看他指定的 DNS 服务器的 IP 地址是否在那个范围之内,如果不在,则可以通过一些办法来估算,比如 202.99.96.68 这个地址,可以从 http://www.ip138.com/ 这个站点上来查一下,分别看一下 202.99.1.68 和 202.99.255.68 是否在网通,如果在,则可以断定 202.99.0.0/16 这个网段是输入网通的,然后可以再扩大范围,看看 202.98.* 和 202.100.* 等。

没有评论: