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. 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. ...

January 25, 2014 · 1 min · pm

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

January 12, 2014 · 1 min · pm

旁路阻断技术-转载

旁路阻断就是采用旁路的方式侦听通信的数据包,然后再进行协议还原,根据内容进行阻断。这类技术的优点是不影响互联网访问的速度,并且对用户没有特殊的设置要求。通俗讲是并联在互联网的出口上,不会影响原来网络的稳定性,部署也很方便。 采用旁路的方式管理网络并阻断非法连接的方法可以分为三类: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包,上文提到的主要缺点都是可以解决的。

December 21, 2013 · 1 min · pm

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路由熟性,不小心刷了一下搞没了。懒得写了,其实都是从书上摘下来的。也可以看看这个。 [这个](http://mt.cucn.edu.cn/net/%E8%B5%84%E6%96%99%E4%B8%8B%E8%BD%BD/cisco/BGP%E8%B7%AF%E7%94%B1%E5%8D%8F%E8%AE%AE%E8%AF%A6%E8%A7%A3(%E5%AE%8C%E6%95%B4%E7%AF%87).pdf)附上H3C的文档

December 13, 2013 · 1 min · pm

两例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. 找配合的网络的同学在交换机上看了下,上面没有单独去设置cost,但是确实是只有一条路由的cost是20,而另外一个集群的上联交换机能看到4条cost相同的路由只有一条路由的:有4条路由的:后来排查后发现是有1个机器的ospf配置里auto-cost reference-bandwidth被注释了。这个命令的作用是跟进带宽自动计算cost— OSPF Command: auto-cost reference-bandwidth <1-4294967>— OSPF Command: no auto-cost reference-bandwidthThis 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。 ...

December 13, 2013 · 1 min · pm

自动化配置ospf

ospf的部署因为涉及交换机配置和服务器上qugga的配置,在配置的时候一般都比较麻烦。对应ospf的一些关键配置项需要在配置前协商好,比如 hello-interval 和 dead-interval如果不匹配的话是没有办法建立起邻居关系的,另外还有ospf类型(p2p or 广播类型,etc),验证的方式、密码,area ID。当前这些都是建立在网络接线没有任何问题的前提下,如果网络接线不小心接错了2根,那就更悲剧了,其中的心酸泪唯有自己遇到了才能体会。 所以要简化自己在服务器上的配置需要从2个方向入手。一是在在配置前检查接线是否有问题,二是能自动化配置的地方就搞自动化。 因为一般配置都是网工先在交换机上把ospf配置好,所以对于双上联的情况可以比较简单的抓包查看area id是否一直来判断接线是否有问题。 tcpdump -i eth4 -nn -vv proto ospf -c1 2>/dev/null |grep Area tcpdump -i eth5 -nn -vv proto ospf -c1 2>/dev/null |grep Area 另外一个比较烦的是互联地址的配置,其实也可以直接抓包看到交换机的端口上的互联IP,可以推算出本地网卡应该配置的地址。 tcpdump -i eth4 -nn -vv proto ospf -c1 2>/dev/null |grep OSPFv2 tcpdump -i eth5 -nn -vv proto ospf -c1 2>/dev/null |grep OSPFv2 有了以上得到的信息其实就可以很方便写个脚本自动生互联网卡的配置文件,以及zebra、ospfd配置文件.在大批量配置ospf的时候可以事半功倍。

December 3, 2013 · 1 min · pm

配置VM使用单独的VLAN

实际在部署虚拟化的时候我们往往都会把宿主机和VM各自的地址段单独规划。借助OpenWrt可以自己划分一下vlan。OpenWrt上设置vlan tag可以参考之前的文章。比如我的network配置文件,划分了3个VLAN(其实最好不要使用vlan 0),非默认vlan里每个lan口都是打了vlan tag: config interface 'loopback' option ifname 'lo' option proto 'static' option ipaddr '127.0.0.1' option netmask '255.0.0.0' config interface 'lan' option ifname 'eth1.0' option type 'bridge' option proto 'static' option ipaddr '10.0.1.1' option netmask '255.255.255.0' config interface 'lan1' option ifname 'eth1.1' option type 'bridge' option proto 'static' option ipaddr '10.1.1.1' option netmask '255.255.255.0' config interface 'lan2' option ifname 'eth1.2' option type 'bridge' option proto 'static' option ipaddr '10.2.1.1' option netmask '255.255.255.0' config interface 'wan' option ifname 'eth0' config switch 'eth1' option reset '1' option enable_vlan '1' config switch_vlan option device 'eth1' option vlan '0' option ports '0 1 2t 5*' config switch_vlan option device 'eth1' option vlan '1' option ports '0t 1t 2t 5*' config switch_vlan option device 'eth1' option vlan '2' option ports '0t 1t 2t 5*' config interface 'wwan' option proto 'dhcp' 其他还需要修改好dhcp和firewall配置文件(可以简单参考之前的文章)。在自己笔记本上测试的,把有线网卡eth0加了vlan 2,把没有eth0放到br0网桥,eth0.2放到了br2。测试dhcp br0和br2分别获取到IP。 ...

November 20, 2013 · 2 min · pm

合并CIDR地址段

最近由于需要用iptables设置一些过滤规则,也有bind里配置acl的时候有合并地址段的需求。看了下cpan里有个现成的模块,几行代码就可以做这个合并工作。 #!/usr/bin/perl use strict; use warnings; use Net::CIDR::Lite; my $cidr = Net::CIDR::Lite->new; while (my $line=<>) { $cidr->add($line); } foreach my $line( @{$cidr->list} ) { print "$line\n"; } 试了下把之前100多W个段合并到5K多个段。另外如果习惯使用python的话也可以使用cidrize模块进行ip段的合并操作。 #!/usr/bin/env python import cidrize import sys import string def ipmerge(str): obj=cidrize.optimize_network_range(str) return "; \n".join(cidrize.output_str(obj).split(", "))+"; " def main(): if len(sys.argv)!=2: print “./ipmerge.py ipfile.txt” sys.exit(1) try: fd=open(sys.argv[1],“r”) except IOError as e: print “open ip file failed,",e lines=”" for line in fd: lines += line.rstrip(";\n")+"," lines=lines.rstrip(",") print ipmerge(lines) if name == “main”: main() ...

November 9, 2013 · 1 min · pm

windows下缩短time_wait的时间

最近线上遇到windows机器访问其他机器的时候失败的情况。实际就是本地的端口不够用造成的。```bash $ netsh interface ipv4 show dynamicportrange protocol=tcp 可以修改一下起始端口 netsh int ipv4 set dynamicport tcp start=2000 num=63000netsh int ipv4 set dynamicport udp start=2000 num=63000netsh int ipv6 set dynamicport tcp start=2000 num=63000netsh int ipv6 set dynamicport udp start=2000 num=63000 然后修改一下注册表缩短time-wait的时间。regedit打开注册表,添加HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters“MaxUserPort”=dword:0000fffe“TcpTimeWaitDelay”=dword:0000005 (缩短为5秒)

October 29, 2013 · 1 min · pm

也说说ip_conntrack

ip_conntrack是一个连接跟踪模块。经常被不小心开启,然后引发各种问题。比如连接太多,造成机器都登录不上,dmesg输出大量的ip_conntrack: table full, dropping packet.这个时候很多人会先把ip_conntrack_max调大,来试图缓解这个问题,有时也是可以的。一般需要调整的参数主要有: net.ipv4.netfilter.ip_conntrack_max = 655350 (默认是65535) net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300 net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120 net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60 net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120 其中ip_conntrack_max 是设置允许最大的条目数,另外需要注意几个timeout时间的设置。ip_conntrack_tcp_timeout_established这个默认值是5天,非常非常大,一般是需要调整小的。在调整之前我们可以先对系统当前的连接情况做一个统计,看看 conntack表满了的时候,每种状态的连接各占了多少,比如这样可以直接看到ESTABLISHED的状态太多了,很多都是几天前的,必须得把ip_conntrack_tcp_timeout_established调整小才能解决实际的问题。 awk ‘{a[$4]++}END{for(i in a){print i,a[i]}}’ /proc/net/ip_conntrack TIME_WAIT 1109 CLOSE_WAIT 417 CLOSE 48 SYN_SENT 101 ESTABLISHED 62793 SYN_RECV 5 FIN_WAIT 6 LAST_ACK 12 当然,最重要的一点是确认好自己的系统上是否需要使用ip_conntrack模块,如果自己不去加nat表或者state模块之类的,实际一般是用不着的,直接把这个关闭掉一切烦恼都没有了。如果非要用,还有另外的一个方式,就是在raw表标记不对这个链接进行跟踪.比如我的服务器上对外的服务端口6666端口,因为设置了通过state来判断是否对进入的包放行(设置了RELATED,ESTABLISHED ACCEPT,但是默认会DROP掉NEW,只允许机器主动访问外面),所以如果到6666端口的链接也被跟踪的话,可以会引起很多conntrack记录.实际上对于运行外部访问的端口,可以设置一下 iptables -t raw -I PREROUTING -i eth0 -p tcp --dport 6666 --j NOTRACK iptables -t raw -I OUTPUT -o eth0 -p tcp --sport 6666 --j NOTRACK 另外需要注意修改一下之前的state语句,新增对UNTRACKED的放行. ```bash iptables -I INPUT -m state --state RELATED,ESTABLISHED,UNTRACKED -j ACCEPT REROUTING链对于网关式的场景下是在路由前的操作链表,对于普通的单机来说是处理主动连接到防火墙本机的连接.OUTPUT链是因为PREROUTING链不能处理本地对外的链接,所以在使用了PREROUTING的时候也需要使用一下OUTPUT链来设置一下NOTRACK. ...

October 29, 2013 · 1 min · pm