nftables без fail2ban: динамический бан брутфорса SSH (IPv4/IPv6)
Задача: быстро отстреливать источники, ломающие
Шаги
1. Создаём таблицу, набор и цепочку:
2. Ручное управление бан-листом (админ-бан/разбан):
3. Наблюдение за изменениями сета (для отладки):
4. Персистентность (Debian/Ubuntu/RHEL/Alma):
Зачем и когда
- Базовая защита от брутфорса без сторонних сервисов.
- Подходит для edge/VM/контейнер-хостов, где не нужен полный fail2ban.
- Работает в
Трюки / best practices
-
- Не делай
- Для нестандартных портов поменяй
#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin
Задача: быстро отстреливать источники, ломающие
ssh, без демонов и лог-парсеров. Решение - динамический set с таймаутом + правило, которое само добавляет нарушителя.Шаги
1. Создаём таблицу, набор и цепочку:
sudo nft -f - <<'EOF'
table inet fw {
set ssh_bad {
type inet_addr
flags timeout
timeout 1h # дефолт для элементов
}
chain input {
type filter hook input priority 0; policy accept;
iif lo accept
ct state established,related accept
# уже занесённых — вон:
ip saddr @ssh_bad drop
# детект частых новых соединений на 22/tcp и бан + дроп:
tcp dport 22 ct state new limit rate over 10/minute \
add @ssh_bad { ip saddr timeout 2h } counter drop
}
}
EOF
2. Ручное управление бан-листом (админ-бан/разбан):
sudo nft add element inet fw ssh_bad { 203.0.113.5 timeout 24h comment "manual" }
sudo nft delete element inet fw ssh_bad { 203.0.113.5 }
3. Наблюдение за изменениями сета (для отладки):
sudo nft monitor set
4. Персистентность (Debian/Ubuntu/RHEL/Alma):
# Проверь синтаксис и атомарно загрузись
sudo nft -c -f /etc/nftables.conf && sudo nft -f /etc/nftables.conf
sudo systemctl enable --now nftables
совет: вынеси блок в/etc/nftables.d/ssh-ban.nftи подключиincludeв/etc/nftables.conf.
Зачем и когда
- Базовая защита от брутфорса без сторонних сервисов.
- Подходит для edge/VM/контейнер-хостов, где не нужен полный fail2ban.
- Работает в
family inet → одна логика и для IPv4, и для IPv6.Трюки / best practices
-
limit rate over срабатывает только при превышении порога - нормальные пользователи не пострадают.- Не делай
flush table inet fw в бою: обнулятся текущие баны (timeouts). Обновляй правила точечно (nft -a list ruleset, затем delete rule handle … / add rule …) или проверяй конфиг -c перед загрузкой.- Для нестандартных портов поменяй
tcp dport 22 на свой.#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin
👍4❤1
nftables: автобан SSH без fail2ban (динамические set’ы + rate-limit)
Коротко: кладём “шумные” источники в чёрный список прямо из datapath - с авто-истечением и без внешних демонов. Подходит для брутфорса SSH и не только. Основано на
Шаги
1. Таблица/цепь (если ещё нет):
2. Два уровня списков: кратковременный “flood” и часовой “blackhole” (v4/v6):
3. Сначала рубим тех, кто уже в бане:
4. Автобан SSH: >10 новых соединений/сек с одного источника ⇒ бан на 1 час:
(используем добавление в set прямо из правила;
Зачем и когда
- Нативная альтернатива fail2ban на L3/L4: реакция в ядре, без лог-парсинга.
- Хорошо для SSH/SMTP/HTTP-auth, анти-скан/скрэпинг, временное “blackhole”.
- Порог/
Полезные трюки / предупреждения
🔎 Диагностика:
🎚️ Тюнинг детектора: добавьте
🧹 Снятие бана:
📐 Порядок правил: держите drop по
🧪 Если хочется “не более N коннектов одновременно”, используйте
Сохрани, пригодится. А ты так настраиваешь?
#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin
Коротко: кладём “шумные” источники в чёрный список прямо из datapath - с авто-истечением и без внешних демонов. Подходит для брутфорса SSH и не только. Основано на
limit rate over и динамических set с timeout. Шаги
1. Таблица/цепь (если ещё нет):
nft add table inet filter
nft add chain inet filter input '{ type filter hook input priority 0; policy accept; }'
2. Два уровня списков: кратковременный “flood” и часовой “blackhole” (v4/v6):
# IPv4
nft add set inet filter ssh_flood4 '{ type ipv4_addr; flags dynamic; timeout 10s; size 131072; }'
nft add set inet filter ssh_blackhole4 '{ type ipv4_addr; flags dynamic; timeout 1h; size 65536; }'
# IPv6
nft add set inet filter ssh_flood6 '{ type ipv6_addr; flags dynamic; timeout 10s; size 131072; }'
nft add set inet filter ssh_blackhole6 '{ type ipv6_addr; flags dynamic; timeout 1h; size 65536; }'
flags dynamic+timeoutобязательны для пополнения set’ов из правил;size- защита от OOM. Пример такой схемы есть в man nft.
3. Сначала рубим тех, кто уже в бане:
nft add rule inet filter input ip saddr @ssh_blackhole4 drop
nft add rule inet filter input ip6 saddr @ssh_blackhole6 drop
4. Автобан SSH: >10 новых соединений/сек с одного источника ⇒ бан на 1 час:
(используем добавление в set прямо из правила;
limit rate over матчится на превышение порога)
# IPv4
nft add rule inet filter input tcp dport 22 ct state new \
add @ssh_flood4 { ip saddr limit rate over 10/second } \
add @ssh_blackhole4 { ip saddr timeout 1h } drop
# IPv6
nft add rule inet filter input tcp dport 22 ct state new \
add @ssh_flood6 { ip6 saddr limit rate over 10/second } \
add @ssh_blackhole6 { ip6 saddr timeout 1h } drop
Зачем и когда
- Нативная альтернатива fail2ban на L3/L4: реакция в ядре, без лог-парсинга.
- Хорошо для SSH/SMTP/HTTP-auth, анти-скан/скрэпинг, временное “blackhole”.
- Порог/
timeout легко подкручивать под трафик.Полезные трюки / предупреждения
🔎 Диагностика:
nft list set inet filter ssh_blackhole4 и nft monitor ruleset - видно пополнение set’ов. 🎚️ Тюнинг детектора: добавьте
burst 3 к limit, чтобы сгладить джиттер (по умолчанию 5 пакетов). 🧹 Снятие бана:
nft delete element inet filter ssh_blackhole4 { 1.2.3.4 } или nft flush set inet filter ssh_blackhole4.📐 Порядок правил: держите drop по
@ssh_blackhole вверху input, раньше любых accept.🧪 Если хочется “не более N коннектов одновременно”, используйте
ct count over N (connlimit). Сохрани, пригодится. А ты так настраиваешь?
#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin
👍2❤1
🔒 Автоблокировка SSH-брутфорса через nftables
Даже если у тебя стоит fail2ban - иногда проще и быстрее решить задачу силами самого nftables. Минимум зависимостей, максимум контроля.
Пример: бан по 5 неудачным попыткам за 1 минуту
Как это работает
-
- Если за минуту ≥5 попыток — IP летит в
- Всё внутри одного ruleset’а, без демонов.
👉 Подходит для серверов, где хочется минимализма и нет нужды в сложных паттернах от fail2ban.
👉 Но осторожно: банится любой IP, даже если это сканер мониторинга или кривой клиент.
Сохрани, пригодится 😉
#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin
Даже если у тебя стоит fail2ban - иногда проще и быстрее решить задачу силами самого nftables. Минимум зависимостей, максимум контроля.
Пример: бан по 5 неудачным попыткам за 1 минуту
table inet sshguard {
set ssh_blacklist {
type ipv4_addr
flags timeout
timeout 1h
}
map ssh_counter {
type ipv4_addr : counter
}
chain input {
type filter hook input priority 0;
# Разрешаем локалку и уже забаненных
ip saddr @ssh_blacklist drop
tcp dport 22 ct state new add @ssh_counter { ip saddr } counter
tcp dport 22 ct state new ip saddr @ssh_counter { ip saddr } >= 5 add @ssh_blacklist { ip saddr } drop
# Разрешаем SSH по умолчанию (после фильтра)
tcp dport 22 accept
}
}
Как это работает
-
ssh_counter считает подключения по IP.- Если за минуту ≥5 попыток — IP летит в
ssh_blacklist на 1 час.- Всё внутри одного ruleset’а, без демонов.
👉 Подходит для серверов, где хочется минимализма и нет нужды в сложных паттернах от fail2ban.
👉 Но осторожно: банится любой IP, даже если это сканер мониторинга или кривой клиент.
Сохрани, пригодится 😉
#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin
👍2🔥1
🚀 Быстрый способ отследить «зависшие» TCP-сессии
Иногда сервис «висит», но порты открыты и соединения висят в
🔍 Как проверить:
👉 Обрати внимание на колонку
🛠 Что делать:
1. Сбросить проблемные соединения:
2. Добавить sysctl-тюнинг, чтобы ядро не держало «мертвяков» вечно:
💡 Это помогает, если юзеры «обрываются» без выхода или при нестабильных VPN.
#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin
Иногда сервис «висит», но порты открыты и соединения висят в
ESTABLISHED. Классика: приложение не отвечает, но сокеты не закрываются.🔍 Как проверить:
ss -tnao state established 'sport = :22'
-tnao - TCP, numeric, all, с таймерами;state established - только активные соединения;'sport = :22' - фильтр по SSH (меняй на свой порт).👉 Обрати внимание на колонку
timer:on (keepalive,...) - соединение живое;on (timewait,...) или долго висит без активности → зомби-сессия.🛠 Что делать:
1. Сбросить проблемные соединения:
ss -K dport = :22 state established
2. Добавить sysctl-тюнинг, чтобы ядро не держало «мертвяков» вечно:
sysctl -w net.ipv4.tcp_keepalive_time=300
sysctl -w net.ipv4.tcp_keepalive_probes=5
sysctl -w net.ipv4.tcp_keepalive_intvl=60
💡 Это помогает, если юзеры «обрываются» без выхода или при нестабильных VPN.
#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin
👍5🔥2
🚨 Иногда сетевой интерфейс «пропадает» после перезагрузки, особенно на серверах с systemd-networkd. Причина - интерфейсы могут переименовываться (например,
Фиксируем имя интерфейса:
🔧 Решение через systemd-link
1. Узнаём MAC-адрес:
2. Создаём правило:
3. Перезапускаем:
Теперь интерфейс всегда будет называться
- Удобнее писать unit-файлы, firewall-правила и netplan-конфиги.
- Избежите «сломанных» сетевых настроек после обновления/замены железа.
👉 Можно использовать Driver= или Path= вместо MAC, если карты одинаковые.
#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin
ens3 → enp0s3).Фиксируем имя интерфейса:
🔧 Решение через systemd-link
1. Узнаём MAC-адрес:
ip link show
2. Создаём правило:
cat >/etc/systemd/network/10-persistent.link <<EOF
[Match]
MACAddress=52:54:00:ab:cd:ef
[Link]
Name=lan0
EOF
3. Перезапускаем:
systemctl restart systemd-udevd
systemctl restart systemd-networkd
Теперь интерфейс всегда будет называться
lan0.- Удобнее писать unit-файлы, firewall-правила и netplan-конфиги.
- Избежите «сломанных» сетевых настроек после обновления/замены железа.
👉 Можно использовать Driver= или Path= вместо MAC, если карты одинаковые.
#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin
👍9❤1
Перевод статей из серии «Кунг-фу стиля Linux»:
— Удобная работа с файлами по SSH
— Мониторинг дисковой подсистемы
— Глобальный поиск и замена строк с помощью ripgrep
— Упрощение работы с awk
— Наблюдение за файловой системой
— Наблюдение за файлами
— Удобный доступ к справке при работе с bash
— Великая сила make
— Устранение неполадок в работе incron
— Расшаривание терминала в браузере
— Синхронизация настроек
— Бесплатный VPN по SSH
— Превращение веб-приложений в полноценные программы
— Утилита marker и меню для командной строки
— sudo и поворот двух ключей
— Программное управление окнами
— Организация работы программ после выхода из системы
— Регулярные выражения
— Запуск команд
— Разбираемся с последовательными портами
— Базы данных — это файловые системы нового уровня
— О повторении кое-каких событий сетевой истории
— PDF для пингвинов
— Делаем все и сразу
— Файловые системы пользовательского пространства теперь доступны и в Windows
— Делиться — это плохо
— Автоматическое генерирование заголовочных файлов
— Простые конвейеры
#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin
— Удобная работа с файлами по SSH
— Мониторинг дисковой подсистемы
— Глобальный поиск и замена строк с помощью ripgrep
— Упрощение работы с awk
— Наблюдение за файловой системой
— Наблюдение за файлами
— Удобный доступ к справке при работе с bash
— Великая сила make
— Устранение неполадок в работе incron
— Расшаривание терминала в браузере
— Синхронизация настроек
— Бесплатный VPN по SSH
— Превращение веб-приложений в полноценные программы
— Утилита marker и меню для командной строки
— sudo и поворот двух ключей
— Программное управление окнами
— Организация работы программ после выхода из системы
— Регулярные выражения
— Запуск команд
— Разбираемся с последовательными портами
— Базы данных — это файловые системы нового уровня
— О повторении кое-каких событий сетевой истории
— PDF для пингвинов
— Делаем все и сразу
— Файловые системы пользовательского пространства теперь доступны и в Windows
— Делиться — это плохо
— Автоматическое генерирование заголовочных файлов
— Простые конвейеры
#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin
👍4🔥3
Короткий совет по Linux 💡
Если вы хотите очистить пустые каталоги, команда find может упростить эту работу:
Параметр -type d выполняет поиск каталогов, -empty выбирает пустые каталоги, а -exec rmdir {} выполняет команду rmdir для их удаления.
Команда rmdir гарантирует, что каталог пуст перед его удалением.
В качестве альтернативы, вы также можете использовать эту команду для выполнения той же задачи:
#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin
Если вы хотите очистить пустые каталоги, команда find может упростить эту работу:
$ find . -type d -empty -exec rmdir -v {} +Параметр -type d выполняет поиск каталогов, -empty выбирает пустые каталоги, а -exec rmdir {} выполняет команду rmdir для их удаления.
Команда rmdir гарантирует, что каталог пуст перед его удалением.
В качестве альтернативы, вы также можете использовать эту команду для выполнения той же задачи:
$ find . -type d -empty -delete#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin
👍4
This media is not supported in your browser
VIEW IN TELEGRAM
NetAlertX — инструмент для мониторинга сетевой активности и обнаружения изменений в подключенных устройствах. Он помогает администратору отслеживать новые устройства в сети, анализировать подключение и уведомлять о любых подозрительных изменениях. Утилита может быть полезной для повышения безопасности сети и оптимизации управления подключениями.
https://github.com/jokob-sk/NetAlertX
#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin
https://github.com/jokob-sk/NetAlertX
#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin
👍6
Управление виртуальными машинами KVM из консоли
#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin
# virsh list – показать список запущенных ВМ# virsh list --all – показать список всех машин (в том числе выключенных)# virsh shutdown <vm name> — выключить виртуальную машину# virsh start <vm name> — запустить виртуальную машину# virsh suspend <vm name> — приостановить виртуальную машину# virsh resume <vm name> — запустить приостановленную виртуальную машину# virsh reboot <vm name> — перезапустить виртуальную машину# virsh destroy <vm name> — уничтожить виртуальную машину# virsh undefine <vm name> — удалить машину из списка и удалить все файлы, принадлежащие ей (обычно применяется после выполнения команды virsh destroy).# virsh vcpuinfo <vm name> — информация о процессоре на виртуальной машине # virsh domid <vm name> — получить идентификатор виртуальной машины# virsh domuuid <vm name> — получить UUID виртуальной машины# virsh dominfo <vm name> — получить сведения о виртуальной машине# virsh domstate <vm name> — просмотр состояния виртуальной машины# virsh dumpxml <vm name> — вывести файл конфигурации указанной виртуальной машины в XML формате#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin
👍8
Команда crontab: опции, ключи и примеры использования
Планировщик cron для запуска задач с заданными интервалом времени от имени текущего пользователя. Формат планирования задачи: "(минута) (час) (день_месяца) (месяц) (день_недели) команда".
Редактирует файл crontab для текущего пользователя:
Выводит список существующих задая для текущего пользоваетеля:
Удаляет все задачи cron для текущего пользователя:
Пример задачи, которая запускается ежедневно в 10:00. * означает любое значение:
Пример задачи, которая запускается каждую минуту 3-го апреля:
Пример задачи, которая запускается каждую пятницу в 02:30:
#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin
Планировщик cron для запуска задач с заданными интервалом времени от имени текущего пользователя. Формат планирования задачи: "(минута) (час) (день_месяца) (месяц) (день_недели) команда".
Редактирует файл crontab для текущего пользователя:
crontab -eВыводит список существующих задая для текущего пользоваетеля:
crontab -lУдаляет все задачи cron для текущего пользователя:
crontab -rПример задачи, которая запускается ежедневно в 10:00. * означает любое значение:
0 10 * * * {{path/to/script.sh}}Пример задачи, которая запускается каждую минуту 3-го апреля:
* * 3 Apr * {{path/to/script.sh}}Пример задачи, которая запускается каждую пятницу в 02:30:
30 2 * * Fri {{path/to/script.sh}}#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin
👍6