В то время как tail grep для string и если true, введите команду iptables для ip? - PullRequest
0 голосов
/ 21 апреля 2019

Попытка подключить файл журнала (журнал iptraf) и grep строку, чтобы автоматически запретить пользователям, которые подключаются к порту telnet.

Журнал постоянно катится (что означает, что он постоянно записывается), и мне нужночитать его постоянно для каждой строки, добавленной iptraf.

UPDATE-1:

Получает IP-адрес, но теперь мне нужно использоватьэто, но если я заменю echo на var =, это не вызовет команду bash

#!/bin/bash
tail -f /iptraf/ip.log | 
while read LINE
    do
       echo "${LINE}" | grep -o '[0-9]\{0,3\}\.[0-9]\{0,3\}\.[0-9]\{0,3\}\.[0-9]\{0,3\}:[0-9]\{0,6\}\ to localhost:telnet' | cut -d':' -f1
done

Это напечатает первый ip, разделив возвращенный grep точкой с запятой и получив первую часть, которая является ip нарушителей.

Не кажется, что можно поместить часть эха в переменную?Мне также нужно иметь возможность определить, является ли это IP-адрес в массиве ["xxxx", "xxxx"], и не запрещать их.

UPDATE-2:

#!/bin/bash

#Rolling log file
tail -f /iptraf/iplog.log | 

while read LINE
    do
        #get the ip of the offender x.x.x.x <----
        #Example of output
        #Sun Apr 21 09:54:41 2019; TCP; eth0; 52 bytes; from x.x.x.x:53923 to localhost:telnet; first packet (SYN)
        #Regex/cut output ends up with this: x.x.x.x

        ip=${
            "${LINE}" | sed -n 's/^.* from \(.*\) to localhost:telnet;.*/\1/p' | cut -d':' -f1
        };

        #bad substitution error?

        if [[$ip !== 'localhost']] then
            #ban offender and log to console
            iptables -I INPUT -s $ip -j DROP && route add -host $ip reject
            echo "Offender Banned: $ip";
        fi
done

С этим консоль выдает мне среднее сообщение "ПЛОХАЯ ЗАМЕНА"

Я знаю, что это заново изобретает колесо и все, но мне нужно это, чтобы создавать свои собственные сценариидля других журналов.Я также имею дело с кучей хакеров каждый день, так что это невероятно бесит, когда я не могу сделать это автоматически.

Пример вывода iptraf

Sun Apr 21 01:50:44 2019; TCP; eth0; 52 bytes; from x.x.x.x:52364 to x.x.x.x:telnet; first packet (SYN)

PS, xxxx - это АКТУАЛЬНЫЕ IP-адреса, такие как 111.111.111.111, только что выделенные.

ОБНОВЛЕНИЕ-3:

#!/bin/bash

tail -f /var/log/iptraf/ip_traffic-1.log |
awk -v skipIps="192.168.1.1,127.0.0.1" '
    BEGIN {
        split(skipIps,tmp,/,/)
        for (i in tmp) {
            skipSet[tmp[i]]
        }
    }
    /to localhost:telnet/ {
        ip = $11
        sub(/:.*/,"",ip)
        if ( !(ip in skipSet) ) {
            printf "BANNING TELNET: %s\n", ip | "cat>&2"
            print "[External] EXTERNAL HIT TELNET [Telnet Server Connection]:", ip
            fflush()
            system("iptables -I INPUT -s "ip" -j DROP && route add -host "ip" reject")
        } else {
            printf "That was US! TELNET: %s\n", ip | "cat>&2"
            print "[Allowed] INTERNAL HIT TELNET [Telnet Server Connection]:", ip
            fflush()
        }
    }
'

Теперь, когда мы можем запретить IP-адреса, попавшие в порты,Лучше всего очищать логи iptables каждый месяц, чтобы предотвратить замедление работы сервера, верно?- Я могу сделать это позже сам, в настоящее время меня интересует та часть, где указывается порт "localhost: telnet" - мне действительно нужно иметь возможность проверять несколько имен портов по списку известных имен портовкак "telnet", "ircd", "ssh", "ftp", "sip-tls" и т. д. и т. д.

Было бы замечательно, если кто-нибудь может помочь мне с несколькими именами портов в update-3этот пост.

Ответы [ 3 ]

1 голос
/ 21 апреля 2019

Я немного изменил ваш код:

tail -f /logs/iptraf.log | grep "to localhost:telnet"  |
while 
   read OFFENDING_IP EXTRA
do 
  echo "uhoh! - $OFFENDING_IP hit telnet port.. We need to ban the ip"
  iptables -I INPUT -s $OFFENDING_IP -j DROP
done

Код не проверен.И я просто предположил, что IP появляется первым в строке перед «localhost: telnet».

Что касается объяснения, ваш код был разумным.Однако вы не знали, как извлечь IP из выделенных вами строк.Команда read примет вывод команды grep, так как я изменил вашу;к |передать вывод grep следующей команде.Кроме того, команда чтения разбирает строку на поля и заполняет значения в переменных командной строки.Первое поле (предположительно IP) помещается в поле OFFENDING_IP, а оставшаяся часть строки вставляется в переменную EXTRA.

0 голосов
/ 21 апреля 2019
tail -f /logs/iptraf.log |
awk -v skipIps="a.b.c.d,w.x.y.z" '
    BEGIN {
        split(skipIps,tmp,/,/)
        for (i in tmp) {
            skipSet[tmp[i]]
        }
    }
    /to localhost:telnet/ {
        ip = $11
        sub(/:.*/,"",ip)
        if ( !(ip in skipSet) ) {
            printf "uhoh! - this ip %s hit telnet port.. We need to ban the ip\n", ip | "cat>&2"
            print ip
            fflush()
        }
    }
' | xargs -I {} iptables -I INPUT -s '{}' -j DROP

Посмотрите (используя cat file вместо tail -f ... и добавив echo перед iptables, чтобы продемонстрировать работу остальной части скрипта):

$ cat file
Sun Apr 21 01:50:44 2019; TCP; eth0; 52 bytes; from x.x.x.x:52364 to localhost:telnet; first packet (SYN)

cat file |
awk '/to localhost:telnet/ {
    ip = $11
    sub(/:.*/,"",ip)
    printf "uhoh! - this ip %s hit telnet port.. We need to ban the ip\n", ip | "cat>&2"
    print ip
    fflush()
}' |
xargs -I {} echo iptables -I INPUT -s '{}' -j DROP
iptables -I INPUT -s x.x.x.x -j DROP
uhoh! - this ip x.x.x.x hit telnet port.. We need to ban the ip
0 голосов
/ 21 апреля 2019

Поскольку вам нужно (несколько) сложное сопоставление с образцом, вы можете напрямую передать результат tail в awk, как показано ниже:

# First pipe the tail output to awk
tail -f /logs/iptraf.log | awk '/to localhost:telnet/{
# The /pattern/ looks for a pattern
# We reach this stage only if the patten match is successful.
ip=gensub(/^.*from[[:blank:]]+([^[:blank:]]+).*$/,"\\1","g")
# Above lines searches a record($0) for the IP that we wish to block
# and assign it to an awk variable 'ip'
system("iptables -I INPUT -s " ip " -j DROP") 
# Above line executes a bash command using the system awk command
}'

Тест

iptables -L # To see the modified rules.

Примечание: У вас должен быть GNU awk для выполнения вышеуказанного. Кроме того, посмотрите здесь , чтобы узнать больше о awk строковых функциях.

...