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

TCP三次握手的意义

大家去面试的时候,经常都让简单介绍TCP的三次握手。上半年我也去面试了一下,问了十多个人,基本都只能简单说出三次握手的SYN,ACK-SYN,ACK的发送顺序。不过基本没有人能完成说出三次握手的关键所在。 三次握手的功能主要实际包括几种:1. 接触和通信。2. 序列号的交换。client和server端把自己的初始序列号isn(一个随机数)告诉对方。3. MSS协商,协商发送报文的最大长度。4. 交换其他的参数。比如窗口比例因子(Window Scale Factor)等等

October 27, 2013 · 1 min · pm

ospf的dr、bdr

ospf协议中是有多种网络类型:1. 点到点网络(p2p)2. 广播网络(broadcast)3. 非广播多路访问(nbma)4. 点到多点(p2mp)5. 虚链路(virtual links) 其中只有广播类型和非广播多路访问是有DR,BDR的。其他三种网络类型都是没有DR,BDR的。比如P2P的 对于广播类型和非广播多路访问类型的OSPF,都是需要靠DR(BDR)来做LSA的floodding。比如有路由器R1,R2,R3,R4,R5。如果R1选举为了DR,R2是BDR,那么实际R2,R3,R4,R5都只与R1形成邻接关系。R1-5将会继续发hello包到224.0.0.5这个组播地址。更新数据包的发送是R3-R5会以组播的方式发送到组播地址224.0.0.6(只有R1 R2监听这个地址),DR收到后再使用组播发到224.0.0.5更新整个区域的LSA。

October 20, 2013 · 1 min · pm

snat dnat测试

今天同事问了个dnat的问题,就是在linux服务器上把某个端口的流量dnat到上面跑的某个kvm虚拟机上没有正常工作,简单看了下就是ip_forward没有打开。。想着自己也很多没有搞过这些了,简单试试snat+dnat。基本的结构是目的使用192.168.100.17做代理服务器,专门做SNAT+DNAT,练习NAT的使用。 192.168.125.135(client)–>192.168.100.17(NAT机器)–> 192.168.128.26(DNS服务器)可以看到这几个IP都不在同一个24掩码的vlan内,所以没有办法把NAT机器设置成DNS机器的网关。所以配置上更加复杂一点,不过也便于理解nat的工作流程。实际就是在prerouting和postroute的对包的操作了。 先在 192.168.100.17上设置DNAT,让从192.168.125.135进来的dns查询包的目的IP修改为192.168.128.26```bash #iptables -t nat -A PREROUTING -i bond0 -p udp –dport 53 -j DNAT –to-destination 192.168.128.26:53 192.168.100.17上设置SNAT,把上面的包在经过路由表后,出去前把source ip改了。```bash #iptables -t nat -A POSTROUTING -o bond0 -p udp -d 192.168.128.26 –sport 53 -j SNAT –to-source 192.168.100.17

October 16, 2013 · 1 min · pm

igb Detected Tx Unit Hang

公司大量的服务器使用了intel的网卡,主要是intel I350/82580/82576。 各个版本的igb驱动都出现过detected tx unix hang的报错。大部分是老版本igb的bug,更新到新版后基本都解决了。不过最近发现有几台I350(4端口)的升级了驱动还是存在这样的报错。Detected Tx Unit Hang in Quad Port Adapters http://downloadmirror.intel.com/20927/eng/e1000.htmIn some cases ports 3 and 4 don’t pass traffic and report ‘Detected Tx Unit Hang’ followed by‘NETDEV WATCHDOG: ethX: transmit timed out’ errors. Ports 1 and 2 don’t show any errors and will pass traffic.This issue MAY be resolved by updating to the latest kernel and BIOS. The user is encouraged to run anOS that fully supports MSI interrupts. You can check your system’s BIOS by downloading the LinuxFirmware Developer Kit that can be obtained at http://www.linuxfirmwarekit.org/ ...

October 15, 2013 · 1 min · pm

iptables使用tee模块镜像流量

一般的流量镜像需要在交换机上做,实际上iptables也有个tee模块做流量镜像。在OpenWrt里使用也比较简单。1. 把tee模块安装上加载进去(需要依赖ipv6模块)```bash opkg install kmod-ipt-tee 2.把某个源IP的包镜像发到指定的IPiptables -t mangle -A PREROUTING -s 192.168.3.224 -j TEE –gateway 192.168.3.100 4. 删除规则iptables -t mangle -F 5. 也可以把整个网段的都镜像root@wan:/etc/config# iptables -t mangle -A PREROUTING -s 192.168.3.0/24 -j TEE –gateway 192.168.3.100root@wan:/etc/config# iptables -t mangle -A POSTROUTING -d 192.168.3.0/24 -j TEE –gateway 192.168.3.100 上图是抓包手机 微博和易讯客户端打开的的DNS查询。

October 12, 2013 · 1 min · pm

使用memtester测试内存

最近有几个新的服务器,经常有一堆内存的报错。并且是服务上线后才发现的,dmesg里能看到很多错误信息,但是带外直接看sel log又没有异常。尝试了下使用memtester来测试。使用比较简单,直接编译安装后,放screen运行。Usage: memtester [-p physaddrbase][B|K|M|G] [loops]```bash ./memtester 7G 10测试7G内存,循环10次 [memtester](http://pyropus.ca/software/memtester/)

October 12, 2013 · 1 min · pm

adjtimex使用

今天遇到一个ntp的同步问题。服务器上配置好了ntpd,在启动前也手动进行过同步,但是过段时间ntpq查询发现服务器即便能选出同步服务器,但是系统的时间偏差越来越大。服务器上实际有2个时钟,一个是主板电池驱动的硬件时间(RTC或者CMOS时间),另外就是系统时间。服务器启动时会从RTC里读取一次时间,之后便靠中断来计时。可以设置ntpd同步后讲时间写回RTC. 语法:adjtimex [OPTION]… 主要参数说明: -p, –print 输出内核时间变量的值 -t, –tick val 设置内核时钟计数间隔(微秒) -f, –frequency newfreq 设置系统时钟偏移量 -c, –compare[=count] 比较系统时钟和CMOS时钟 -i, –interval tim 设置时钟比较间隔时间 (sec) -l, –log[=file] 将当前时间记录到文件中 –host timeserver 查询时间服务器 -u, –utc 将CMOS时钟设置成UTC 在服务器上先比较一下系统时间和CMOS时间 # adjtimex --compare --- current --- -- suggested -- cmos time system-cmos error_ppm tick freq tick freq 1381503971 1.751318 1381503981 1.721794 -2952.4 10000 -1573016 1381503991 1.692179 -2961.5 10000 -1573016 10029 2456959 1381504001 1.662619 -2956.0 10000 -1573016 10029 2097584 1381504011 1.633055 -2956.4 10000 -1573016 10029 2122584 1381504021 1.603491 -2956.4 10000 -1573016 10029 2122584 1381504031 1.573928 -2956.3 10000 -1573016 10029 2117896 1381504041 1.544361 -2956.7 10000 -1573016 10029 2142896 ...

October 11, 2013 · 1 min · pm

使用dnspython解析zone文件生成反解记录

今天试了下使用dnspython来解析zone文件,然后把IP->Domain信息输出来。按照PTR格式输出到zone文件里面。 #!/usr/bin/env python2.7 import dns.zone import dns.ipv4 import os.path import sys import string import re zonedir='/home/work/dns/var/named/zone/' tempdir='/home/work/dns/script/' master_zones=("zone1.xxx.com","zone2.xxx.com") ptr_zones=("10.rev","172.rev") class PTR: def __init__(self,zones): self.new_serial=dict() self.reverse_map=dict() for zonefile in zones: filename=zonedir+zonefile zone = dns.zone.from_file(filename,os.path.basename(filename),relativize=False) for (name, ttl, rdata) in zone.iterate_rdatas('SOA'): serial=str(rdata).split()[2] if serial > 0: self.new_serial[zonefile]=int(serial)+1 if len(sys.argv) ==2 : self.new_serial[zonefile]=int(sys.argv[1]) else: print “read old ptr zone file:%s err” % zonefile sys.exit(2) def load_master_zone(self,zones): for zonefile in zones: filename=zonedir+zonefile zone = dns.zone.from_file(filename,os.path.basename(filename),relativize=False) for (name, ttl, rdata) in zone.iterate_rdatas('A'): match=re.search(r’*.’,str(name)) if match: print “ignore *.xxx domain” continue ...

October 10, 2013 · 1 min · pm