linux使用netstat和awk分析系统日志

netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'

会得到类似下面的结果,具体数字会有所不同:

LAST_ACK 1
SYN_RECV 14
ESTABLISHED 79
FIN_WAIT1 28
FIN_WAIT2 3
CLOSING 5
TIME_WAIT 1669

状态:描述
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉

也就是说,这条命令可以把当前系统的网络连接状态分类汇总。

下面解释一下为啥要这样写:

一个简单的管道符连接了netstat和awk命令。

——————————————————————

先来看看netstat:

netstat -n

Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 123.123.123.123:80 234.234.234.234:12345 TIME_WAIT

你实际执行这条命令的时候,可能会得到成千上万条类似上面的记录,不过我们就拿其中的一条就足够了。

——————————————————————

再来看看awk:

/^tcp/
滤出tcp开头的记录,屏蔽udp, socket等无关记录。

state[]
相当于定义了一个名叫state的数组

NF
表示记录的字段数,如上所示的记录,NF等于6

$NF
表示某个字段的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是TIME_WAIT

state[$NF]
表示数组元素的值,如上所示的记录,就是state[TIME_WAIT]状态的连接数

++state[$NF]
表示把某个数加一,如上所示的记录,就是把state[TIME_WAIT]状态的连接数加一

END
表示在最后阶段要执行的命令

for(key in state)
遍历数组

print key,”\t”,state[key]
打印数组的键和值,中间用\t制表符分割,美化一下。

如发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决,
vim /etc/sysctl.conf
编辑文件,加入以下内容:

1.net.ipv4.tcp_syncookies = 1
2.net.ipv4.tcp_tw_reuse = 1
3.net.ipv4.tcp_tw_recycle = 1
4.net.ipv4.tcp_fin_timeout = 30

然后执行 /sbin/sysctl -p 让参数生效。

net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间

下面附上TIME_WAIT状态的意义:

客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口
状态为TIME_WAIT

是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢?
有没有什么情况使主动关闭的socket直接进入CLOSED状态呢?

主动关闭的一方在发送最后一个 ack 后
就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间
这个是TCP/IP必不可少的,也就是“解决”不了的。

也就是TCP/IP设计者本来是这么设计的
主要有两个原因
1。防止上一次连接中的包,迷路后重新出现,影响新连接
(经过2MSL,上一次连接中所有的重复包都会消失)
2。可靠的关闭TCP连接
在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发
fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以
主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。

TIME_WAIT 并不会占用很大资源的,除非受到攻击。

还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态

netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more

  1. netstat -tna | cut -b 49- |grep TIME_WAIT | sort
    取出目前所有 TIME_WAIT 的连接 IP ( 排序过 )

  2. net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
    net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
    net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
    net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
    net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
    net.ipv4.ip_local_port_range = 1024 65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
    net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
    net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改 为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参 数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。

     

     

    在怀疑有Dos攻击的时候,可以输入

    1 netstat -na | grep :80 |awk '{print $5}'|awk -F '::ffff:' '{print $2}' | grep ':' | awk -F: '{print $1}' |sort | uniq -c | sort -r | awk -F' ' '{if ($1 > 50) print $2}' | sed 's/^.*$/iptables -I firewall 1 -p tcp -s & --dport 80 --syn -j REJECT/' | sh

    先把冲击量最大的前50个IP给封了.

    还可以加几个例外的白名单IP

    1 netstat -na | grep :80 |awk '{print $5}'|awk -F '::ffff:' '{print $2}' | grep ':' | awk -F: '{print $1}' |sort | uniq -c | sort -r | awk -F' ' '{if ($1 > 50) print $2}' | grep -v xxx.xxx.xxx.xxx | sed's/^.*$/iptables -I RH-Firewall-1-INPUT 1 -p tcp -m tcp -s & --dport 80 --syn -j REJECT/' | sh

    以上的命令还没有实际考证过, 放在这里做参考.

 

发表在 未分类 | 一条评论

two linkwheel plans showing

发表在 未分类 | 留下评论

PHP特殊的函数调用方式

<?php
$zencart=”strlen”;
echo $zencart(‘iash21iawhdj98UH3′);
?>

以上代码等同于

<?php
$zencart=”iash21iawhdj98UH3″;
echo strlen($zencart);
?>

发表在 PHP | 留下评论

LINUX下IF的使用参数

[ -a FILE ]  如果 FILE 存在则为真。
[ -b FILE ]  如果 FILE 存在且是一个块特殊文件则为真。
[ -c FILE ]  如果 FILE 存在且是一个字特殊文件则为真。
[ -d FILE ]  如果 FILE 存在且是一个目录则为真。
[ -e FILE ]  如果 FILE 存在则为真。

[ -f FILE ]  如果 FILE 存在且是一个普通文件则为真。
[ -g FILE ]  如果 FILE 存在且已经设置了SGID则为真。
[ -h FILE ]  如果 FILE 存在且是一个符号连接则为真。
[ -k FILE ]  如果 FILE 存在且已经设置了粘制位则为真。
[ -p FILE ]  如果 FILE 存在且是一个名字管道(F如果O)则为真。
[ -r FILE ]  如果 FILE 存在且是可读的则为真。
[ -s FILE ]  如果 FILE 存在且大小不为0则为真。
[ -t FD ]  如果文件描述符 FD 打开且指向一个终端则为真。
[ -u FILE ]  如果 FILE 存在且设置了SUID (set user ID)则为真。
[ -w FILE ]  如果 FILE 如果 FILE 存在且是可写的则为真。
[ -x FILE ]  如果 FILE 存在且是可执行的则为真。
[ -O FILE ]  如果 FILE 存在且属有效用户ID则为真。
[ -G FILE ]  如果 FILE 存在且属有效用户组则为真。
[ -L FILE ]  如果 FILE 存在且是一个符号连接则为真。
[ -N FILE ]  如果 FILE 存在 and has been mod如果ied since it was last read则为真。
[ -S FILE ]  如果 FILE 存在且是一个套接字则为真。
[ FILE1 -nt FILE2 ]  如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。
[ FILE1 -ot FILE2 ]  如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。
[ FILE1 -ef FILE2 ]  如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。
[ -o OPTIONNAME ]  如果 shell选项 “OPTIONNAME” 开启则为真。
[ -z STRING ]  “STRING” 的长度为零则为真。
[ -n STRING ] or [ STRING ]  “STRING” 的长度为非零 non-zero则为真。
[ STRING1 == STRING2 ]  如果2个字符串相同。 “=” may be used instead of “==” for strict POSIX compliance则为真。
[ STRING1 != STRING2 ]  如果字符串不相等则为真。
[ STRING1 < STRING2 ]  如果 “STRING1” sorts before “STRING2” lexicographically in the current locale则为真。
[ STRING1 > STRING2 ]  如果 “STRING1” sorts after “STRING2” lexicographically in the current locale则为真。
[ ARG1 OP ARG2 ] “OP” is one of -eq, -ne, -lt, -le, -gt or -ge. These arithmetic binary operators return true if “ARG1” is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.UNIX Shell 里面比较字符写法:

-eq   等于
-ne    不等于
-gt    大于
-lt    小于
-le    小于等于
-ge   大于等于
-z    空串
=     两个字符相等
!=    两个字符不等
-n    非空串

发表在 Linux 技术 | 留下评论

最新实战讲解.htaccess文件rewrite规则

.htaccess文件大家都不陌生吧。不认识的自己去搜一下……顺便告诉你,这是个好东西,值得一学。

似乎网上关于.htaccess编写方法的教程很有限,相信博主们也没有几个是自己写的吧?

我在这里就搜了几个常用规则,总结一下rewrite规则的用法。当然这只是.htaccess功能的一小部分,但是相当实用。

如果熟练掌握rewrite规则的编写,能够加强对网站URL的控制,对用户体验、SEO都十分有利。

 

一、防盗链功能

1 RewriteEngine On
2 RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
3 RewriteCond %{HTTP_REFERER} !^$
4 RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]

逐行讲解一下:

1.打开Rewrite功能。有可能服务器设置里已经是全局下打开了,但是多写也没事。

2.RewriteCond指令,定义生效条件,用于寻找匹配条件的地址。后面内容用正则表达式匹配。代表含义是发送的请求不由mysite.com而来,那就是盗链啦。末尾的[NC]代表忽略大小写。

3.发送请求的主机前缀不为空。

4.RewriteRule指令,定义重写规则,把匹配的地址按此规则重写。本例中把这些后缀为这些图片格式的,都替换到某一个图片下。[L]表示这是最后一段规则。

只这四行就实现了防盗链是不是很神奇(- -||),编写起来是不是又觉得复杂。

这里总结了几个常用参数(不是全部):

RewriteCond下:

[NC] 不分字母大小写

[OR] 用于连接下一条规则

 

RewriteRule下:

[R] 强制重定向,[R=code] code默认为302

[F] 禁用URL,返回HTTP 403 错误

[L] 这是最后一条规则,之后内容无用

还有一篇关于正则表达式的教程(很详细):http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm

 

二、网址规范化

1 Options +FollowSymLinks
2 rewriteEngine on
3 rewriteCond %{http_host} ^yourdomain.com [NC]
4 rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]

这个是把所有二级域名都重定向到www.yourdomain.com的例子,现在看来是不是很简单了?

需要注意的是,这里的Options +FollowSymLinks不是必须的,但在某些服务器如果不设置FollowSymLinks,可能引起500错误。

再来看一个好玩的重定向

1 RewriteEngine On
2 RewriteBase /
3 RewriteCond %{HTTP_USER_AGENT} (Googlebot)
4 RewriteRule ^ http://abc.com/ [R=301,L]

1.打开Rewrite功能。

2.RewriteBase指令,设置目录级重写的基准URL。可以理解成把该目录(这个.htaccess所在目录)假定为基准的URL前缀。本例中这样的写法无用。

3.RewriteCond指令。匹配所有USER_AGENT为Googlebot的发送请求。

4.RewriteRule指令。本例中把这些请求都重定向到了abc.com。

在本例中,这个配置应该是黑客所为,把google蜘蛛指向某个网站,等于伪造PR。

 

三、临时错误页面

当你的网站在升级、修改的时候,你最好让访客转到指定的页面,而不是没做完的页面或者是错误页。

这时我们做一个302转跳就好。

1 RewriteEngine on
2 RewriteCond %{REQUEST_URI} !/maintenance.html$
3 RewriteCond %{REMOTE_ADDR} !^123.123.123.123
4 RewriteRule $ /error.html [R=302,L]

1.继续打开Rewrite功能。- -|

2.REQUEST_URI,请求的URL值。这里指所有访问maintenance.html页面的请求。

3.REMOTE_ADDR,向服务器发送请求的IP地址。本例中此处应设为你自己的IP,这样就只有你能访问。

4.RewriteRule指令。本例中把这些请求都重定向到了error.html 。

在本例,我们总结几个常用的正则表达式和特殊符号。

(.*) 用于匹配某一区域内所有内容。如 abc/def/ghi 可用 (.*)/(.*)/(.*) 匹配。

([a-zA-Z_]+) 匹配英文单词,允许用-和_连接。

([0-9]+) 匹配多位数字,通常用于匹配ID。

([0-9]) 只匹配一位的数字。

^ 表示正则的开始

$ 表示正则的结束

 

四、重定向RSS地址到Feedburner

除了可以更改模板里的RSS地址外,.htaccess也能实现RSS地址的更改,并更加方便。

1 RewriteEngine on
2 RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]
3 RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
4 RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feed.onexin.net/yourname [R=302,NC,L]

有了上面的总结,本例其实就很简单了吧。

唯一要注意的是这样操作要确保填写正确的HTTP_USER_AGENT。其实你不常换模板的话。。可能还是直接改模板更省事。

在最后,为懒虫们推荐几个好东东:

在线.htaccess生成器http://tool.onexin.net/htaccess/

mod_rewrite模块中文参考手册http://help.onexin.net/apache/mod/mod_rewrite.html

P.S. 其实我以为rewrite也只是APACHE一个模块而已,做到边查边写足矣,实在不行直接去搜一个规则也未尝不可。没有必要费太大力气去学。不过其中的正则表达式还是非常实用的,值得深入学习。

发表在 apache | 留下评论

关于css3在ie下的兼容性问题

大家都知道现在已经是css3时代了,相信看到这篇文章的您也一定垂涎于

border-radius和box-shadow这样的属性吧。

虽然用上了ie-css3.htc 之后,可以感受到css3的强大,但是在实际使用中,大家一定非常头疼于不兼容

比如以下两段代码;

第一段:

.test {
width:560px;
height:400px;
background-color:#FFFFFF;
padding:10px 8px 6px;
border: 1px solid #ff0000;
margin-bottom:10px;
-moz-border-radius: 15px; /* Firefox */
-webkit-border-radius: 15px; /* Safari and Chrome */
border-radius: 15px; /* Opera 10.5+, future browsers, and now also Internet Explorer 6+ using IE-CSS3 */

-moz-box-shadow: 10px 10px 20px #000; /* Firefox */
-webkit-box-shadow: 10px 10px 20px #000; /* Safari and Chrome */
box-shadow: 10px 10px 20px #000; /* Opera 10.5+, future browsers and IE6+ using IE-CSS3 */

behavior: url(ie-css3.htc); /* This lets IE know to call the script on all elements which get the ‘box’ class */
}

<div id=”sveinjoe”>
<div>
这个页面是用以测试主机是否有正确的content-type。
</div>
</div>

经过测试,正常显示圆角和阴影,那么如果我对test的外围div设置背景之后,

#sveinjoe{
width:962px;
height:1000px;
margin:0 auto;
background-color:#FFFFFF;
}

 

效果就大大的不相同了,圆解和阴影都不见了,这里为了排除边框和底色颜色一致导致圆角看不到的可能,我把边框的颜色设置为了红色。但是还是没有显示。

所以初步结论是在多层DIV中,如果下一层的DIV设有背景的话,border-radius    box-shadow 失效;

发表在 CSS | 留下评论

excel取文本最后一个单词的命令

=MID(TRIM(C2),FIND(“$”,SUBSTITUTE(TRIM(C2),” “,”$”,LEN(TRIM(C2))-LEN(SUBSTITUTE(TRIM(C2),” “,”"))))+1,LEN(TRIM(C2)))

解释:

1.1 TRIM(C2)  把c2里头尾多余的空格去除,把文本中间的双空格或者多空格替换成单空格;

1.2 LEN(TRIM(C2))-LEN(SUBSTITUTE(TRIM(C2),” “,”")) 通过比对文本的总长度和文本去掉空格之后的长度差来获取总共有多少个空格N

1.3 SUBSTITUTE(TRIM(C2),” “,”$”,LEN(TRIM(C2))-LEN(SUBSTITUTE(TRIM(C2),” “,”")))

将c2中的文本进行1.1操作之后,以及获取到总空格数量N之后,将第N个空格替换成$

1.4 获取文本中$的位置,并用mid函数取从$开始到文本结尾的单词。

 

发表在 未分类 | 留下评论

莆田送入洞房用语、赞语

1.今夜大家送孩儿,新郎新娘啼微微。燕尔新婚鱼得水,早生贵了耀门楣

2.洞房花烛小仙人,一对凤灯挂两边。东西接换入门喜,一刻千金乐多年。3.大家齐没门,单手掩房门。洞房初会见,妻妻情义绵。

新婚誓言:我们两人举讫手,从此成了小两心.我们两人一根筋,海枯石烂不变心.尔们两人共提高,多吃罗卜少吃醋.我们两人有寻求,共创美妙争上游.咱们两人情感佳,明年就生小宝宝.恭喜祝贺昨天两人走到一伏,恭贺恭贺明年两个变成三个.

新郎新娘抱出灯

这个消息大新颖

妇妻独特全尽力

明年确定贵子生

赞诵四句:

今请金杯且收起,今宵才郎配淑女;

夫妻洞房花烛夜,明年一定抱孩儿。

送赞四句:

洞房花烛小神仙,一对凤灯挂两边;

货色交流进门喜,一寸光阴一寸金乐青年。

今宵闹房喜苍苍,抱起新娘挂灯笼;

进灯是三元五桂,放下是百子千孙。

赞诵四句:

洞房花烛房中启,仙母亲身送子来;

土地举香去迎接,天赐文曲星投胎。

一对烛火笑微微,南海观音送子来;

新郎新娘亲手交,夫妻牢牢抱帐里。

发表在 其他转载 | 留下评论

浅淡mysql的tsql语句中的limit的用法

大家都知道mysql里有一个limit功能,用来限制数据库分页。那么limit如何使用呢?

使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已 经为我们提供了这样一个功能。

SELECT * FROM table   LIMIT [offset,] rows | rows OFFSET offset

LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初 始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。

mysql> SELECT * FROM table LIMIT 5,10;  // 检索记录行 6-15

//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.

//如果只给定一个参数,它表示返回最大的记录行数目:
mysql> SELECT * FROM table LIMIT 5;     //检索前 5 个记录行

//换句话说,LIMIT n 等价于 LIMIT 0,n。
发表在 未分类 | 2 条评论

ultra edit如何匹配星号

ultra edit有正则替换功能,

但是*本身代表多个字符,比如在下面的例子中,如何表达星号呢?

删除文本中所有

/*  与*/之间的字符(包含/* 与 */)

这里有一解
/[*]*[*]/
可用[*]来代表星号本身。题解!

viagra

发表在 Windows 实战 | 留下评论