#!/bin/bash HOST=$1 PORT="22 25 80 8080" for PORT in $PORT; do if echo &>/dev/null > /dev/tcp/$HOST/$PORT; then echo "$PORT open" else echo "$PORT close" fi done
3. iptables 自动屏蔽访问网站频繁的IP
场景:恶意访问,安全防范
3.1. 屏蔽每分钟访问超过100的IP
方法1:根据访问日志(Nginx为例)
1 2 3 4 5 6 7 8
#!/bin/bash DATE=$(date +%d/%b/%Y:%H:%M) ABNORMAL_IP=$(tail -n5000 access.log |grep $DATE |awk '{a[$1]++}END{for(i in a)if(a[i]>100)print i}') #先tail防止文件过大,读取慢,数字可调整每分钟最大的访问量。awk不能直接过滤日志,因为包含特殊字符。 for IP in $ABNORMAL_IP; do if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then iptables -I INPUT -s $IP -j DROP fidone
方法2:通过TCP建立的连接
1 2 3 4 5 6 7 8
#!/bin/bash ABNORMAL_IP=$(netstat -an |awk '$4~/:80$/ && $6~/ESTABLISHED/{gsub(/:[0-9]+/,"",$5);{a[$5]++}}END{for(i in a)if(a[i]>100)print i}') #gsub是将第五列(客户端IP)的冒号和端口去掉 for IP in$ABNORMAL_IP; do if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then iptables -I INPUT -s $IP -j DROP fi done
3.2. 屏蔽每分钟SSH尝试登录超过10次的IP
方法1:通过lastb获取登录状态
1 2 3 4 5
#!/bin/bash DATE=$(date +"%a %b %e %H:%M") #星期月天时分 %e单数字时显示7,而%d显示07 ABNORMAL_IP=$(lastb |grep "$DATE" |awk '{a[$3]++}END{for(i in a)if(a[i]>10)print i}')for IP in $ABNORMAL_IP; do if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then iptables -I INPUT -s $IP -j DROP fidone
方法2:通过日志获取登录状态
1 2 3 4 5 6 7 8 9
#!/bin/bash DATE=$(date +"%b %d %H") ABNORMAL_IP="$(tail -n10000 /var/log/auth.log |grep "$DATE" |awk '/Failed/{a[$(NF-3)]++}END{for(i in a)if(a[i]>5)print i}')" for IP in $ABNORMAL_IP; do if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then iptables -A INPUT -s $IP -j DROP echo "$(date +"%F %T") - iptables -A INPUT -s $IP -j DROP" >>~/ssh-login-limit.log fi done
sleep 2 # 判断 JAR 包文件是否存在,如果存在启动 JAR 包,并实时查看启动日志 if test -e $APP_NAME; then echo '文件存在,开始启动此程序...' # 启动 JAR 包,指向日志文件,2>&1 & 表示打开或指向同一个日志文件 nohup java -jar $APP_NAME $APP_YML > dream_out.log 2>&1 & echo "正在发布中,请稍后..." sleep 10s # 通过检测日志来判断 while [ -f $LOG_FILE ]; do success=$(grep "Started DreamApplication in " $LOG_FILE) if [[ "$success" != "" ]]; then break else sleep 1s fi
fail=$(grep "Fail" $LOG_FILE) if [[ "$fail" != "" ]]; then echo "项目启动失败" tail -f $LOG_FILE break else sleep 1s fi done echo "Project Started Success"