Как не отображать столбец, содержащий все значения NULL в файле

Расширение limit реализует механизм корзины с маркерами. Обычно, когда правило совпадает, netfilter переходит к указанной цели, в данном случае ACCEPT . Когда вы подключаете расширение limit , netfilter должен удалить «токен» из «корзины» этого правила, прежде чем ему будет разрешен переход. Если в корзине нет токенов, это расширение предотвращает скачок netfilter, даже если правило совпадало.

--limit 50/minute #tells netfilter to add 50 tokens per minute to the bucket
--limit-burst 200 #tells netfilter to use a bucket which holds up to 200 tokens

Если имеется 50 запросов на подключение в минуту (или больше), ваш сервер будет разрешать 50 новых подключений каждую минуту. Если в минуту поступает менее 50 запросов, корзина заполняется (фактически она начинается с полной). Это означает, что если в одну минуту поступает всего несколько запросов, сервер примет более 50 новых запросов в следующую минуту. Чтобы это не вышло из-под контроля, существует ограничение на количество жетонов, которое может вместить ведро. 200 в данном случае. Когда корзина заполнена, ваш сервер примет следующие 200 входящих подключений, даже если они попадут на ваш сервер одновременно. Поскольку это число больше 50, мы называем это всплеском, когда количество принимаемых соединений увеличивается до более чем 50, которые нам нужны В СРЕДНЕМ .

Второе правило означает, что эта машина будет принимать 50 IP-пакетов в секунду без дальнейшего исследования, если они принадлежат потоку, который распознает сетевой фильтр. Чтобы оценить влияние этого правила, нам нужно увидеть всю цепочку (и каждую цепочку, на которую она ссылается и на которую ссылаются).Тем не менее, я могу сказать вам несколько вещей, которые здесь совпадают:

  1. Netfilter считает ACK инициатора TCP-соединения для завершения рукопожатия как пакет RELATED . 50 успешно установленных соединений в минуту идеально соответствуют второму правилу, с которым у вас возникли проблемы.

  2. Наиболее распространенные реализации TCP делают четыре попытки подключения, прежде чем разорвать соединение. При 50 успешно установленных подключениях вы в худшем случае получите 200 запросов на подключение.

  3. Неважно, как часто конечная точка делает конкретный запрос на соединение, только один должен быть успешным в течение разумного промежутка времени, чтобы установить соединение. Большинство реализаций устанавливают 60 секунд как разумное время по умолчанию.

Если бы последнее правило было 50 в минуту , эти четыре правила могли бы быть частью действительно крутой структуры защиты от DoS. Поскольку в нем отсутствует фильтр - dport 80 и он составляет 50 / секунду , я могу только догадываться:

a) Вы полностью вырвали эту строку из контекста, и она не связана с ней сразу. к первым трем.

б) Это общее ограничение для замедления трафика.

c) Это ошибка, и она должна быть 50 в минуту .

г) Это компромисс между защитой сервера от DoS-атак и сохранением доступности сервиса во время и сразу после DoS-атаки.

Чтобы понять второй фрагмент, вы сначала должны вбить себе в голову, что последнее расширение использует и сохраняет информацию об исходном IP-адресе.

Новое расширение управляет своими знаниями в списках.Список по умолчанию называется ПО УМОЛЧАНИЮ и используется, если не указан другой список. Один предоставляет другой список, используя - имя .

Итак, первые два правила означают «отбросить этот пакет, если исходный IP-адрес был помещен в список portscan в течение последних 86400 секунд».

Вторые два правила означают «удалить этот IP-адрес из списка сканирования портов ». Обратите внимание, что это правило оценивается только в том случае, если предыдущее правило не соответствовало. Это правило существует для того, чтобы список сканирование портов был коротким. Более длинные списки требуют больше времени для поиска.

Последние четыре правила помещают исходные IP-адреса в список portscan , регистрируют его и DROP пакет. - dport 139 присутствует, потому что такое поведение требуется только в этом случае. Я уверен, что эти правила имеют больше смысла в контексте, потому что это не полный набор правил для предотвращения сканирования портов.

2
24.05.2019, 16:55
3 ответа

Мне не очень нравится это решение, но, похоже, оно работает:

#!/bin/bash

input=~/tmp/input
skip=()

c=$(awk '{print NF;exit}' "$input")

for ((i=1;i<=c;i++)); do
    col=$(awk -v c="$i" '{print $c}' "$input" | sort -u)
    if [[ $col == NULL ]]; then
        skip+=( "$i" )
    fi
done
( IFS=,; awk -v S="${skip[*]}" '{ split(S,s,","); for (i=1;i<=length(s);i++) { $s[i]="" } print}' "$input" )
  1. input(ваш входной файл)
  2. skip(массив, который будет заполнен позже)
  3. c(будет установлено количество столбцов в вашем файле. Это предполагает, что весь файл имеет одинаковое количество столбцов )
  4. .
  5. Теперь мы пройдемся по каждому столбцу в файле, отсортируем и уникализируем его, а также проверим, содержит ли столбец только NULL. Если это так, мы добавим этот номер столбца в массив skip
  6. .
  7. Теперь мы устанавливаем IFSзапятую (по той причине, что я использую подоболочку )и передаем массив skipкак значение, разделенное запятыми, в переменную awk. Это значит, что мы можем использовать splitдля преобразования этой переменной обратно в массив awk.
  8. Затем
  9. awkбудет перебирать каждое число в массиве s, устанавливать этот столбец пустым и печатать то, что осталось.
0
27.01.2020, 22:02

Вы не можете сделать это, не обработав файл дважды. Ниже сначала используется awkдля создания окончательной cutкоманды:

killnulls(){
    cut -f "$(awk -F'\t' '
        { for(i=1;i<=NF;i++) a[i] += $i!="NULL" }
        END { for(i=1;i in a;i++) if(a[i]) printf j++?","i:i }
    ' "$@")" "$@"
}

$ killnulls file
1000    NULL    2
7       1000    2
7       1000    2
...
1
27.01.2020, 22:02

Команда:

awk '/NULL/{gsub(/NULL/,"",$0);print $0}' filename| sed -r "s/\s+/ /g"| awk 'NR==1{$3=$2;$2="NULL";}1'

выход

awk '/NULL/{gsub(/NULL/,"",$0);print $0}' i.txt| sed -r "s/\s+/ /g"| awk 'NR==1{$3=$2;$2="NULL";}1'
1000 NULL 2
7 1000 2 
7 1000 2 
7 1000 2 
7 1000 2 
7 1000 2 
7 1000 2 
7 1000 2 
7 1000 2 
7 1000 2 
7 1000 2 
7 1000 2 
7 1000 2 
7 1000 2 
7 1000 2 
7 1000 2 
7 1000 2 
7 1000 2 
7 1000 2 
7 1000 2 
7 1000 2
-1
27.01.2020, 22:02

Теги

Похожие вопросы