旌旗博客

2008-07-23

自动阻止SYN、DoS攻击

Filed under: I.T. — 标签:, — rocky @ 13:51

除了告警敦促人工处理SYN、DoS攻击,可以将嫌疑犯先抓起来再说:

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 RH-Firewall-1-INPUT 1 -p tcp -m tcp -s & --dport 80 --syn -j REJECT/' | sh

该脚本基于的基础是认为从一个IP过来的连接数过大(超过50个),则该IP可能在进行攻击。实际上可能误杀掉一些只能通过代理服务器访问的大公司用户,或者某些有点贪心的网络爬虫。可以在脚本中加入一些白名单以防止误杀,如:

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


2008-05-16

自动短信提醒进行服务器状态告警

Filed under: I.T. — 标签:, — rocky @ 16:22

定时启动的脚本:

df | grep “/var” | awk ‘{ print $5 }’ | awk -F”%” ‘{print $1}’ | awk ‘{ if ($1 > 90){print “alert.sh \”139xxxxxxxx\” \”insufficient disk space on /var. “,$1,”\””} }’ | csh
ps -ef | grep httpd | grep -v cronolog | grep -v grep | grep -v root | wc -l | awk ‘{ if ($1 > 3000){print “alert.sh \”139xxxxxxxx\” \”apache process “, $1,”\””} }’ | csh
echo ‘show processlist’ | mysql | grep -v Id | grep -v processlist | wc -l | awk ‘{ if ($1 > 3000){print “alert.sh \”139xxxxxxxx\” \”mysql process “, $1,”\””} }’ | csh

alert.sh 脚本:

echo $2
echo -e “From:monitor<>\nReply-to:support <support.labs@etentec.com>\nSubject:$2\n\n$2\n.” | /usr/sbin/sendmail $1@139.com

一个监视服务器状态的shell脚本

Filed under: I.T. — 标签:, — rocky @ 14:03

#! /bin/bash

for1
do
    clear
    date
    echo -n ‘httpd process:             ‘;ps -ef | grep httpd | grep -v cronolog | grep -v grep | grep -v root | wc -l
    echo -n ‘http connection:   ‘;netstat -an | grep :80 | grep ESTABLISHED | wc -l
    echo -n ‘mysql process:             ‘;echo ‘show processlist’ | mysql | grep -v Id | grep -v processlist | wc -l
    echo -n ‘mysql connection:  ‘;netstat -an | grep 3306 | grep ESTABLISHED | wc -l
    echo ‘tcp connection stats:’;netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print ”   “,a, S[a]}’
    echo ‘sorted ESTABLISHED connections: ‘;netstat -na|grep ESTABLISHED|awk ‘{print $5}’|awk -F: ‘{print $1}’|sort|uniq -c|sort -r +0n
    echo ‘sorted SYN connections: ‘; netstat -na|grep SYN|awk ‘{print $5}’|awk -F: ‘{print $1}’|sort|uniq -c|sort -r +0n
    sleep 5
done

  1. ; ; []

2007-03-26

配置自动登录的OpenSSH

Filed under: I.T. — 标签:, — rocky @ 22:08

      在不使用SecureCRT或者PuTTY的时候,用ssh登录远程服务器总是要输入密码,挺麻烦的。而且做系统管理,总是需要与自动化的命令行打交道,把密码明码写在脚本里实在不是一个合格的系统管理员做的事情。这儿有个解决办法:

      1、在本机上创建密钥对:

$ cd ~/.ssh
$ ssh-keygen -t dsa
   根据提示输入密码,此密码与远程ssh密码无关。

      2、将公钥文件复制到远程服务器上:

$ scp ~/.ssh/id_dsa.pub user@remote.host:pubkey.txt
$ ssh user@remote.host
$ mkdir ~/.ssh
$ chmod 700 .ssh
$ cat pubkey.txt >> ~/.ssh/authorized_keys
$ rm ~/pubkey.txt
$ chmod 600 ~/.ssh/*
$ exit

      3、测试远程服务器上的公钥:

$ ssh user@remote.host
   系统应该在这里提示要输入私钥密码,就是在ssh-keygen时创建的。

$ exit

      4、启动ssh-agent代理:

$ eval `ssh-agent`

      5、将私钥加到ssh-agent代理的缓存中去:

$ ssh-add
    又要输一遍私钥密码。

      6、测试一下:

$ ssh user@remote.host
$ exit

      7、因为自动登录的实现是由ssh-agent保存了登录信息实现的,因而在使用之前需要启动ssh-agent。自动启动ssh-agent代理:下载sssha脚本,并放到~/.ssh/目录下,并在~/.bashrc文件中加入:

# setup ssh-agent, if appropriate
if [ -f “$HOME/.ssh/sssha” ]; then
   source $HOME/.ssh/sssha
fi

 

本文参考http://www.mtu.net/~engstrom/ssh-agent.php

2007-02-09

系统监控使用短信进行通知

Filed under: I.T. — 标签: — rocky @ 18:11

code.screen, div.codescreen{
font-family: monospace;
font-size: 1em;
display: block;
padding: 10px;
border: 1px solid #bbb;
background-color: #eee;
color: #000;
overflow: auto;
border-radius: 2.5px;
-moz-border-radius: 2.5px;
margin: 0.5em 2em;
}

1、发送短信:

       原来我是利用bj1860的邮箱的短信通知进行发短信,调用sendmail发送邮件就可以了。这个是要一条1毛钱的,现在公司有了移动的信息机,自然要好好利用了。只是信息机不是托管在IDC,也没有固定IP。没关系,劳动人民的力量是无穷的。

       1.1 我们先来做个动态dns。外面有些做DDNS服务的,但是也是要钱的。穷人有穷人的活法:
         在信息机上做个计划任务,每10分钟执行一次这个批处理:

d:\\cygwin\\bin\\wget -O ip.txt http://穷人的服务器/ddns/registerip.php

         穷人的服务器上有个registerip.php:

<?php    
   echo $_SERVER["REMOTE_ADDR"];
   $handle = fopen ("ip.txt","w");
   fwrite($handle,$_SERVER["REMOTE_ADDR"]);
   fclose ($handle); 
?> 

         这样就在服务器上生成了一个记录了信息机网关IP的文件http://穷人的服务器/ddns/ip.txt。在服务器上要想访问信息机,还需要在信息机的网关的上做端口映射才行。             

       1.2 在服务器上做个shell程序以方便的调用信息机上的发送短信接口:

         信息机上的发送短信接口为:http://信息机IP/sendSMS.php?phoneNumber=手机号&content=短信内容。于是向单个手机号发送短信的shell程序sendsms.sh:

#!/bin/bash
declare -a smscontent=`echo $2 | sed -e "s/\ /+/g"`         #URL中的参数里用+代替空格
`wget -q -O - http://穷人的服务器/ddns/ip.txt | sed -e "s/^/wget -q -O - http:\/\//g" | sed -e "s/$/\/sendSMS.jsp?phoneNumber=$1\&content=$smscontent/g" | sed -e "s/\&/\\\&/g" `  #从ip.txt取得IP地址,然后再前面加上"wget -q -O - http://",在后面加上"\sendSMS.jsp?phoneNumber=$1\&content=$smscontent",再执行这条命令

         我们有多个人想得到通知,简单,再做个多发送的shell程序sendsms2.sh:

#!/bin/bash
echo $1 | awk -F";" '{for (i=NF;i>0;--i) print "/home/rocky/sendsms.sh ",$i," "}' | sed -e "s/$/$2;/g" | csh

         这样向多个手机号发送短信就这样写就行了:

sendsms2.sh "13910920000;13911060000" "短信内容"

 

2、定期监控:

    1.1 监控磁盘空间:

          监控如果/var空间使用率超过85%则发送告警,使用crontab -e增加一条,每天9点15分检查:

15 09 * * * df | grep "/var" | awk '{ print $5 }' | awk -F"\%" '{print $1}' | awk '{ if ($1 > 85){print "/usr/local/bin/sendsms2.sh \"13910920000;13911060000\" \"insufficient+disk+space+on+server\" "} }' | csh

    1.1 监控oracle连接数如果超过100则告警,9点到23点之间每半小时检查一次:

*/30 9-23 * * * ps -ef | grep oracle | wc -l | awk '{ if ($1 > 100){print "/usr/local/bin/sendsms2.sh \"13910920000;13911060000\" \"too many oracle connections\" "} }' | csh

2007-01-26

"Add Hardware" on Redhat Linux

Filed under: I.T. — 标签: — rocky @ 11:03

During redhat is booting, system will detect new hardwares automatically. If you choose “Keep configuration” or  “Do nothing”, system may not run correctly. Don’t regret, run “/usr/sbin/kudzu” under terminal, new hardwares and removed hardwares will be detected again, then you will have another chance to make a better decision.

2007-01-22

windows环境中的linux环境 —— cygwin

Filed under: I.T. — 标签:, — rocky @ 13:52

第一次接触cygwin(http://cygwin.com/)已经是5年前了。windows的优点就是:傻瓜式,在windows下拥有一个linux环境还是很酷的。譬如查找文件内容,习惯了用grep的会很讨厌用windows的explorer自带的搜索功能,太弱智了,而且bug不老少的,记得有次我好心好意地写邮件给M$说明bug情况,他们居然回邮件啥都不说就问我要客户号,晕啊,扯远了……

cygwin提供了一个叫做cygwin1.dll的dll,这个dll提供了linux API模拟层。很多linux上常用的工具都能基于cygwin上运行,譬如make、gcc等等,甚至gnome。

远程linux上运行一些程序譬如oracle的安装程序需要图形界面时,用cygwin就能轻松搞定。

先在本地启动X服务器:
$ XWin.exe -ac -multiwindow &
再在远程linux上设置环境变量:
$ export DISPLAY=:0.0
之后就可在远程linux上运行程序,在本地的窗口中操作程序的图形界面了。

如果想操作远程linux的桌面:
本地运行:
$ XWin.exe -ac &
再远程linux上设置好DISPLAY之后,运行
$ gnome-wm & # 这是窗口管理器
$ gnome-panel & # 这是gnome的任务条之类的管理程序

Powered by WordPress