2020年6月28日 星期日

postfix 阻擋連線

完整程式碼:

#!/bin/bash

grep -o 'unknown\[.*\]' /var/log/mail.log |grep -o '\[.*\]' | sed 's/\[//'|sed 's/\]//'|grep -v 192.168.118.252 |sort|uniq > DNSBL.txt

grep 'listed by domain' /var/log/mail.log |awk '{print $7}' |sort|uniq >> DNSBL.txt

ip=($(cat DNSBL.txt |sort |uniq)) #設定ip陣列

echo ${ip[@]} #叫出陣列值

len=${#ip[*]} #陣列長度

echo $len

/sbin/iptables -F

for i in "${ip[@]}" #迴圈

do

        /sbin/iptables -t filter -I INPUT -p tcp -s $i -j DROP

done


阻擋下列這類型的連線:

Jun 28 14:33:21 relaynat postfix/smtpd[46810]: connect from unknown[185.143.73.103]

Jun 28 14:33:22 relaynat postfix/smtpd[46810]: disconnect from unknown[185.143.73.103] ehlo=1 quit=1 commands=2

語法說明:

grep -o 'unknown\[.*\]' /var/log/mail.log |grep -o '\[.*\]' | sed 's/\[//'|sed 's/\]//'|grep -v 192.168.118.252 |sort|uniq > DNSBL.txt

grep -o 'unknown\[.*\]' /var/log/mail.log

unknown[185.143.73.134]

grep -o 'unknown\[.*\]' /var/log/mail.log |grep -o '\[.*\]' 

[185.143.73.103]

grep -o 'unknown\[.*\]' /var/log/mail.log |grep -o '\[.*\]' | sed 's/\[//'|sed 's/\]//'

185.143.73.134

grep -o 'unknown\[.*\]' /var/log/mail.log |grep -o '\[.*\]' | sed 's/\[//'|sed 's/\]//'|grep -v 192.168.118.252
grep -v 192.168.118.252:排除192.168.118.252
sort|uniq > DNSBL.txt
sort:排序
uniq:去除重複,uniq只比對要列印資料的上一行是否重複,所以須先排序!

阻擋下列這類型的連線:

Jun 28 14:29:20 relaynat postfix/dnsblog[45760]: addr 185.143.73.58 listed by domain zen.spamhaus.org as 127.0.0.4

語法說明:

grep 'listed by domain' /var/log/mail.log |awk '{print $7}' |awk '!x[$0]++' >> tmpList.txt

grep 'listed by domain' /var/log/mail.log 

Jun 28 14:34:05 relaynat postfix/dnsblog[45760]: addr 185.143.72.34 listed by domain zen.spamhaus.org as 127.0.0.4

grep 'listed by domain' /var/log/mail.log |awk '{print $7}' 

185.143.72.34

awk '!x[$0]++'

去除重複的資料
awk -F"" '{ for (i=6; i<=NF; i++) print $i }'
  1. F定義awk要使用的分隔符為空格,這也是awk預設的分隔符。

  2. NF定義欄位/列的總數,因此循環將從第6個欄位開始到最後一個欄位/列。

  3. 其中$N檢索第n個欄位的值,因此列印$i將基於循環計數列印當前欄位/列。