Это для домашней системы наблюдения, безголовый сервер под управлением Ubuntu 15.04, и я хочу, чтобы его безопасность была образцовой. Я предвижу решение командной строки (с необязательным сценарием, если это абсолютно необходимо), отслеживая IP-зонды от поисковиков / хакеров, зарегистрированных в моем ufw.log и занесенных в черный список в реальном времени, если они не портят правильно со временем. До сих пор у меня есть:
tail -n+1 -F /var/log/ufw.log |
grep -v --line-buffered '0.0.0.0' |
sed -e 's/BLOCK/&/g' -e 's/.*SRC\=//g' -e 's/\ DST.*//g'
, который выводит на stdout прямой поток зондов, попадающих в IP. Это IP-адреса, которые я хочу занести в черный список x (3?) Минут от «сейчас». Это дает законным пользователям время, чтобы получить белый список сначала с помощью портового детонации. Я использую команду вставки ufw для черных и белых списков, что означает, что в листинге первое доминирует.
Теперь часть белого списка работает нормально. Затем я хочу разработать команду «at», которая правильно выполняет команду ufw insert 1 deny from x.x.x.x, где xxxx происходит из вышеупомянутой команды хвоста.
Моя первая попытка - это что-то вроде
ufw insert 1 deny from $(tail -n+1 -F /var/log/ufw.log |
grep -v --line-buffered '0.0.0.0' |
sed -e 's/BLOCK/&/g' -e 's/.*SRC\=//g' -e 's/\ DST.*//g');
ufw reload |
at now +3 minute`
но команда at не генерируется, как показано в at -l. Может ли кто-нибудь увидеть, что я делаю неправильно с этой командой?
NEW THOUGHT - Я думаю, что команда tail -F должна быть началом. Любой другой способ, по-видимому, обрабатывает только одну строку из файла журнала ufw.
Для вас любопытно, что правила деблокирования портов, которые у меня есть, теперь могут и выполняются в черном списке, но очень ограничены, потому что я должен заранее определите поведение зондирования в правилах. Так что если они идут на порты 22 дважды или 21 дважды или 443 два раза, они теперь попадают в черный список. Но я вижу, что для портов в диапазоне 55xxx, 4 или 5 зондов используются разные порты. Я не вижу, как это можно разумно охарактеризовать в правилах брандмауэра, но я, безусловно, могу сделать это с помощью ufw всех зондов, попадающих через белый список и черный список в последний раздел deny + log. Я хочу дать им x минут для правильного ввода порта, затем будет выполняться часть 'ufw' этой команды, запланированная частью 'at'.
Спасибо!
muru got я очень близко. Вот текущее состояние прогресса, но обратите внимание, что ufw имеет склонность к этой ошибке: ERROR: initcaps
[Errno 2] iptables: Chain already exists. Поэтому я не думаю, что это работает достаточно эффективно с iptables, чтобы справиться с этой интеграцией очень хорошо. Я думаю, что лучше использовать команды iptable напрямую, вместо того, чтобы интерпретировать ufw.
tail -F /var/log/ufw.log |
grep -v --line-buffered '0.0.0.0' |
sed -e 's/BLOCK/&/g' -e 's/.*SRC\=//g' -e 's/\ DST.*//g' |
while read IP; do
echo ufw insert 1 deny from "$IP" |
at now +3 minute;
echo ufw reload | at now +3 minute;
done
ПРИМЕЧАНИЕ. БЫСТРЫЕ ЗАПИСИ НЕ ВИДИМО В ЭТОМ ТЕКСТЕ, НО Я НЕОБХОДИЛ ДОБАВИТЬ ИХ Я ДУМАЮ. ОНИ НАПРАВЛЯЮТСЯ ДО ПРИНЯТИЯ КАЖДОЙ КОМАНДЫ ЭХО И ПОСЛЕ КАЖДОГО МИНУТНОГО КЛЮЧА.
То, как это не удается, теперь связано с «хвостом -F», связанным с конструкцией «while»: каждая строка добавляется к ufw. файл журнала, файл ENTIRE повторно загружается в цикл while, а не только добавленную строку. Я искал свое сердце и не могу найти способ обойти это. Помогите пожалуйста.
Если ufw reload и ufw insert вывести набор команд, которые перезагружают брандмауэр, то его не будет at.
Возможно, вы имели в виду:
echo ufw insert 1 deny from $(tail -n+1 -F /var/log/ufw.log |
grep -v --line-buffered '0.0.0.0' |
sed -e 's/BLOCK/&/g' -e 's/.*SRC\=//g' -e 's/\ DST.*//g') | at now +3 minute
echo ufw reload | at now +3 minute
Или, в сочетании:
at now +3 minute <<EOF
ufw insert 1 deny from $(tail -n+1 -F /var/log/ufw.log | grep -v --line-buffered '0.0.0.0' | sed -e 's/BLOCK/&/g' -e 's/.*SRC\=//g' -e 's/\ DST.*//g')
ufw reload
EOF