一、LVS持久连接的模式
1、PPC(persistent port connection)
ipvsadm -A|E 192.168.10.1:80 -p 600
定义VIP为192.168.10.1director的80端口为持久连接,也就是只把web服务加入集群服务,可以通过改变端口实现不同服务的持久连接且把不同服务加入集群服务
2、PCC(persistent client connection)
ipvsadm -A|E 192.168.10.1:0 -p 600
定义VIP为192.168.10.1 director的所有端口为持久连接,也就是把该VIP上的所有服务加入集群服务
3、PNMPP
# iptables -t mangle -A PREROUTING -d $VIP -p tcp --dport $ClusterPORT -i $INCARD -j MARK --set-mark 10
ipvsadm -A --f 10 -s rr
通过iptables给不同服务做MARK标记,把不同服务定义为同一组,这样再通过ipvsadm的-f选项来实现对同一组服务的持久连接,且把它们加入集群服务
二、AWK的学习笔记
awk是通过对目标文件进行处理,处理完了之后输出报告。对文件的处理过程是以行为单位的,即逐行处理,然后对每行的字段进行分割,通过模式匹配后进行处理最后形成报告。
1、AWK命令格式
awk [options] ‘script‘ file1 file2, ...
awk [options] ‘pattern { action }‘ file1 file2, ...
2、[options]
-F : 用来指定分隔符,awk默认是以空格为字段分割符的,cut默认是以tab为字段分割符的
cut -d‘‘ -f1 -d 指定分隔符 -f选择分割后的字段
-v : 用来自定义变量
awk -v a="hai lang" ‘BEGIN{printf a}
注:变量引用不需要$
也可以通过BEGIN{}语句实现自定义变量
awk ‘BEGIN{a="hai lang" ; printf a}‘
注:语句之间需要用";"隔开
3、awk中的内置变量
FS(filed separator) 它是用来对读取文本,所使用的字段分隔符
RS(record separator) 它是用来对读取文本,所使用的行分隔符
OFS(outfile filed separator) 它是用来对,进过处理后的文本,输出字段分隔符
ORS(outfile row separator) 它是用来对,进行处理后的文本,输出行分隔符
NR(number of record) awk会对多个文件进行处理,而NR显示目前处理的行号(统计所有文
件的行号,该行号即是相对于所有文件的行号)
NF(number of filed) 通过NF可以显示当前行的总字段数,$NF显示最后一个字段
FNR awk会对多个文件处理,但是FNR只显示,当前正在处理的文件的行号
4、print和printf
它们都是输出函数,都要匹配一定的格式,print默认换行的
%s 以字符串格式输出
%d 以整形格式输出
%f 以浮点型格式输出
N 确定输出字符的长度
- 左对齐输出
‘{printf "%-15s %d\n",$1,$3}‘
$1以字符串的格式输出,共输出15个字符串,且是左对齐,不足的字符以空代替,多的不显示
$3以整型输出
$1和$3以enter作为分行符
5、[pattern]
pattern用来匹配在文本中的内容,也就是进行过滤合适的文本
1、Regexp: 正则表达式,格式为/regular expression/
2、expresssion: 表达式,其值非0或为非空字符时满足条件
x < y | x <= y | x > y | x >= y | x == y | x != y | x ~ y | x !~ y
3、Ranges: 指定的匹配范围,格式为pat1,pat2
4、BEGIN/END:特殊模式,仅在awk命令执行前运行一次或结束前运行一次
通过正则表达式,字符运算符,数字运算符,布尔运算符等,进行模式匹配达到过滤的效果,最后对匹配到的结果进行处理。
6、[action]
对匹配到的文本,进一步采取的操作
------------------
if-else
-----------------
语法:if (condition) {then-body} else {[ else-body ]}
awk -F: ‘{if ($1=="root") print $1, "Admin"; else print $1, "Common User"}‘ /etc/passwd
先判断每行的第一个字段是不是root,如果是root则打印该行第一个字段,并且标记为admin
如果不是root也打印该行第一个字段,并且标记为common user
awk -F: ‘{if ($1=="root") printf "%-15s: %s\n", $1,"Admin"; else printf "%-15s: %s\n", $1, "Common User"}‘ /etc/passwd
和上面一样只是改变了输出格式,如果只有一个if else可以不加{}
awk -F: -v sum=0 ‘{if ($3>=500) sum++}END{print sum}‘ /etc/passwd
判断每一行的第三个字段,如果大于等于500,就把sum变量加一,END是在处理完所有行,要退出之前
执行打印sum的统计值
----------------
while
----------------
语法: while (condition){statement1; statment2; ...}
awk -F: ‘{i=1;while (i<=3) {print $i;i++}}‘ /etc/passwd
while是对每一行的每一个字段进行循环,也就是输出每一行的前3个字段
awk -F: ‘{i=1;while (i<=NF) { if (length($i)>=4) {print $i}; i++ }}‘ /etc/passwd
while (i<=NF) 其中NF是字段总数,也就是对每一行的所有字段进行循环
length是一个内置函数,它可以判断出每一行每一个字段的长度
if就是判断字段长度大于等于4的字段,然后把它们输出
总结就是:找出每一行大于等于4的字段
----------
do-while
----------
语法: do {statement1, statement2, ...} while (condition)
awk -F: ‘{i=1;do {print $i;i++}while(i<=3)}‘ /etc/passwd
和while区别就是,在执行循环之前先执行一次动作
-------
for
--------
语法: for ( variable assignment; condition; iteration process) { statement1, statement2, ...}
awk -F: ‘{for(i=1;i<=3;i++) print $i}‘ /etc/passwd
输出每一行的前3个字段
awk -F: ‘{for(i=1;i<=NF;i++) { if (length($i)>=4) {print $i}}}‘ /etc/passwd
输出每一行大于4个长度的字段
for循环还可以用来遍历数组元素:
语法: for (i in array) {statement1, statement2, ...}
awk -F: ‘$NF!~/^$/{BASH[$NF]++}END{for(A in BASH){printf "%15s:%i\n",A,BASH[A]}}‘ /etc/passwd
-------
case
-------
语法:switch (expression) { case VALUE or /REGEXP/: statement1, statement2,... default: statement1, ...}
-------------------------
break 和 continue
------------------------
常用于循环或case语句中
--------
next
--------
提前结束对本行文本的处理,并接着处理下一行;例如,下面的命令将显示其ID号为奇数的用户:
awk -F: ‘{if($3%2==0) next;print $1,$3}‘ /etc/passwd
awk ‘{counts[$1]++}; END {for(url in counts) print counts[url], url}‘ /var/log/httpd/access_log
counts[$1]++
获取access_log日志中的第一个字段的值,把它作为counts数组的下标,++的意思是如果在对access_log文档中再次出现相同的字段,就对counts[$1]自动加1
END 用for遍历counts数组,最后通过print函数把相同字段的值和它在access_log文本中出现的次数输出
7、可以使用 awk -f 调用调用awk脚本
也可以直接在文本中加入#!/bin/awk -f 做声明
给该脚本执行权限,通过awk scripts file 来执行
系统连接状态篇:
1.查看TCP连接状态
netstat -nat |awk ‘{print $6}’|sort|uniq -c|sort -rn
netstat -n | awk ‘/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}’ 或
netstat -n | awk ‘/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}’
netstat -n | awk ‘/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"t",arr[k]}’
netstat -n |awk ‘/^tcp/ {print $NF}’|sort|uniq -c|sort -rn
netstat -ant | awk ‘{print $NF}’ | grep -v ‘[a-z]‘ | sort | uniq -c
2.查找请求数请20个IP(常用于查找攻来源):
netstat -anlp|grep 80|grep tcp|awk ‘{print $5}’|awk -F: ‘{print $1}’|sort|uniq -c|sort -nr|head -n20
netstat -ant |awk ‘/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A[i],i}’ |sort -rn|head -n20
3.用tcpdump嗅探80端口的访问看看谁最高
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." ‘{print $1"."$2"."$3"."$4}’ | sort | uniq -c | sort -nr |head -20
4.查找较多time_wait连接
netstat -n|grep TIME_WAIT|awk ‘{print $5}’|sort|uniq -c|sort -rn|head -n20
5.找查较多的SYN连接
netstat -an | grep SYN | awk ‘{print $5}’ | awk -F: ‘{print $1}’ | sort | uniq -c | sort -nr | more
6.根据端口列进程
netstat -ntlp | grep 80 | awk ‘{print $7}’ | cut -d/ -f1
网站日志分析篇1(Apache):
1.获得访问前10位的ip地址
cat access.log|awk ‘{print $1}’|sort|uniq -c|sort -nr|head -10
cat access.log|awk ‘{counts[$(11)]+=1}; END {for(url in counts) print counts[url], url}’
2.访问次数最多的文件或页面,取前20
cat access.log|awk ‘{print $11}’|sort|uniq -c|sort -nr|head -20
3.列出传输最大的几个exe文件(分析下载站的时候常用)
cat access.log |awk ‘($7~/.exe/){print $10 " " $1 " " $4 " " $7}’|sort -nr|head -20
4.列出输出大于200000byte(约200kb)的exe文件以及对应文件发生次数
cat access.log |awk ‘($10 > 200000 && $7~/.exe/){print $7}’|sort -n|uniq -c|sort -nr|head -100
5.如果日志最后一列记录的是页面文件传输时间,则有列出到客户端最耗时的页面
cat access.log |awk ‘($7~/.php/){print $NF " " $1 " " $4 " " $7}’|sort -nr|head -100
6.列出最最耗时的页面(超过60秒的)的以及对应页面发生次数
cat access.log |awk ‘($NF > 60 && $7~/.php/){print $7}’|sort -n|uniq -c|sort -nr|head -100
7.列出传输时间超过 30 秒的文件
cat access.log |awk ‘($NF > 30){print $7}’|sort -n|uniq -c|sort -nr|head -20
8.统计网站流量(G)
cat access.log |awk ‘{sum+=$10} END {print sum/1024/1024/1024}’
9.统计404的连接
awk ‘($9 ~/404/)’ access.log | awk ‘{print $9,$7}’ | sort
10. 统计http status
cat access.log |awk ‘{counts[$(9)]+=1}; END {for(code in counts) print code, counts[code]}‘
cat access.log |awk ‘{print $9}‘|sort|uniq -c|sort -rn
10.蜘蛛分析,查看是哪些蜘蛛在抓取内容。
/usr/sbin/tcpdump -i eth0 -l -s 0 -w - dst port 80 | strings | grep -i user-agent | grep -i -E ‘bot|crawler|slurp|spider‘
网站日分析2(Squid篇)按域统计流量
zcat squid_access.log.tar.gz| awk ‘{print $10,$7}‘ |awk ‘BEGIN{FS="[ /]"}{trfc[$4]+=$1}END{for(domain in trfc){printf "%st%dn",domain,trfc[domain]}}‘
数据库篇
1.查看数据库执行的sql
/usr/sbin/tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | egrep -i ‘SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|CALL‘
系统Debug分析篇
1.调试命令
strace -p pid
2.跟踪指定进程的PID
gdb -p pid
三、SED(Stream EDitor)
sed默认是模式空间,sed读入file中的文本,交给sed的模式空间(内存中),进行模式过滤并对过滤后的结果进行处理,最终输出到桌面。
1、格式
sed [options] ‘[模式过滤][命令]’文本
[options]
-n 静默模式,不再是默认的模式空间内容
-i 直接修改原文件,保存修改后的结果
-e 可以同时执行多次,-e ‘[模式过滤][命令]‘ -e ‘[模式过滤][命令]‘
-f 调用sed脚本对某个file进行处理 sed -f script file
-r 使用扩展正则表达式
模式过滤类型
1,10或者$ 就是过滤出第n行到第n行的内容,$为最后一行,$-1位倒数第二行
/reg/ /^root/使用正则过滤需要的内容
/patter1/,/patter2/过滤出匹配第一个模式到匹配第二个模式的文本
n 精确匹配某一行
n,+n过滤出n行开始后的n行文本
命令
d 对匹配到的行执行删除操作
p 对匹配到的行执行输出操作
a\对匹配到的行后面添加\后的string
i\对匹配到的行前面添加\后的string
r file 将指定的文件的文本添加到符合条件的行处
w file 将符合条件的文本另存到指定的文件中
s/pattern/string/修饰符 查找并替换,默认只替换第一次被匹配到的内容
g 为全局替换
i 忽略大小写
like替换为liker
love替换为lover
sed ‘s#l..e#&r#g‘ 1.txt &引用pattern中的全部内容
sed ‘s#\(l..e\)#\1r#g‘ 1.txt \1表示引用pattern中括号中的原子符
pattern支持原子符,string不支持原子符
四、grep
basic regexp 基本正则表达式
extended regexp 扩展正则表达式
1、格式
grep [options] PATTERN [FILE...]
-i 忽略大小写
--color 匹配到的标出颜色
-v: 显示没有被模式匹配到的行
-o:只显示被模式匹配到的字符串本身
-E: 使用扩展正则表达式
-A n:当某一行被匹配到时,不仅匹配那一行还匹配它下面的n行
-B n:前面的n行
-C n:前后各n行
2、扩展正则
.任意单个字符
[]指定范围内的任意单个字符
[^] 指定范围之外的任意单个字符
*前面字符0次或任意次匹配
?前面的字符0 或一次匹配 \? 基础正则
{m,n}m到n次 \{m,n\} 基础正则
+前面字符至少一次匹配
^以什么开头
&以什么结尾
\<锚钉字符头 =\b
\>锚钉字符尾 =\b
()组,里面的内容为一个组对待通过\1,\2来引用分组 \(\)基础正则
a|b a或者b
C|cat C或者cat
(C|c)at C或者c 即Cat或者cat
egrp -E = egrep
匹配grub.confz中1-255的数字
egrep --color ‘\<([1-9]|[1-9][0-9]|[1-9][0-9][0-9]|2[0-4][0-9]|25[0-5])\>‘ grub.conf
()里面的内容为一个整体
| 为或者1-9 或者10-199或者200-249或者250-255
\< 以|中的某个数字开始
\>以|中的某个数据结束
找出ifconfig 中的ip地址
egrep --color ‘(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>’
找出ifconfig 中的ABC三类地址
\<[1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3]\>(\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>){2}\.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>