|
--
dns 视图(dns view)
Berkeley Internet Name Domain (BIND) --伯克利网络名字域
bind 9 版本加入了视图功能 view
CDN 内容分发网络 (content distributed network)
将网站源服务器中的内容存储到分布于各地的CDN网络节点上,通过智能网络流量分配控制系统,
将终端用户的访问请求自动指向健康可用且距离本地最近的CDN专用服务器上,以提高用户访问
的响应速度和服务的可用性,改善互联网上的服务质量。
bind+squid 实现基本CDN
分布式缓存服务器 + 智能DNS(DNS view)
www.abc.com --》
内蒙用户
新疆用户 北京
成都 武汉 上海
广州
(网站源在深圳)
IP库如何获得?
IANA(互联网数字分配机构,internet assigned numbers authority)
ARIN (American registry for internet numbers)
北美,南美
RIPE
欧洲,中东,北非
APNIC
亚洲,大洋洲
www.apnic.net
这个网站上有一个叫whois数据库,可以查询所有的公网IP现在被分配到哪
参考网址:
http://bbs.chinaunix.net/thread-577601-1-1.html
--使用下面的脚本,就会在当前运行的目录下产生chinanet(电信),unicom(网通),others(其它)这三个IP库文件
# vim ripe.sh
#!/bin/sh
mkdir /root/apnic -p
FILE=/root/apnic/ip_apnic
wget http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest -O $FILE
grep 'apnic|CN|ipv4|' $FILE | cut -f 4,5 -d'|'|sed -e 's/|/ /g' | while read ip cnt
do
echo $ipcnt
mask=$(cat << EOF | bc | tail -1
pow=32;
define log2(x) {
if (x<=1) return (pow);
pow--;
return(log2(x/2));
}
log2($cnt)
EOF)
echo $ip/$mask>> cn.net
if whois [url=mailtoip@whois.apnic.net]$ip@whois.apnic.net[/url] | grep -i ".*chinanet.*\|.*telecom.*">/dev/null;then
echo $ip/$mask >> chinanet
elif whois [url=mailtoip@whois.apnic.net]$ip@whois.apnic.net[/url] | grep -i ".*unicom.*">/dev/null;then
echo $ip/$mask >> unicom
else
echo $ip/$mask >> others
fi
done
--注意:上面的脚本在rhel5里能执行,因为rhel5默认会安装jwhois这个包(这个包自带whois命令,不要用我们编译出来的whois3命令,在查询时会卡住)
如果上面的脚本要在rhel6里执行的话,则yum install jwhois -y
然后把脚本里mask变量里的$()这个执行符号改成 ` `这个执行符号
===============================================================
实践:上面我做的IP库是电信与网通的IP库
如果我现在是按地域来划分的,假设我划分成(北京,成都,上海,深圳,武汉)这五个CDN节点,请尝试把他们的IP库给做出来
(地域的划分情况随你自己,比如湖南离武汉和深圳都比较近,你要划分到哪一个区域自己定)
北京
成都 武汉 上海
广州
(网站源在深圳)
#!/bin/sh
mkdir /root/apnic -p
touch /root/apnic/ip_apnic
FILE=/root/apnic/ip_apnic
rm -f $FILE
wget http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest -O $FILE
grep 'apnic|CN|ipv4|' $FILE | cut -f 4,5 -d'|'|sed -e 's/|/ /g' | while read ip cnt
do
echo $ipcnt
mask=`cat << EOF | bc | tail -1
pow=32;
define log2(x) {
if (x<=1) return (pow);
pow--;
return(log2(x/2));
}
log2($cnt)
EOF`
echo $ip/$mask>> cn.net
if whois [url=mailtoip@whois.apnic.net]$ip@whois.apnic.net[/url] |grep descr:|head -1| grep -i ".*xinjiang.*\|.*tibet.*\|.*qinghai.*\|.*gansu.*\|.*yunnan.*\|.*sichuan.*">/dev/null;then
echo $ip/$mask >> chengdu
elif whois [url=mailtoip@whois.apnic.net]$ip@whois.apnic.net[/url] |grep descr:|head -1| grep -i ".*neimeng.*\|.*ningxia.*\|.*shanxi.*\|.*hebei.*\|.*beijing.*\|.*tianjin.*\|.*shandong.*\|.*liaoning.*\|.*jilin.*\|.*heilongjiang.*">/dev/null;then
echo $ip/$mask >> beijing
elif whois [url=mailtoip@whois.apnic.net]$ip@whois.apnic.net[/url] |grep descr:|head -1| grep -i ".*shannxi.*\|.*shaanxi.*\|.*henan.*\|.*chongqing.*\|.*hubei.*\|.*hunan.*\|.*jiangxi.*">/dev/null;then
echo $ip/$mask >> wuhan
elif whois [url=mailtoip@whois.apnic.net]$ip@whois.apnic.net[/url] |grep descr:|head -1|grep -i ".*guangxi.*\|.*guangdong.*\|.*hainan.*\|.*fujian.*\|.*hk.*\|.*macau.*">/dev/null;then
echo $ip/$mask >> shenzhen
elif whois [url=mailtoip@whois.apnic.net]$ip@whois.apnic.net[/url] |grep descr:|head -1| grep -i ".*anhui.*\|.*zhejiang.*\|.*jiangsu.*\|.*shanghai.*">/dev/null;then
echo $ip/$mask >> shanghai
else
echo $ip/$mask >> others
fi
done
--注意:上面的脚本产生的结果大部分应该是没问题的,但也有一些会存在分配的问题,改脚本或者是单独处理肯定是可以解决的;这里只是提供一个思路,不要把这个脚本直接用到真实环境
=====================================================================
DNS view
根据你访问过来的IP对应ACL列表来判断,从而解析到不同的服务器主机
在CDN中应用很多,也是解决目前区域间带宽小和延迟大的问题的一种方法。
DNS 视图
view优点:
优化访问速度
成本低,无需额外设备
配置灵活简单
负载均衡
视图的在DNS里的配置原理:
每一个view由match-clients来匹配网段,如:
match-clients {10.1.1.0/24;20.1.1.0/24}
--表示只有10.1.1和20.1.1网段可以访问此view
--那么因为定义的网段可能有很多,所以使用了acl,定义方法如下
acl "internalnet" {10.1.1.0/24;20.1.1.0/24;30.1.1.0/24}
view "internel" {
match-clients { "internalnet"; };
};
--或者使用include 来定义一个文件,在文件里写多网段IP
vim /var/named/internalnet --在此文件里写IP库
include "internalnet"; --把此IP库文件给装载进来
view "internel" {
match-clients { internalnet;} --这里不是include的文件名,而是这个文件里定义的acl名
};
第一步:定义ACL文件 (用来放网段的文件,IP库)
# yum install bind* -y
[root@li ~]# vim /var/named/dianxin --电信IP库
acl dx {
10.1.1.153;
10.1.1.101; --IP写法
200.11.22.0/24; --网段写法
};
[root@li ~]# vim /var/named/wangtong --网通IP库
acl wt {
10.1.1.73;
10.1.1.174;
100.10.20.0/24;
};
第二步:配置named.conf
[root@li ~]# vim /etc/named.conf
options {
listen-on port 53 { any; }; --改为any
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; }; --改为any
recursion yes;
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
#zone "." IN {
# type hint;
# file "named.ca";
#};
#include "/etc/named.rfc1912.zones"; --这里把上面的根域和子配置文件里所有域都注释掉;因为配置了视图,那么所有的域都得要配置才行,所以这里就直接注释不用
include "/etc/named.root.key";
--下面的就是在主配置文件上新加的
include "dianxin";
include "wangtong";
view "v1" { --视图名,随便取
match-clients {dx;}; --dx为acl名,而不是IP库文件名
zone "cluster.com" IN {
type master;
file "data/dx.cluster.com.zone";
};
};
view "v2" {
match-clients {wt;};
zone "cluster.com" IN {
type master;
file "data/wt.cluster.com.zone";
};
};
view "v3" {
match-clients {any;}; --any代表所有,这里一定要放在最后,匹配完了dx,wt,最后的所有都为others
zone "cluster.com" IN {
type master;
file "data/others.cluster.com.zone";
};
};
第三步:配置named.conf里定义的三个zone文件
# vim /var/named/data/dx.cluster.com.zone
$TTL 86400
@ IN SOA dx. root. (
2011102401
120
60
30
86400 )
IN NS 10.1.1.35.
www IN A 1.1.1.1 --此为www.cluster.com域名的电信线路的IP,或者是在电信机房的服务器的IP
# vim /var/named/data/wt.cluster.com.zone
$TTL 86400
@ IN SOA wt. root. (
2011102401
120
60
30
86400 )
IN NS 10.1.1.35.
www IN A 2.2.2.2 --网通线路的
# vim /var/named/others.cluster.com.zone
$TTL 86400
@ IN SOA others. root. (
2011102401
120
60
30
86400 )
IN NS 10.1.1.35.
www IN A 3.3.3.3 --除了电信和网通外的用户指向的服务器IP,如果你只有电信和网通两个线路,可以随意指向其中一个。但这里是实验,我假设有三个线路,所以这里指向第三个IP 3.3.3.3
第四步: 重启服务
/etc/init.d/named restart
问题:上面做的是单机单域,多地域多运营商都要区分如何做?
也就是IP库文件要分得更细,
比如广东附近几个省的电信的IP段要单独一个IP库
广东附近几个省的网通的IP段要单独一个IP库
其它的类似
课外扩展:
上网查查类似dnspod这种智能DNS服务运营商
====================================================================
http://www.netfilter.org/
netfilter / iptables --iptables 的全名 2.4版本内核后都集成有这个组件
1,包过滤防火墙
在网络层对数据包进行选择,主要是对数据包的所使用的协议,端口,源地址和目标地址等参数来进行过滤
实现四层的包过滤(OSI七层)
2,状态检测
TCP有三次握手的阶段,常用的WEB,文件下载,发送和接收邮件等等都是TCP
状态检测防火墙除了包过滤防火墙所考查的参数之外,还要关心数据包连接的状态
3,代理网关 squid
把内网和外网是完全隔离的,内网和外网不能进行直接的TCP通讯,必须通过代理网关的处理
.exe .jpg
可以实现七层的包过滤
iptables 基本概念
四张表: 表里有链 (chain )
filter: 用来进行包过滤: INPUT OUTPUT FORWARD
nat: 用来网络地址转换: network address translation ,允许一个内网地址块,通过NAT转换成公网IP,实现对公网的访问,解决IP地址不足
PREROUTING POSTROUTING OUTPUT
mangle :用来对数据包标志
PREROUTING INPUT OUTPUT FORWARD POSTROUTING
raw:对原始数据包的处理
PREROUTING OUTPUT
Incoming / \ Outgoing
-->[Routing ]--->|FORWARD|------->
[Decision] \_____/ ^
| |
| ____
___ / \
/ \ |OUTPUT|
|INPUT| \____/
\___/ ^
| |
----> Local Process ----
iptables
-A 增加一条规则,后接链名,默认是加到规则的最后面
-D 删除
-L 列出规则
-n 以数值显示
-I 在最前面插入规则
-v 显示统计数据,与-L一起用,看到的信息更多
-F 清空规则
-z 清空计数器
-x 清空自定义链
-t 后接表名
-P policy,默认策略
-p protocol,后接协议名
--dport 目标端口
--sport 源端口
-d destination,目标地址
-s source,源地址
-i 接网卡接口, 进入的网卡接口
-o 接网卡接口, 出去的网卡接口
-j 后接动作
动作的分类:
ACCEPT 接收数据包
DROP 丢弃数据包
REJECT 拒绝数据包,和DROP的区别就是REJECT会返回错误信息,DROP不会
MASQUEREAD IP地址伪装,使用NAT转换成外网IP,可以PPP拔号(外网IP不固定情况)
SNAT 源地址转换,它与MASQUEREAD的区别是SNAT是接一个固定IP
DNAT 目标地址转换
LOG 记录日志
例1,列规则
iptables -L --默认看的就是filter表
iptables -L -t filter
iptables -L -t nat
iptables -L -t mangle
iptables -L -t raw
例2,对ping的控制
ICMP协议传输过程是双向的,可以对其INPUT或OUTPUT都可以控制
10.1.1.0/24网段ping本机,会被拒绝(客户端会收到拒绝信息)
# iptables -t filter -A INPUT -p icmp -s 10.1.1.0/24 -j REJECT
# iptables -t filter -D INPUT -p icmp -s 10.1.1.0/24 -j REJECT --删除上一条规则
# iptables -t filter -A INPUT -p icmp -s 10.1.1.0/24 -j DROP
# iptables -t filter -D INPUT -p icmp -s 10.1.1.0/24 -j DROP
# iptables -t filter -A OUTPUT -p icmp -d 10.1.1.0/24 -j REJECT
# iptables -t filter -D OUTPUT -p icmp -d 10.1.1.0/24 -j REJECT
# iptables -t filter -A OUTPUT -p icmp -d 10.1.1.0/24 -j DROP
# iptables -t filter -D OUTPUT -p icmp -d 10.1.1.0/24 -j DROP
--上面四种方法都可以控制拒绝10.1.1.0/24网段ping本机
# iptables -t filter -A INPUT -p icmp -j REJECT --如果不写-s或-d,默认代表所有人
扩展
我想实现所有人都ping不通我,但是10.1.1.35这个IP能ping通我
# iptables -t filter -A INPUT -p icmp -j REJECT
# iptables -t filter -A INPUT -p icmp -s 10.1.1.35 -j ACCEPT
--此写法错误的
------------------------------------------------
规则就是一个访问控制列表(ACL),读取的顺序是从上往下一条一条匹配,匹配一条就不继续往下匹配,最后匹配默认策略,所以正确写法应该是把刚才允许10.1.1.35的写到最前面
-----------------------------------------------
# iptables -t filter -A INPUT -p icmp -j REJECT
# iptables -t filter -I INPUT -p icmp -s 10.1.1.35 -j ACCEPT
--正确写法,把第二条加到第一条前面
# iptables -t filter -I INPUT 2 -p icmp -s 10.1.1.36 -j ACCEPT
--链后面接数字2,表示插入到原来第二条的上面,成为新的第2条
删除的方法:
方法一:
# iptables -t filter -D INPUT -s 10.1.1.8 -p icmp -j ACCEPT
--加的时候怎么写,删除时就要怎么写 A 参数换成 D就可以
方法二;
# iptables -L -n --line
# iptables -D INPUT 2
--在规则比较多或者不好写规则的情况下,可以先用--line或者--line-number列出行号,再用行号删除
方法三:
# iptables -F
--直接清空filter表的所有规则
iptables -X
iptables -Z --清除计数器,自定义链
例3,规则的保存与还原
# /etc/init.d/iptables save --这样是默认保存到/etc/sysconfig/iptables
# iptables-save > /etc/sysconfig/iptables --将当前规则保存到这个文件,文件可以自定义
# iptables -F
# iptables -X
# iptables -Z --使用这三条来清空filter表,如果别的表也要清空的话,就加-t 表名都清一次
# iptables-restore < /etc/sysconfig/iptables --把保存的规则还原回去
--/etc/sysconfig/iptables文件为默认保存文件,重启iptables服务会默认把此文件里的规则还原。当然也可以手工保存到另一个文件,就需要iptables-restore手工还原了。
扩展,如何完全关闭rhel6的iptables服务
因为rhel6在安全性有很多加强,就算是你把iptables服务关闭,并chkconfig iptables on,重启还是有可能会有规则
所以可以用下面的方法
# iptables -F
# iptables -F -t nat
# iptables -F -t mangle
# /etc/init.d/iptables save --保存为空规则
# chkconfig iptables on
或者用下面的方法
# echo > /etc/sysconfig/iptables
# /etc/init.d/iptables restart
# chkconfig iptables on
例4,每个链的默认策略的修改
# iptables -P INPUT DROP --INPUT键默认策略改为DROP,改回来把DROP换成ACCEPT就行了
# iptables -P OUTPUT DROP --OUTPUT键默认策略改为DROP
例5,实现允许ssh过来(代表本机为服务器身份),ssh出去(代表本机为客户端身份),别的都拒绝 (要求,INPUT和OUTPUT双链默认策略都为DROP)
OUTPUT INPUT
客户端 随机端口 ---》 服务器 22
客户端 随机端口 《--- 服务器 22
INPUT OUTPUT
实现允许10.1.1.0/24网段来ssh本机(服务器),其它任何访问都拒绝(在双链拒绝的情况下)
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -A INPUT -p tcp --dport 22 -s 10.1.1.0/24 -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 22 -d 10.1.1.0/24 -j ACCEPT
实现允许从本机(客户端)ssh到10.1.1.0/24网段的服务器,其它任何访问都拒绝(在双链拒绝的情况下)
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -A OUTPUT -p tcp --dport 22 -d 10.1.1.0/24 -j ACCEPT
# iptables -A INPUT -p tcp --sport 22 -s 10.1.1.0/24 -j ACCEPT
例6,在例五的基础上允许ping自己的IP,本地回环127.0.0.1和10.1.1.35
下面两条定义能ping自己和127本地回环
# iptables -A INPUT -i lo -p icmp -j ACCEPT
# iptables -A OUTPUT -o lo -p icmp -j ACCEPT
--这里用lo设备是127网段的所有回环地址都可以。如果指定ip127.0.0.1的话,只能控制这一个IP。在控制的范围上还是有区别的
下面两条定义此服务器和35这台机器可以互ping
# iptables -A INPUT -p icmp -s 10.1.1.35 -j ACCEPT
# iptables -A OUTPUT -p icmp -d 10.1.1.35 -j ACCEPT
例7,
在上面的基础上再加上只允许10.1.1.0/24这个网段访问你的httpd服务,和你只能访问10.1.1.0/24网段的httpd服务
例8
在上面的基础上再加上允许别人访问本台服务器的DNS
只需要做udp的53端口就可以了,不用写tcp 53(因为tcp 53主要是用于主从DNS服务器同步的)
-------------------------------
一些特殊的写法
连续端口或多端口写法
iptables -A INPUT -p tcp --dport 1:1000 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 25,110 -j ACCEPT
硬件地址
iptables -A INPUT -m mac --mac-source 00:23:CD:95A:0B -p all --dport 80 -j ACCEPT
例9 邮件服务器
25 smtp 110 pop3
例10 dhcp
iptables 对dhcp端口控制无效
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
例11
samba
139 445
例12
nfs
--因为nfs用到rpc调用,端口不固定,所以需要把端口给固定起来.nis服务也会用到rpc调用,也需要做端口绑定(鸟哥书上面nis那章节有)
vim /etc/sysconfig/nfs --在此文件里加上下面四句
LOCKD_TCPPORT=3000
LOCKD_UDPPORT=3000
MOUNTD_PORT=3001
STATD_PORT=3002
/etc/init.d/nfs restart
/etc/init.d/rpcbind restart --这里先把默认策略改成ACCEPT,再启动就可以启动起来,然后再把默认策略改回成DROP,再继续做下面的实验
netstat -ntl |grep 300 去查看,看到rpc.的守护进程的端口为自己绑定的端口
iptables -A INPUT -p tcp --dport 3000:3002 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 3000:3002 -j ACCEPT
iptables -A INPUT -p udp --dport 3000:3002 -j ACCEPT
iptables -A OUTPUT -p udp --sport 3000:3002 -j ACCEPT
还要加上2049(nfs)和111(rpcbind)的端口的规则
iptables -A INPUT -p tcp --dport 2049 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 2049 -j ACCEPT
iptables -A INPUT -p udp --dport 2049 -j ACCEPT
iptables -A OUTPUT -p udp --sport 2049 -j ACCEPT
iptables -A INPUT -p tcp --dport 111 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 111 -j ACCEPT
iptables -A INPUT -p udp --dport 111 -j ACCEPT
iptables -A OUTPUT -p udp --sport 111 -j ACCEPT
--现在就可以用另一台机showmount -e 查看并进行挂载了
--练习:把上面的3000,3001,3002,2049,111合起来只写4条iptables来做
[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 111,2049,3000,3001,3002 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p udp -m multiport --dport 111,2049,3000,3001,3002 -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -p tcp -m multiport --sport 111,2049,3000,3001,3002 -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -p udp -m multiport --sport 111,2049,3000,3001,3002 -j ACCEPT
练习:上面四条做的是为NFS服务器的身份允许别人访问
如果你做为NFS客户端去访问别人的NFS服务器,又应该如何写?
例13: yum
视你做的yum类型而定
file
ftp
http
例14
mysql
3306
例15
oracle 监听
1521
例16
rsync
873
还加一个22
练习:
ftp实现双链拒绝的情况下,客户端通过主动和被动都能访问进来
服务器端准备:
# yum install vsftpd -y
# vim /etc/vsftpd/vsftpd.conf
pasv_min_port=3000
pasv_max_port=3005
# /etc/init.d/vsftpd restart
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
客户端测试方法:
1,命令连接测试,能成功连接上就表示命令端口连接没问题
# ftp 10.1.1.36
2,数据传输测试,用上面的命令登录成功后,在客户端使用passive指令转换你的主动和被动模式,
(服务器端不用转换,因为服务器端默认就是主动和被动都支持的)
然后使用ls指令能看到里面的pub子目录就表示数据传输OK了(因为默认是登录到服务器的/var/ftp/目录,里面有一个pub子目录)
主动:
server client
20 21 n m
<-------------
-------------->
---------------------------------------->
<---------------------------------------
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
被动:
server client
随机端口 21 n m
3000-3005 <---------------
---------------->
<--------------------------------------------
--------------------------------------------->
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 3000:3005 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 3000:3005 -j ACCEPT
|
|