检测sshd端口误封脚本

回复 收藏
今天在专贴里一个同学提到一个问题,他不小心用iptables规则把sshd端口22给封掉了,结果不能远程登陆,要想解决这问题,还要去机房,登陆真机去删除这规则。 问题来了,要写个监控脚本,监控iptables规则是否封掉了22端口,如果封掉了,给打开。 写好脚本,放到任务计划里,每分钟执行一次。

{{{密码回复可见}}}


2016-02-24 11:01 举报
已邀请:
0

wsw13640218682

赞同来自:

本帖最后由 wsw13640218682 于 2016-2-28 23:00 编辑

[root@nz ~]# vi iptables.sh
#monitor iptables port 22
#!/bin/bash
a=`iptables -nvL |awk '/dpt:22/{print $3}'`
if [ "$a" == DROP ]
then
sed -i '/--dport 22/s/DROP/ACCEPT/' /etc/sysconfig/iptables
fi

crontab -e
*/1  *  *  *  *    /bin/bash    /root/iptables.sh
0

boy461205160

赞同来自:

本帖最后由 boy461205160 于 2016-2-25 11:50 编辑
  1. #!/bin/bash
  2. # check sshd port drop
  3. /sbin/iptables -nvL --line-number|grep "dpt:22"|awk -F ' ' '{print $4}' > /tmp/drop.txt
  4. i=`cat /tmp/drop.txt|head -n 1|egrep -iE "DROP|REJECT"|wc -l`
  5. if [ $i -gt 0 ]
  6. then
  7. /sbin/iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
  8. fi
[root@master ~]# crontab e
*/1 * * * * bash /root/sshd.sh
0

boy461205160

赞同来自:

wsw13640218682 发表于 2016-2-24 11:52
[root@nz ~]# vi iptables.sh
#monitor iptables port 22
#!/bin/bash

22端口临时不小心被封,并没有写入防火墙规则文件里面(保存了规则,才会在iptables里面),哪你的sed -i '/--dport 22/s/DROP/ACCEPT/' /etc/sysconfig/iptables不是木有任何作用
0

wsw13640218682

赞同来自:

boy461205160 发表于 2016-2-24 12:56
22端口临时不小心被封,并没有写入防火墙规则文件里面(保存了规则,才会在iptables里面),哪你的sed -i ...

但你这样不断添加规则,再次查看不是会存在很多条同样规则了吗
0

boy461205160

赞同来自:

本帖最后由 boy461205160 于 2016-2-24 14:08 编辑
wsw13640218682 发表于 2016-2-24 13:35
但你这样不断添加规则,再次查看不是会存在很多条同样规则了吗

已修正这个bug,{:4_91:}

我觉得铭哥写的也不是很完美,有木有更完美的,暂时没想到........

临时添加防火墙规则,在/etc/sysconfig/iptables文件中没有的,只有/etc/init.d/iptables save,才会有额,测试过了。
0

迷城

赞同来自:

本帖最后由 迷城 于 2016-2-24 17:55 编辑

#!/bin/bash
# check sshd port drop
DROP=`/sbin/iptables -nvL --line-number|grep  -E "dpt:22\>"|egrep -iE 'DROP|REJECT'|wc -l``
if [ $n -ge 1 ]
then
/sbin/iptables -I INPUT  -p tcp --dport $Port -j ACCEPT
fi


假设iptables 中有2223   2224  grep 'tcp dpt:22'  会过滤所有包含22的端口,  正确的应该是这样grep  -E "dpt:22\>


0

wsw13640218682

赞同来自:

boy461205160 发表于 2016-2-24 14:03
已修正这个bug,

我觉得铭哥写的也不是很完美,有木有更完美的,暂时没想到........

不知道为什么今晚回到来将你的脚本来测试一下,第一次测试是可以,再来多次测试就不行了..
0

boy461205160

赞同来自:

本帖最后由 boy461205160 于 2016-2-25 11:52 编辑
wsw13640218682 发表于 2016-2-24 23:51
不知道为什么今晚回到来将你的脚本来测试一下,第一次测试是可以,再来多次测试就不行了..

你误封只有一次把,总不会又多次把,你可以把 “3”改成5次也可以,适当多2次,如果多次误封,那就无语了,,,

重写了shell bash,测试完美解决了你说的bug,只要发现port 22 drop,就开启22端口
0

boy461205160

赞同来自:

迷城 发表于 2016-2-24 14:42
#!/bin/bash
# check sshd port drop
DROP=`/sbin/iptables -nvL --line-number|grep  -E "dpt:22\>"|egr ...

脚本已修正,。你写的也有问题额,你这个会不停的循环添加  -J ACCEPT 22 规则
0

369666951

赞同来自:

看看
0

ttly123

赞同来自:

看看
0

蔡炳森

赞同来自:

看看
0

rolay8

赞同来自:

本帖最后由 rolay8 于 2016-2-28 22:55 编辑
  1. #!/bin/bash

  2. result=`/sbin/iptables -nvL|grep "dpt:22"|awk '{print $3}'`

  3. if [ $? -eq 0 ];then
  4.         case $result in
  5.         DROP|REJECT)
  6.         /sbin/iptables -F;;
  7.         *)
  8.         exit 0;;
  9. fi
0

北辰星

赞同来自:

学习
0

licengceng

赞同来自:

学习
0

we14578

赞同来自:

  1. #!/bin/bash
  2. c =`netstat -lnp |grep 22 |wc -l`
  3. if [ $c ==0 ]
  4. then
  5. /sbin/iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
  6. service iptables save
  7. else
  8. echo "22 is on"
  9. fi


0

jinm

赞同来自:

学习
0

乐橙306

赞同来自:

本帖最后由 乐橙306 于 2016-3-3 16:52 编辑
  1. [root@wh-cnc-51 303]# cat 3.sh
  2. #!/bin/bash
  3. # Monitor  iptables port 22 .

  4. while true
  5.   do
  6.     iptables -nvL | grep DROP | grep "dpt:22"  > /dev/null
  7.     if [ $? -eq 0 ]
  8.       then
  9.       /sbin/iptables  -F   
  10.     fi
  11.     sleep 60
  12. done
  13. [root@wh-cnc-51 303]#
0

inzaghidai

赞同来自:

学习
0

超大大

赞同来自:

学习, 练习练习
0

online189

赞同来自:

预习
0

wsw13640218682

赞同来自:

  1. #!/bin/bash
  2. a=`/sbin/iptables -nvL --line-number |awk '/dpt:22/{if($4=="DROP" -o $4=="REJECT")print}'|wc -l`
  3. if [ "$a" -lt 5 ]
  4. then
  5. echo "$a" >> /tmp/iptable22.log
  6. /sbin/iptables -I INPUT -p tcp --dport 22 -j ACCEPT
  7. #/etc/init.d/iptables restart
  8. fi
0

zhangzihao

赞同来自:

应该是定时关闭iptables把
0

qiqige

赞同来自:

。。
0

wangzai

赞同来自:

学习
0

mlsstar

赞同来自:

{:4_91:}
0

定海偶然

赞同来自:

dddddddddddd
0

Burgess

赞同来自:

学习
0

linux-小莫

赞同来自:

本帖最后由 linux-小莫 于 2016-4-7 20:52 编辑

#!/bin/bash
a=`iptables -nvL |awk '/dpt:22\>/ && ($3~"REJECT" || $3~"DROP")'|wc -l`
b=`iptables -nvL |awk '/dpt:22\>/ && $3~"ACCEPT"'|wc -l`
if [ $a -gt 0 ] && [ $b -lt 5 ]
then
iptables -I INPUT  -p tcp --dport 22 -j ACCEPT
fi

这样好一点,达到一定次数就不会重复插入了
0

kevin_tao

赞同来自:

可以通过netstat -lnp查看吗
0

yangjian319

赞同来自:

学习。
0

心怡呆呆

赞同来自:

学习
0

ggangelo

赞同来自:

#!/bin/bash
b=`netstat -lnp|grep ssh|awk -F" " '{print $4}'|awk -F":" '$1~/0.0.0.0/ {print $2}'`
a=`iptables -nL --line-num|grep "$b"|awk -F" " '{print $2}'`
c=`iptables -nL --line-num|grep "$b"|awk -F" " '{print $1}'`
if [ $a == DROP ]
then
   iptables -D INPUT $c
else
  echo "not this rule"
fi

自动提取ssh端口并自动删除封掉的规则
0

xiaoweili

赞同来自:

学习了
0

Hyman1105

赞同来自:

学习中
0

木头爱木头媳妇

赞同来自:

1
0

150411100

赞同来自:

学习啦,谢谢老师
0

彭海恒

赞同来自:

本帖最后由 彭海恒 于 2016-4-12 19:26 编辑
  1. vim checkport.sh
  2. #!/bin/bash
  3. #check ssh port drop or reject
  4. #writeen by penghh
  5. num=`iptables -nvL --line | grep -E "dpt:22\>" |awk -F " " '{print $1}'`
  6. act=`iptables -nvL --line | grep -E "dpt:22\>" |awk -F " " '{print $4}'`

  7. if [ $act == DROP ] || [ $act == REJECT ]
  8. then
  9.         iptables -D INPUT $num
  10.         iptables -I INPUT -p tcp --dport 22 -j ACCEPT
  11.         echo "The port 22 in `date` are wrong" >> /tmp/dport.log
  12. fi

  13. if [ $1 == first ]
  14. then
  15. dir=`pwd`
  16. echo "* * * * * root bash $dir/$0 2>/dev/null" >> /etc/crontab
  17. fi


  18. #执行# bash checkport.sh first

0

彭海恒

赞同来自:

彭海恒 发表于 2016-4-12 18:21
vim checkport.sh
#!/bin/bash
#check ssh port drop or reject

总觉得一分钟一次有点太浪费资源了,觉得五分钟也好啊
echo “*/5 * * * * bash $dir/$0" >> /etc/crontab
0

xzzlamp

赞同来自:

11
0

branttsai

赞同来自:

study,tks
0

xueyongbo

赞同来自:

参考
0

17095053557

赞同来自:

学习
0

15012600075

赞同来自:

学习
0

gxp2008

赞同来自:

看看
0

timfeng3535

赞同来自:

dddd
0

luckytodd

赞同来自:

本帖最后由 luckytodd 于 2016-5-19 23:40 编辑

#!/bin/bash
ipnum=` iptables -nvL --line-numbers|grep "dpt:22"|awk '{print $1}'`
if  iptables -nvL|grep "dpt:22"
then
  iptables -D INPUT $ipnum
fi

crontab -e
*/1 * * * * /bin/bash 脚本路径
0

fh_panda

赞同来自:

学习
0

nihao426181

赞同来自:

^^^^^^^^^^^^^^^^^^^^^
0

820009174

赞同来自:

学习
0

小猫咪

赞同来自:

学习
0

小杰

赞同来自:

{:4_91:}
0

shoswj001

赞同来自:

mark
0

shoswj001

赞同来自:

mark
0

十月鱼

赞同来自:

学习
0

monga

赞同来自:

学习
0

elvis

赞同来自:

ddd
0

我是学渣

赞同来自:

{:4_99:}
0

xpgong

赞同来自:

kankan
0

gh0st

赞同来自:

{:4_104:}
0

xigua

赞同来自:

看一下
0

蛀牙宅

赞同来自:

{:4_100:}
0

jxcia2018

赞同来自:

本帖最后由 jxcia 于 2016-6-7 19:34 编辑
  1. #!/bin/bash
  2. ##written by lin
  3. ##check port 22
  4. iptables=/sbin/iptables
  5. $iptables -P INPUT ACCEPT;
  6. $iptables -P OUTPUT ACCEPT;
  7. a=`$iptables -nvL |grep dpt:22|awk  '{print $3}'`
  8. if [ $a  == REJECT ]||[ $a  == DROP ]
  9. #if [ "$a" != "ACCEPT" ]
  10. then $iptables -I INPUT -p tcp --dport 22 -j ACCEPT
  11. fi


0

Toornix

赞同来自:

#!/bin/bash


for j in `iptables -nvL --line-number|grep "dpt:22 "|awk '{print $4}'`
do
        for n in `iptables -nvL --line-number|grep "dpt:22 "|awk '{print $1}'`
        do
                if [ "$j" = "REJECT" ]||[ "$j" = "DROP" ]
                then
                        /sbin/iptables -D INPUT $n
                fi
        done
done
~           
0

loveangeler

赞同来自:

#!/bin/bash
port=`iptables -nL|grep 22|awk -F ' ' '{print $NF}'|cut -d: -f2`
if [ $port -eq 22 ];then
    iptables -D INPUT -s 192.168.1.188 -p tcp --dport 22 -j DROP
fi
0

jonnylin

赞同来自:

学习
0

小毅

赞同来自:

学习
0

小毅

赞同来自:

#!/bin/bash
#### by 17-hy
port=22
ipaddr=127.0.0.1
NMAP=`rpm -qa nmap|wc -l`
[ $NMAP -eq 0 ] && yum install -y nmap
STATUS=`nmap "$ipaddr" -p "$port"|awk 'NR==6 {print $2}'`
if [ "$STATUS" != "open" ]
    then
     /sbin/iptables -t filter -I INPUT -p tcp --dport $port -j ACCEPT
fi
0

summer123

赞同来自:

xuexi
0

summer123

赞同来自:

还的检查sshd的服务是否有没有关闭掉吧
0

q913555

赞同来自:

学习下
0

hlymlv

赞同来自:

nmap -sS -P0 -n -p 22  127.0.0.1|grep '22'|awk '{print  $2}'
0

malong

赞同来自:

学习
0

malong

赞同来自:

迷城 发表于 2016-2-24 14:42
#!/bin/bash
# check sshd port drop
DROP=`/sbin/iptables -nvL --line-number|grep  -E "dpt:22\>"|egr ...

DROP  变量怎么成了$n
0

GaryHuang0113 - 世上无难事,只怕有心人

赞同来自:

学习了
0

wy1028

赞同来自:

{:4_91:}
0

riverxyz

赞同来自:

#/bin/bash
ipt=/sbin/iptables
num= `$ipt -nvL --line-numbers|grep dpt:22|awk -F " " '{print $1}'`
if { -n $number ]
   then $ipt -D INPUT $num
else exit
fi
再cronttab -e * * * * * /bin/bash /tmp/22.sh
0

huanglin

赞同来自:

看看
0

小三终输小四

赞同来自:

学习一下。。。
0

hmh

赞同来自:

w
0

linuxcp

赞同来自:

{:4_91:}
0

jia3700

赞同来自:

学习
0

dessler

赞同来自:

本帖最后由 dessler 于 2016-8-31 14:20 编辑
  1. #!/bin/bash
  2. abc=`/sbin/iptables -nvL |grep dpt:22 |grep DROP`
  3. xyz=`/sbin/iptables -nvL |grep dpt:22 |grep REJECT`
  4. if [ -z $abc -o -z $xyz ]; then
  5. /sbin/iptables -I INPUT -p tcp --dport 22 -j ACCEPT        
  6. fi

0

dongteng

赞同来自:

学习
0

kw是id

赞同来自:

#!/bin/bash
ip=192.168.2.88
check_ok () {
  if [ $? -ne 0 ]
  then
    echo "error,please check error messages"
    exit 1
  fi
}
yum install -y nc >/dev/null 2>&1 
check_ok
a=`ps aux|grep sshd|wc -l`
b=`iptables -nvL|grep 'dpt:22'`
nc -t $ip -z 22
if [ $? -ne 0 ]
then
  ping www.baidu.com -c5 >/dev/null 2>&1
  if [ $? -ne 0 ]
  then
     service network restart
     check_ok
     ping www.baidu.com -c5 >/dev/null 2>&1
     check_ok
  else
     if [ $a -le 2 ]
     then
        service sshd restart
        check_ok
     else
        if [ -n "$b" ]
        then
           iptables -I INPUT -p tcp --dport 22 -j ACCEPT
        fi
     fi
  fi
else
   echo "port 22 is actived"
fi

0

dongdongchen

赞同来自:

看看

0

大雁

赞同来自:

学习

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: