bind做递归DNS的一些防攻击手段

权威DNS的防攻击相对容易一些,对于一般的小公司的话可以使用rrl模块做简单的限速就能取得不错的效果。测试过开启限速后使用queryperf去打,bind的负载基本不会上升的。
递归DNS的防攻击会负责很多。如果单纯使用开源的解决方案就只有rrl和rpz这2个东东可以考虑了。值得一提的是在bind9.9.4里把这2个patch合并进去了。现在最新版的bind都是可以使用rpz设置对每个不同的域名做返回策略,rrl也可以限制好单个IP或IP段的频率。
编译参数:


#/opt/bind/sbin/named -V
BIND 9.9.4-P2 (Extended Support Version) <id:3f00a920> built with '--prefix=/opt/bind/' '--enable-rrl' '--enable-epoll' '--enable-threads'
using OpenSSL version: OpenSSL 1.0.1 14 Mar 2012

rrl的配置可以参考:


    rate-limit {
        responses-per-second 20;
        nodata-per-second 10;
        nxdomains-per-second  10;
        errors-per-second 10;
        //all-per-second 60;
        ipv4-prefix-length 32;
        max-table-size 10000;
        slip 2;
        //log-only yes ;
        qps-scale 50000;
        window 5;
    };

其中ipv4-prefix-length设置掩码为32位,就是对每个IP都独立限速, responses-per-second是对每个客户端响应速度上限。qps-scale是一个系数,比如设置qps-scale 250; responses-per-second 20,当访问的qps是1000的时候,对单个ip的限速就变成了250/1000*20=5。详细的配置可以参考
http://ftp.isc.org/isc/bind9/cur/9.9/doc/arm/Bv9ARM.ch06.html#options


  [ rate-limit {
        [ responses-per-second number ; ]
        [ referrals-per-second number ; ]
        [ nodata-per-second number ; ]
        [ nxdomains-per-second number ; ]
        [ errors-per-second number ; ]
        [ all-per-second number ; ]
        [ window number ; ]
        [ log-only yes_or_no ; ]
        [ qps-scale number ; ]
        [ ipv4-prefix-length number ; ]
        [ ipv6-prefix-length number ; ]
        [ slip number ; ]
        [ exempt-clients  { address_match_list } ; ]
        [ max-table-size number ; ]
        [ min-table-size number ; ]
      } ; ]
    [ response-policy { zone_name
        [ policy given | disabled | passthru | nxdomain | nodata | cname domain ]
        [ recursive-only yes_or_no ] [ max-policy-ttl number ] ;

rpz的配置如下options字段新增


response-policy {
   zone "rpz.zone" policy given;
};

然后在每个view里新增


zone "rpz.zone" {
   type master;
   file "master/rpz.zone";
   allow-update {none;};
};

rpz.zone范例如下:


$TTL 30
@ SOA nsa.vix.com. hostmaster.vix.com. 29 3600 1800 604800 30
NS localhost.

google.com IN CNAME google.com.
www.abc.com IN CNAME www.abc.com.
a.gnuers.org CNAME blogd.gnuers.org.
no.gnuers.org CNAME .
no1.gnuers.org CNAME *.
host.gnuers.org CNAME .
www.test.fr IN A 193.252.1.2
*.lala.com IN A 200.237.2.1

这样*.lala.com都会被解析为200.237.2.1,而对于no.gnuers.org会直接返回nxdomain, AUTHORITY SECTION会有rpz.zone的信息。


# dig @127.0.0.1 no.gnuers.org

; <<>> DiG 9.8.1-P1 <<>> @127.0.0.1 no.gnuers.org
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 7410
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;no.gnuers.org.         IN  A

;; AUTHORITY SECTION:
rpz.zone.       30  IN  SOA nsa.vix.com. hostmaster.vix.com. 29 3600 1800 604800 30

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Feb 12 12:48:05 2014
;; MSG SIZE  rcvd: 97

日志的话可以单独设置一下


channel rpz_log { file "/opt/bind/var/log/named.rpz" versions 3 size 100m; severity dynamic; print-time yes;};
channel rrt_log { file "/opt/bind/var/log/named.rrt" versions 3 size 100m; severity dynamic; print-time yes;};
category rate-limit {rrt_log;};
category rpz {rpz_log;};

rpz的主要用途主要有几方面:
1. 把部分做反射攻击的域名封掉。
2. 把内部域名屏蔽掉,直接返回NXDOMAIN。
3. 屏蔽部分暴力,黄色,诈骗网站。

发表在 dns | bind做递归DNS的一些防攻击手段已关闭评论

bond不同模式下网卡流量分配

大家常用的bond模式主要是mode 1和4.其中mode1就是简单的主备模式,mode4是两个网卡都有流量的。以下是每种模式的简单介绍:

balance-rr or 0 — Sets a round-robin policy for fault tolerance and load balancing. Transmissions are received and sent out sequentially on each bonded slave interface beginning with the first one available.

active-backup or 1 — Sets an active-backup policy for fault tolerance. Transmissions are received and sent out via the first available bonded slave interface. Another bonded slave interface is only used if the active bonded slave interface fails.

balance-xor or 2 — Sets an XOR (exclusive-or) policy for fault tolerance and load balancing. Using this method, the interface matches up the incoming request’s MAC address with the MAC address for one of the slave NICs. Once this link is established, transmissions are sent out sequentially beginning with the first available interface.

broadcast or 3 — Sets a broadcast policy for fault tolerance. All transmissions are sent on all slave interfaces.

802.3ad or 4 — Sets an IEEE 802.3ad dynamic link aggregation policy. Creates aggregation groups that share the same speed and duplex settings. Transmits and receives on all slaves in the active aggregator. Requires a switch that is 802.3ad compliant.

balance-tlb or 5 — Sets a Transmit Load Balancing (TLB) policy for fault tolerance and load balancing. The outgoing traffic is distributed according to the current load on each slave interface. Incoming traffic is received by the current slave. If the receiving slave fails, another slave takes over the MAC address of the failed slave.

balance-alb or 6 — Sets an Active Load Balancing (ALB) policy for fault tolerance and load balancing. Includes transmit and receive load balancing for IPV4 traffic. Receive load balancing is achieved through ARP negotiation.

对于mode0,可以直接在线把1个网卡disable,也可以改变起主备状态:
1. 把一个网卡eth1从bond0中去除
ifenslave -d bond0 eth1
2. 把一个网卡eth1加入bond0中
ifenslave bond0 eth1

3.切换当前的active网卡(mode1)到eth1
ifenslave -c bond0 eth1

对于mode0来说,始终只有active的网卡有流量,大家在配置网卡的时候会加一些参数,指定master网卡 :
BONDING_OPTS=”miimon=100 mode=1 primary=eth0″
大家也经常在使用mode0的时候加入updelay(单位是毫秒,需要是miimon的整数倍)参数,设置当网卡up指定的时间后才能变成active,防止master的网卡刚启动其实还不能正常服务就被变成active了。

对应mode4来说会比较复杂一点,mode4是双活的,所以入口的流量(2个网卡双活的前提下)到底在那个网卡上其实是由交换机上hash出来的,其实在服务器上是不能改变的,一般也是正对源IP,源端口,源MAC什么的hash,每个厂商的可能有不通。对于出口的流量是可以自己控制的,主要是根据xmit_hash_policy的设置而异,一般是:

0 or layer2 —
Default setting. This parameter uses the XOR of hardware MAC addresses to generate the hash. The formula used is:
(XOR ) MODULO
This algorithm will place all traffic to a particular network peer on the same slave, and is 802.3ad compliant.

1 or layer3+4 —
Uses upper layer protocol information (when available) to generate the hash. This allows for traffic to a particular network peer to span multiple slaves, although a single connection will not span multiple slaves.
The formula for unfragmented TCP and UDP packets used is:
((XOR ) XOR ((XOR ) AND 0xffff) MODULO
For fragmented TCP or UDP packets and all other IP protocol traffic, the source and destination port information is omitted. For non-IP traffic, the formula is the same as the layer2 transmit hash policy.
This policy intends to mimic the behavior of certain switches; particularly, Cisco switches with PFC2 as well as some Foundry and IBM products.
The algorithm used by this policy is not 802.3ad compliant.

2 or layer2+3 —
Uses a combination of layer2 and layer3 protocol information to generate the hash.
Uses XOR of hardware MAC addresses and IP addresses to generate the hash. The formula is:
(((XOR ) AND 0xffff) XOR(XOR )) MODULO
This algorithm will place all traffic to a particular network peer on the same slave. For non-IP traffic, the formula is the same as for the layer2 transmit hash policy.
This policy is intended to provide a more balanced distribution of traffic than layer2 alone, especially in environments where a layer3 gateway device is required to reach most destinations.
This algorithm is 802.3ad compliant.

我们一般layer3+4和layer2+3都有使用,想均匀一点可以优先考虑layer3=4.发一个机器上的截图

bind1
从图上开入口流量还是比较均衡的,不过出口流量不是太均衡,主要是因为从本机是只向几个远程机器同步数据,所以出口的流量不是太均衡。

发表在 net, System | bond不同模式下网卡流量分配已关闭评论

ntp 反射放大攻击

之前有介绍过DNS的反射攻击,主要是伪造受攻击的IP给开放递归DNS发起一些查询,包括不限于ANY类型的查询或者是自己制造一些很大的TXT记录,使得这些开放递归DNS对受攻击的IP回复非常大的包,达到攻击流量放大的作用。最近又有比较流行的是NTP的反射放大攻击,主要是利用里monlist去ntp服务器提供查询最近与NTP服务器有联系的600个client的信息。使用的方式类似如下:


 ntpdc -n -c  monlist ntp.xx.xx

如果使用这个NTP服务器机器够多,那么就一定能返回600条记录,tcpdump抓包可以看到是分100个包(大小482字节)返回的,每个包含有6条记录。这样放大比就是100*482/234=206倍左右。

正是因为NTP放大攻击的倍数比较大,所以非常具有杀伤力,4M的上联带宽的家用宽带可以轻松打出800M的流量,足以把一些小网站的入口带宽打爆了。

参考:http://bugs.ntp.org/show_bug.cgi?id=1532

发表在 net | ntp 反射放大攻击已关闭评论

屏蔽迅雷盗链下载文件

不经意间发现绝大部分流量都是来自于迅雷,一看日志里都是在下载各种硕大的ISO文件,而且每个请求下周的size也不大。为了保证正常请求能有充足的资源处理,就得把这部分请求屏蔽掉。
统计了一下迅雷现在使用的UA多得不得了,很难简单的跟进UA来处理,所以只能直接找这些UA的交集做处理了,直接把UA匹配MSIE的就给封了,一般说来开源爱好者是不会使用IE的,在页面上说明一下影响也是OK的。
http段增加一个map,根据ua来创建一下agent变量,主要是为了在日志打出请求是否被屏蔽:


map $http_user_agent $agent {
    default  'false';
    ~*MSIE    'true';
}

server段新增localtion


<br />        location ~* \.iso$ {
            root   /mnt/nas/mirrors/;
            index  index.html index.htm;
            autoindex on;
            if ( $request_method ~* HEAD ) {
                   access_log off;
             }
            if ($agent = 'true') {
                 limit_rate 1k;
                 return 200;
            }

        }

这样对应被屏蔽的请求直接返回200.发现更新了配置后流量大降,可以看出对于一些个人站长如果做好放盗链本身也能大大降低自己的带宽开销。

发表在 nginx, Web server | 屏蔽迅雷盗链下载文件已关闭评论

搭建公共源需要注意的一些点

最近搞了一个公共的源,把主流的镜像都同步好了.不过目前的访问量还不大,服务器的负载比较低.

在做公共的源的时候要注意自己是7X24提供服务的,所以我们在用rsync进行同步的时候需要关注一些细节的地方,主要是分2步同步.
step 1:
同步的时候忽略索引文件,并且不能删除源没有的文件.
step 2:
待第一步成功后再做一次普通的全量同步,把源里没有的文件删除掉.

这样才能使得源在同步的过程中也是具有服务能力的.

发表在 Admin | 搭建公共源需要注意的一些点已关闭评论

vlan和lvs

一般说来一个服务器如果同时有公网ip和私网ip,那么网卡上都是配置一下不同的vlan tag使得网卡能用属于不同vlan内的地址。
因为LVS在用DR模式只是需要Director和RS能通过1个子网通信。所以当我的机器同时都有公网IP和私网IP的时候,配RS时就写的私网的IP。结果发现是跑不通的,后来想了一下是因为这个包在走内网地址转发的时候vlan tag信息丢了,造成包到RS后是处理不了的。

在使用TUN模式的时候是么有这样的问题的,但TUN模式有个很头大的问题是在于不支持MTU协商。如果client段发的请求报文超过1440(1440+ipip头20字节+20字节tcp头+20字节ip头)那么这个请求是不能处理的。因为client端完全在是不能动的,这个时候就只有靠iptables来解决了。


 iptables -A OUTPUT -s VIP -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN,ACK -j TCPMSS --set-mss 1440

上面的这条就可以让RS在和client端三次握手的时候向对方表明自己的MSS是1440,避免client段发送的报文大于1440.

发表在 lvs | vlan和lvs已关闭评论

旁路阻断技术-转载

旁路阻断就是采用旁路的方式侦听通信的数据包,然后再进行协议还原,根据内容进行阻断。这类技术的优点是不影响互联网访问的速度,并且对用户没有特殊的设置要求。通俗讲是并联在互联网的出口上,不会影响原来网络的稳定性,部署也很方便。

采用旁路的方式管理网络并阻断非法连接的方法可以分为三类:
1、 发送TCP Reset包
2、 通过与网关产品联动,建立临时规则
3、 进行基于arp的阻断方式。
首先我们看一下TCP Reset,我们以IDS为例,IDS设备是一个典型的旁路监听并通过TCP Reset进行阻断的网络安全设备。IDS TCP Reset实现方法,当IDS发现一条非法得连接IDS将会向通信的两端各发送一个TCP RESET包,从而实现主动切断连接的目的,此时通信双方的堆栈将会把这个RESET包解释为另一端的回应,然后停止整个通信过程,释放缓冲区并撤销所有TCP状态信息。这个时候,攻击数据包可能还在目标主机操作系统TCP/IP堆栈缓冲区中,没有被提交给应用程序,由于缓冲区被清空了,所以攻击不会发生。

对于RESET包来说,IDS发出的RESET包的前提是知道整个会话当前的序列号和确认号,否则这个RESET包将会被忽略。我们假定一个会话得确认号必须为152如果你发送的RESET包的确认号为142,那么堆栈将会认为这是一个无效的数据包或者被破坏的数据包而将它忽略掉。

从另一方面讲所有的IDS在响应攻击时都有延迟时间,因为IDS从抓取数据包,监测攻击,产生RESET包,到最后发出RESET整个过程都要消耗一定的时间。很多的IDS使用libpcap库来抓包,大部分IDS构建在类BSD的系统上,BSD系统下是利用BPF(Berkeley Packet Filters)进行抓包,BPF默认将会开一个很大的缓冲区,在一个典型的网络中,IDS发出RESET包的过程大约会延迟半秒。在Linux和Solaris平台上,性能要稍微好一点,但是肯定也有延迟时间。

而且TCP Rest对于网络得应用来说也有着很大得局限性,其只能针对通常得标准TCP连接发送阻断信息,对于UDP会话是无能为力得。再则目前得一些网络应用软件在会话连接保持上都很强得能力,TCP Reset包对于他们得效果基本可以忽略。

通过与网关产品的联动方式主要是向防火墙发送临时规则,以及路由器或交换机发送临时ACL列表,阻断当前这个会话。

这种方式存在着这么几个方面得问题:

1、首先是联动协议问题。“联动”一直是网络安全界中的一个很时髦的概念,虽然已经有五六年的历史,但是到目前为止,还远远没有得到充分的发展。现在联动得实现是以现有得某个厂家为核心,其他厂家的产品在一些半公开的SDK的支持下实现与核心厂家的某个产品实现互联。这样导致现有和多产品有联动功能,但是没有联动得实际效果。

2、联动信息的滞后。即使产品与防火墙有着优良得联动相应方式,IDS产品在检测得过程中发现了非法得连接,生成一条临时规则发送到防火墙,防火墙应用这条规则阻断这个连接;在这一个过程中存在着三个延时,一、IDS发现非法连接,生成临时规则;二、规则传输给防火墙;三、防火墙应用规则。这三个演示得总时间最好情况下是小于两秒,而且这个过程当中IDS的检测是滞后IDS检测到非法连接时,这个连接已经建立了,如果这个连接时蠕虫,或木马,两秒的延时足够成功攻击了。

3、当遇到大规模的非法连接的时候,IDS会针对每一条会话向防火墙添加临时规则,这样势必造成防火墙临时规则增大,降低防火墙的效率,引起防火墙包转发延时,严重造成防火墙瘫痪,网络中断。

最后我们来看一下基于arp的阻断,共有三种方式ARP 欺骗、ARP 投毒和 ARP 攻击。先了解ARP的原理。ARP 用于将 IP 地址匹配到或解析至恰当的 MAC 地址,所有的网络设备都有一张 ARP 表,里面临时记忆着该设备已经匹配起来的所有的 IP 地址和 MAC 地址。ARP 表能够确保该设备不需要向已经与自己进行过通信的计算机重复 ARP 询问。当有人在未获得授权时就企图更改 MAC 和 IP 地址的 ARP 表格中的信息时,就发生了 ARP 攻击。通过这种方式我们可以伪造ARP应答包,使得非法连接主机的ARP表错误,无法连接到网关,从而阻断连接。

这种阻断方式从效果上讲是很强得,但是同时也造成了一个问题,其不但阻止了非法连接,而且也阻断了合法连接,这对于网络中的正常应用是有着很大得影响得。

综上所述,采用旁路阻断的方式在实际应用中时不可行的。

原文:http://www.rising.com.cn/newsletter/news/2012-05-23/11558.html
实际大家比较常用的是采用发送TCP Reset包,上文提到的主要缺点都是可以解决的。

发表在 net | 旁路阻断技术-转载已关闭评论

BGP选路决策过程

1、选管理属性权值最大的路由
2、选LOCAL_PREF最大的路由
3、优选IGP路由,次选EGP路由
4、优选AS_PATH最短的路由
5、选源编码最低的路由,IGP低于EGP,EGP低于incomplete的路由
6、选MULTI_EXIT_DISC最低的路由
7、优选EBGP路由,次选联盟EBGP路由
8、选NEXT_HOP最近的路由
9、如果以上属性都相同,切都来自同一个临近的AS,且启用了BGP多路径就是ecmp。
10、如果没有启用BGP多路径,就选路由器ID最小的路由。

PS:本来前面差不多写完了所有的BGP路由熟性,不小心刷了一下搞没了。懒得写了,其实都是从书上摘下来的。
也可以看看这个

附上H3C的文档

发表在 net, System | BGP选路决策过程已关闭评论

两例cost不同引起ospf集群流量不均衡

搞过N套ospf集群,流量不均衡基本都是cost值不同引起的。
第一次是我扩容之前的一个集群,原来就2个机器跑ecmp,流量还算是均等。后来考虑到容量上可能会有不足我就扩容了2个机器,结果发现扩容的机器ospf起来后老的2个机器就没有流量了。在核心交换机上查到4个area的cost不同,新的2个机器的cost没有设置是1,然后老的2个机器的cost以前在核心交换机上设置为了1000,让网络的同学帮忙在核心交换机上把新的2个机器的cost也改成1000后恢复,能形成4条ecmp路由。
第二次是我自己新建的一套,集群起来后就看到只有1个机器有流量,把那个机器干掉后其他3个机器的流量基本能均等。因为默认路由是从交换机学习的,所以自己看了一下路由发现有问题的那个机器的metirc 是11 ,而其他的3个机器的默认路由metric都是10001.
route_err

找配合的网络的同学在交换机上看了下,上面没有单独去设置cost,但是确实是只有一条路由的cost是20,而另外一个集群的上联交换机能看到4条cost相同的路由
只有一条路由的:
lsw1
有4条路由的:
lsw2
后来排查后发现是有1个机器的ospf配置里auto-cost reference-bandwidth被注释了。
这个命令的作用是跟进带宽自动计算cost
— OSPF Command: auto-cost reference-bandwidth <1-4294967>
— OSPF Command: no auto-cost reference-bandwidth
This sets the reference bandwidth for cost calculations, where this bandwidth is considered equivalent to an OSPF cost of 1, specified in Mbits/s. The default is 100Mbit/s (i.e. a link of bandwidth 100Mbit/s or higher will have a cost of 1. Cost of lower bandwidth links will be scaled with reference to this cost).

比如我设置的是100000,那么千兆卡的cost计算应该是100,万兆卡的cost就是10了。至于交换机上显示的cost为何是20和10010我没有研究,猜想是可能我这边激活了配置后,对方也有个默认的cost+本地的cost计算后的值。
本地把这个注释取消重新启动后恢复了4条ecmp。

发表在 net | 两例cost不同引起ospf集群流量不均衡已关闭评论

bind主备同步关注点

最近遇到几次DNS的主备同步问题。

1. 每分钟动态生成反解,然后发现有的slave服务器上不更新。
通过日志看到每次都是最后一个slave机器收到notify消息去master上请求传输zone时有报错,提示master服务不可用。后来发现是master上的transfers-out没有单独指定,这个值默认是10,所有可能比较多slave机器请求时就失败了。把这个配置根据实际的情况调整后解决的。

2. 海量的域名同步时,slave查询soa都查不过来。

到底多大是海量?这个自己看看自己机器上的域名总数能占到中国所以域名的几个百分点以上吧。当数量大了后确实是各种问题都出来了,这个我是观察了一下有个serial-query-rate 可以设置soa查询速度的,默认是20/S,对于有海量域名的DNS来说这样显然是跟不上节奏的,直接把这个调整到5W/S,查询速度飕飕的。对于master的压力其实也还好,就当时收到那么点请求。相应地tcp-clients和transfers-in,transfers-per-ns也要做好调整。

3. SOA的TTL设置问题。

这个其实也不算是什么问题。就是nxdomain的缓存时间是有SOA TTL决定的(如果本地LDNS没有单独设置的话)。有人先把1个域名删除了,接着又有人去解析一下这个被删除的域名,然后之前的人把域名又加上去。。结果所有人在办公网访问不了这个新增的域名。其实这个就是NXDOMAIN的缓存问题。我只有直接把SOA TTL缩短一下。

很多性能上的问题我们需要根据日志来看到底存在的瓶颈是在哪里,然后再去考虑如何优化。没有目的的优化是瞎折腾。

发表在 dns | bind主备同步关注点已关闭评论