Часто говорят, что при DDoS провайдер отправляет трафик в blackhole. Это не метафора - blackhole (или nullroute) - реальная запись в таблице маршрутизации, которая заставляет ядро молчаливо отбрасывать пакеты к указанному адресу/сети.
ip route add blackhole 10.20.30.40
ip route show | grep blackhole
Теперь все пакеты к 10.20.30.40 будут просто выброшены, без попытки доставить и без ICMP-ответа.
Для сети:
ip route add blackhole 203.0.113.0/24
Для IPv6:
ip -6 route add blackhole 2001:db8::/32
ip route del blackhole 203.0.113.0/24
blackhole - молча дропает пакеты (никаких ICMP).
prohibit - отсылает ICMP administratively prohibited (полезно, если нужно, чтобы источник получил уведомление).
unreachable - возвращает host unreachable.
Команды выглядят похоже:
ip route add prohibit 10.0.0.0/8
ip route add unreachable 10.0.0.0/8
Выбор зависит от сценария: для имитации «исчезновения» хоста - blackhole, чтобы сигнализировать отправителю - prohibit/unreachable.
Провайдеры - при крупном DDoS обычно ставят null-route на адрес жертвы на своей инфраструктуре. Это позволяет дропать трафик до границ сети провайдера, защищая инфраструктуру дальше по пути.
#network #blackhole
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
nftables - это замена iptables, встроенная в ядро linux. Она объединяет фильтрацию, NAT и маршрутизацию в единую подсистему и считается более быстрой и удобной. Разберемся, как можно построить базовую защиту сервера.
sudo nft add table inet filter
sudo nft 'add chain inet filter input { type filter hook input priority 0; policy drop; }'
Мы сразу задали policy drop, то есть по умолчанию все запрещено. Теперь разрешим только нужное.
sudo nft add rule inet filter input ct state established,related accept
sudo nft add rule inet filter input iif lo accept
sudo nft add rule inet filter input ip protocol icmp accept
sudo nft add rule inet filter input tcp dport {22,80,443} accept
Что тут происходит:
принимаем все соединения в состоянии ESTABLISHED и RELATED
разрешаем локальный интерфейс (lo)
разрешаем ping (ICMP)
открываем SSH, HTTP и HTTPS
sudo nft add rule inet filter input tcp dport 22 ct state new limit rate 10/minute accept
sudo nft add rule inet filter input tcp dport 22 drop
Теперь на SSH можно будет открыть не более 10 новых подключений в минуту.
# блокируем пакеты без флагов (NULL scan)
sudo nft add rule inet filter input tcp flags == 0 drop
# блокируем XMAS-скан
sudo nft add rule inet filter input tcp flags & (fin|psh|urg) == (fin|psh|urg) drop
sudo nft list ruleset
Сохранить конфиг:
sudo sh -c "nft list ruleset > /etc/nftables.conf"
sudo systemctl enable nftables
sudo systemctl restart nftables
#nftables #security
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤1
journalctl - это инструмент работы с логами systemd.
journalctl -u ssh
journalctl -u nginx -u php-fpm
Последние записи сервиса в реальном времени (аналог tail -f):
journalctl -u nginx -f
journalctl --since "2025-10-01" --until "2025-10-15"
journalctl --since "1 hour ago"
journalctl --since yesterday
journalctl -u ssh | grep "Failed password"
Или встроенный фильтр по приоритету (severity):
journalctl -p err -u ssh
(-p принимает диапазон: -p warning..crit)
journalctl -b # текущая загрузка
journalctl -b -1 # предыдущая загрузка
journalctl -b -2 # еще раньше
Сохранить в файл:
journalctl -u nginx --since today > nginx.log
Экспорт в бинарный лог и перенос на другой сервер:
journalctl --vacuum-time=7d # удалить старше 7 дней
journalctl --vacuum-size=1G # ограничить объем
#systemd #journalctl
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Please open Telegram to view this post
VIEW IN TELEGRAM
😁21❤4👌3
Когда разворачиваешь кластер или нужно повторить одинаковые действия на нескольких серверах, очень помогает режим синхронизации панелей в tmux. С ним одна команда сразу выполняется во всех открытых панелях.
apt install tmux
Ctrl+B % - вертикальное разделениеCtrl+B " - горизонтальное разделениеCtrl+B :) вводим:
:setw synchronize-panes
Теперь все, что вводите в активной панели, автоматически дублируется во все остальные.
Отключение производится той же командой.
Если работаете с одним и тем же стендом регулярно, то можно написать конфиг для tmux или скрипт, который сразу запускает сессию и подключает нужные SSH-сессии.
#linux #terminal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12
Иногда необходимо жестко контролировать, какие ядра процесс может занимать, например, чтобы тяжелые задачи не забивали сервер или чтобы критичные сервисы не конкурировали за ресурсы. В linux это решается утилитой
taskset, которая позволяет как изменять affinity уже работающих процессов, так и запускать новые с заданными ограничениями.
ps aux | grep myapp
pidof myapp
pgrep -f myapp
Посмотрим CPU в системе:
lscpu | grep -E 'CPU\(s\)|NUMA'
Пример вывода:
CPU(s): 8
NUMA node0 CPU(s): 0-7
Допустим, нам нужно посадить процесс на ядра 0–2. Для этого:
taskset -pc 0-2 1574
Пример результата:
pid 1574's current affinity list: 0-7
pid 1574's new affinity list: 0,1,2
Теперь процесс гарантированно не займет остальные ядра.
Как работает маска?
Каждое ядро - это один бит:
Ядро Маска
0 1
1 2
2 4
3 8
… …
Например:
ядра 1 и 2 = 2 + 4 = 6 → маска 0x06
Пример запуска с ограничением на одно ядро. Запустить программу только на ядре 0:
taskset 1 gzip hugefile
(маска 1 = ядро 0)
Пример: запуск на ядрах 2 и 3
Маска: 4 + 8 = 12 = c
taskset c gzip hugefile
taskset -pc 4-5 $(pidof systemd-journald)
А теперь смотрим его маску:
taskset -p $(pidof systemd-journald)
Пример:
pid 412's current affinity mask: 30
Вот и маска.
dd if=/dev/urandom of=/tmp/testfile bs=1M count=200
Запускаем xz только на ядрах 0 и 1 (маска 3):
taskset 3 xz -T2 /tmp/testfile
Смотрим в htop и процесс будет занимать строго эти два ядра.
#linux #taskset
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥1
Nmap - это не только сканер портов, но и инструмент для быстрой диагностики сети. Небольшая подборка команд, которые часто выручали меня в работе.
nmap -Pn -sS -T4 10.20.1.5
SYN-скан, не пингуем сначала, быстрый тайминг.
nmap -sV --top-ports 100 10.20.1.0/24
Узнаем версии сервисов по 100 самым распространенным портам в подсети.
nmap -p- -T4 10.20.1.5
Сканируем все 65535 TCP-портов.
sudo nmap -sU --top-ports 50 10.20.1.5
UDP требует прав root и больше времени - выбирайте топ-порты.
sudo nmap -A 10.20.1.5
Включает обнаружение ОС, версий, скрипты и traceroute.
nmap --noscript ssl-enum-ciphers,http-noscript -p 443,80 10.20.1.5
Проверяем SSL-шифры и заголовок сайта.
nmap -sV -oA scans/site_scan 10.20.1.0/24
Создаст
site_scan.nmap, .gnmap и .xml - будет удобно для отчетов.
nmap -sn 10.20.1.0/24
Быстрый ping-scan, покажет кто в сети сейчас.
#nmap #network
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤3
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤3😁1
Иногда нужно выяснить, было ли соединение на SSH-порт сервера (обычно 22) с конкретного адреса. Казалось бы, задача простая, но есть несколько подходов - как для активных соединений, так и для анализа постфактум.
Современный инструмент - ss:
ss -ntu | grep ':22'
Аналог - netstat:
netstat -ntu | grep ':22'
Еще один полезный вариант - lsof:
lsof -ni TCP:22
SSH по умолчанию пишет в системный журнал (
/var/log/auth.log или /var/log/secure), но для других сервисов можно включить логирование через firewall.Пример для iptables:
iptables -N ssh_in
iptables -A INPUT -p tcp --dport 22 -j ssh_in
iptables -A ssh_in -j LOG --log-level info --log-prefix "--IN--SSH-- "
iptables -A ssh_in -j ACCEPT
Теперь все подключения на порт 22 будут попадать в syslog.
Хотите отдельный лог - добавьте правило в rsyslog.
На практике часто используют отдельные цепочки (INPUT, OUTPUT, FORWARD), куда добавляют правила для логирования нужных адресов и портов.
cat /proc/net/nf_conntrack | grep 'dport=22'
По сути, ss и netstat читают данные именно отсюда.
#network
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1
Три основных механизма, которые могут использоваться в linux:
Где искать системные задания:
/etc/crontab
/etc/cron.d/
/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/
Где искать пользовательские задания:
/var/spool/cron/crontabs
или просто:
crontab -u user01 -l
Каждый пользователь имеет свой отдельный список задач.
Они более гибкие: умеют запускать сервисы с зависимостями, работать после событий, логировать в journal и даже поддерживают случайные задержки.
Посмотреть список таймеров:
systemctl list-timers
Все таймеры, включая неактивные:
systemctl list-timers --all
Подробнее о конкретном таймере:
systemctl status logrotate.timer
Примеры стандартных таймеров, установленных по умолчанию:
apt-daily.timer
fstrim.timer
logrotate.timer
anacron.timer
Идеален для задач вроде: выполни через 5 минут и забудь.
В Debian 11+ утилита не устанавливается по умолчанию, но в CentOS/RHEL она ещё есть:
apt install at
Проверить очередь задач:
atq
Добавить разовую задачу:
echo "shutdown -h now" | at -m 10:20
Задачи хранятся в:
/var/spool/cron/atjobs/
или /var/spool/at/
#cron
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2
iperf3 - показывает реальную пропускную способность между двумя хостами, минуя влияние дисков, приложений и прочего. Ранее уже был пост - ссылка. Здесь продолжение, с реальным примером замера и полезными флагами.
iperf3 работает по схеме клиент–сервер.
Один узел запускается в режиме сервера, второй - в режиме клиента.
Сервер принимает входящий трафик, а клиент его генерирует.
iperf3 -s
не забываем, что по умолчанию слушает порт 5201, он должен быть открыт.
iperf3 -c 192.168.1.10
Результат:
[ 5] 0.00-10.00 sec 1.09 GBytes 935 Mbits/sec sender
[ 5] 0.00-10.00 sec 1.09 GBytes 935 Mbits/sec receiver
То есть реальная пропускная способность между хостами - ~935 Мбит/с.
-R - измерение скорости в обратном направлении (reverse).
iperf3 -c 192.168.1.10 -R
iperf3 -c 192.168.1.10 -u -b 500M
-f - единицы измерения (m для Mbits, M для MBytes):
iperf3 -c 192.168.1.10 -f m
iperf3 -s & ssh user@192.168.1.10 'iperf3 -c $(hostname -I | awk "{print \$1}") -P 4'
Скрипт запускает сервер локально и клиент удаленно, автоматически подключая IP.
#network #iperf3
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤1
Один из частых вопросов: почему система грузится так долго? Для раскрытия этой тайны можно использовать встроенный инструмент
systemd-analyze, который покажет подробную статистику загрузки и поможет найти узкие места.
systemd-analyze
Пример вывода:
Startup finished in 2.351s (kernel) + 8.512s (userspace) = 10.863s
kernel - время работы ядра до запуска systemd
userspace - запуск сервисов и инициализация systemd
итоговое время загрузки
systemd-analyze blame
Вывод отсортирован по времени запуска. На первых строках будут виновники торжества.
systemd-analyze critical-chain
Она покажет цепочку сервисов, которые напрямую влияют на общее время старта.
Для детального графа в SVG:
systemd-analyze plot > boot.noscript
Файл можно открыть в браузере - это визуализация всех юнитов и их зависимостей.
systemctl disable bluetooth.service
systemctl disable cups.service
Например, если дольше всего грузится NetworkManager-wait-online.service, можно сократить или отключить ожидание сети.
systemctl mask service_name
#systemd #boot
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤3
IPv6 давно перестал быть экзотикой в мире, но в локальной инфраструктуре (особенно в корпоративных и домашних сетях) его почти никто не использует. Причина простая - в локалках адреса не заканчиваются, да и пользы от IPv6 нет, если нет связи с интернетом, где он действительно нужен.
А вот проблем добавить он может:
требует отдельной настройки безопасности,
нужно следить за совместимостью сервисов,
а если забыть про firewall для IPv6, то появится открытая дыра, о которой даже не узнаете.
Если протокол вам не нужен, то его стоит отключить.
Сделать это можно тремя способами, в зависимости от ситуации.
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
Примените изменения:
sysctl -p
Откройте
/etc/default/grub и добавьте в строку:
GRUB_CMDLINE_LINUX="... ipv6.disable=1"
(оставшиеся параметры не удаляйте, просто добавьте через пробел)
Обновите конфигурацию загрузчика:
update-grub # Debian/Ubuntu
dpkg-reconfigure grub-pc
grub-mkconfig -o /boot/grub/grub.cfg
grub2-mkconfig -o /boot/grub2/grub.cfg # RHEL/CentOS
После этого - перезагрузка и проверка:
ip a
ss -tulnp
Если IPv6 отключен - адресов вида ::1 или fe80:: вы больше не увидите.
Добавьте в
/etc/sysctl.conf:
net.ipv6.conf.eth0.disable_ipv6 = 1
или примените временно:
sysctl -w net.ipv6.conf.eth0.disable_ipv6=1
На windows лучше IPv6 не отключать. По словам microsoft, это может вызвать проблемы с внутренними сервисами и сетевыми компонентами системы.
#IPv6 #network
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤3
Если нужно показать работу скрипта, но не отдавать исходники - можно скомпилировать его в бинарник через shc. Инструмент преобразует .sh в C-код и собирает исполняемый файл, на выходе пользователь получит работающий бинарник, но не читаемый скрипт.
apt install shc gcc
noscript.sh:#!/bin/bash
v=$1
echo "Simple BASH noscript. Entered VARIABLE: $v"
Компилируем:
shc -f -r noscript.sh
Появятся
noscript.sh.x (бинарник) и noscript.sh.x.c (сгенерированный C). Запуск:./noscript.sh.x 123
# Simple BASH noscript. Entered VARIABLE: 123
-e DD/MM/YYYY - срок годности; после даты бинарник не запустится.
-m "msg" - сообщение при истечении срока.
Пример с истечением:
shc -e 31/12/2025 -m "Срок истек" -f -r noscript.sh
./noscript.sh.x # Выдаст сообщение о просрочке
📌 Важное замечание по безопасности
shc - это обфускация, а не криптография. В конечном бинарнике содержимое может быть восстановлено (есть утилиты вроде UnSHc). Также секреты, записанные в скрипт, при выполнении будут лежать в памяти и их можно попытаться снять дампом. Это защита от случайного копирования, но не от целенаправленного анализа.
#noscript #security
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍8❤4🤡1
Если вы хотите получить максимально легкий и чистый образ windows 11 - без мусора, предустановленных приложений и ненужных сервисов, то обратите внимание на nano11.
Это PowerShell-скрипт, который автоматизирует процесс сборки сильно урезанной версии Windows 11. Он использует встроенные средства DISM и oscdimg.exe, не требуя никаких внешних утилит. В результате получается компактный ISO-образ, идеально подходящий для тестирования, отладки или развертывания на виртуальных машинах.
Создает минимальный ISO-образ Windows 11
Удаляет все предустановленные приложения и лишние компоненты
Не поддерживает обновления и добавление языков (только базовая сборка)
Подходит для VM и изолированных окружений
Полностью открытый исходный код, можно модифицировать под свои задачи
Репозиторий проекта
#windows #powershell
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤7🔥3
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14🫡3💩1
Бывает такое, что сервер уже настроен и работает, но не покидает ощущение - вдруг что-то упустил, оставил какую-то уязвимость - незащищенные параметры SSH, лишние службы, слабые настройки sysctl. Чтобы быстро проверить систему, удобно использовать Lynis, инструмент для аудита безопасности и оценки соответствия стандартам.
Lynis - это утилита с открытым исходным кодом, которая выполняет анализ конфигурации linux и unix подобных систем и выдает рекомендации по усилению безопасности. Она проверяет десятки аспектов системы:
настройки ядра и PAM,
файрвол и службы,
права на файлы,
SSH, cron, логирование,
пакеты и обновления.
apt install lynis #debian или ubuntu
yum install lynis #CentOS
lynis audit system
После выполнения вы получите подробный отчет с результатами и рекомендациями.
Файл отчета по умолчанию сохраняется в:
/var/log/lynis.logа краткий отчет в:
/var/log/lynis-report.datВ конце проверки Lynis показывает оценку безопасности - чем она выше, тем лучше.
Также будут даны рекомендации, например:
[WARNING] SSH root login is enabled
[SUGGESTION] Install a firewall management tool (ufw/firewalld)
Просто проходите по списку и исправляйте. После доработок можно снова запустить аудит и посмотреть, насколько улучшился индекс.
Официальный сайт
#linux #security
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍16❤1
Иногда нужно быстро поделиться файлами между машинами - без nginx, apache и прочих решений. Для этого можно использовать встроенный веб-сервер python:
python3 -m http.server 8000
Он идеально подходит, когда нужно просто раздать файлы по HTTP: перешел в нужную директорию, запустил сервер, скачал - готово.
Но недавно понадобился HTTPS-сервер, так как приложение отказывалось работать по обычному HTTP. Настраивать nginx для этого не хотелось, и, как оказалось, все можно сделать тем же питоном, буквально в несколько строк.
openssl req -new -x509 -keyout localhost.pem -out localhost.pem -days 365 -nodes
webserver.py:
import http.server, ssl
server_address = ('172.20.0.210', 8000)
httpd = http.server.HTTPServer(server_address, http.server.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(
httpd.socket,
server_side=True,
certfile='localhost.pem',
ssl_version=ssl.PROTOCOL_TLSv1_2
)
httpd.serve_forever()
Запуск:
python3 webserver.py
После этого открываем в браузере:
https://172.20.0.210:8000
и видим содержимое директории (или сайт, если там есть index.html).
#python #https
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥3❤1