networkadm | Unsorted

Telegram-канал networkadm - Network Admin

12610

Обучающий канал по сетевому и системному администрированию. Сотрудничество: @dad_admin Биржа: https://telega.in/c/networkadm РКН: https://bit.ly/4ioc61C

Subscribe to a channel

Network Admin

Скрипт массовой проверки SSL-сертификатов на пуле серверов

Сертификат истёк в 3 ночи, сервис недоступен, клиенты видят страшное предупреждение в браузере. Самая частая причина downtime который легко предотвратить заранее, просто проверяя сроки по расписанию.

Проверка одного сертификата вручную:

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate


-servername важен если на сервере несколько сертификатов через SNI, без него можешь получить не тот сертификат.

Скрипт для пула серверов

#!/bin/bash
THRESHOLD_DAYS=14
BOT_TOKEN="ваш_токен"
CHAT_ID="ваш_chat_id"

while read -r host port; do
expiry=$(echo | timeout 5 openssl s_client -connect "${host}:${port}" -servername "$host" 2>/dev/null \
| openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)

if [ -z "$expiry" ]; then
echo "$host:$port -> не удалось получить сертификат"
continue
fi

expiry_epoch=$(date -d "$expiry" +%s)
now_epoch=$(date +%s)
days_left=$(( (expiry_epoch - now_epoch) / 86400 ))

echo "$host:$port -> $days_left дней до истечения"

if [ "$days_left" -lt "$THRESHOLD_DAYS" ]; then
curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
-d chat_id="${CHAT_ID}" \
-d text="⚠️ SSL на ${host}:${port} истекает через ${days_left} дней"
fi
done < hosts.txt


hosts.txt построчно:

example.com 443
api.example.com 443
mail.example.com 465


В cron раз в сутки:

0 9 * * * /usr/local/bin/check_ssl_pool.sh >> /var/log/ssl_check.log


⚡️timeout 5 в команде критичен. Если хост недоступен или порт фильтруется, openssl s_client может висеть бесконечно и весь скрипт встанет на первом проблемном сервере, не дойдя до остальных.

N.A

Читать полностью…

Network Admin

ARP на роутере с несколькими интерфейсами

Когда на роутере несколько интерфейсов в разных подсетях, ARP-запрос приходит на конкретный интерфейс. Роутер отвечает только если запрашиваемый IP принадлежит этому интерфейсу. Простой случай, работает предсказуемо.

Интереснее когда включён Proxy ARP или несколько интерфейсов в одной подсети.


Strict mode vs weak mode

Linux по умолчанию работает в weak host model: может отвечать на ARP-запрос с любого интерфейса независимо от того на каком пришёл запрос. Роутер получил ARP на eth0, но отвечает MAC-адресом eth1 если именно там настроен запрашиваемый IP.

Это ломает ожидаемое поведение когда несколько интерфейсов в одной подсети или при асимметричном роутинге.

Проверяем текущий режим:

sysctl net.ipv4.conf.all.arp_filter
sysctl net.ipv4.conf.all.arp_announce
sysctl net.ipv4.conf.all.arp_ignore


Переключаем в strict mode: отвечать только с интерфейса на котором настроен запрашиваемый IP:

sysctl -w net.ipv4.conf.all.arp_ignore=1
sysctl -w net.ipv4.conf.all.arp_announce=2


arp_ignore=1: отвечать только если запрашиваемый IP настроен на интерфейсе где пришёл запрос. arp_announce=2: использовать только IP того интерфейса через который уходит пакет.

На Cisco поведение детерминированное: роутер отвечает на ARP только для IP настроенных на интерфейсе где пришёл запрос. Proxy ARP отдельная настройка.

show ip interface Gi0/0 | include proxy|Helper


N.A

Читать полностью…

Network Admin

Почему jumbo frames включили, а производительность не выросла

Jumbo frames это MTU 9000 вместо стандартных 1500. Меньше заголовков на байт данных, меньше прерываний CPU. В теории быстрее, на практике часто никакого эффекта.


Самая частая причина: один интерфейс или коммутатор на пути со стандартным MTU.

Пакеты фрагментируются или дропаются, выигрыша нет. Jumbo frames работают только если все устройства end-to-end настроены одинаково.

Проверяем что путь реально поддерживает 9000:

ping -M do -s 8972 <IP>


8972 это 9000 минус 28 байт заголовков. Если пакет прошёл, путь чистый.

Вторая причина: приложение шлёт маленькими чанками. Jumbo frames помогают только когда есть что класть в большой пакет. Мелкие запросы останутся мелкими пакетами независимо от MTU.

Третья: узкое место вообще не в сетевом стеке. Jumbo frames снижают CPU overhead от обработки пакетов, но если bottleneck в диске или логике приложения, результата не будет.

mpstat -I ALL 1
ethtool -S eth0 | grep rx_packets


⚡️Реально помогает в узких сценариях: iSCSI, NFS, HPC, высоконагруженные линки между серверами в одном датацентре. В смешанном трафике через разные устройства эффект минимальный.

N.A

Читать полностью…

Network Admin

Как поймать внезапный ARP-resolve timeout

Когда «всё работает… но периодически что-то замирает», очень часто виноват ARP.

Хост просто не может быстро получить MAC адрес - и весь трафик встаёт на паузу. Особенно больно это бьёт по VoIP, SSH и интерактивным сервисам.


Обычно такие таймауты не видны в обычных логах, поэтому отлавливать их нужно вручную.

1️⃣Проверяем, как часто хост делает ARP-запросы

Если сосед «теряется», хост начнёт усиленно спрашивать его MAC.

Linux:

tcpdump -ni eth0 arp


Если видишь 2–3 повторяющихся ARP Requests подряд → проблема.

Cisco:

debug arp


или

show arp


Если запись в ARP-таблице часто «флапает», это ненормально.

2️⃣Смотрим, что происходит в момент задержки

Отслеживаем, пропадают ли ответы:

tcpdump -ni eth0 "arp or icmp"


Если ping висит, а в дампе есть ARP Requests без ARP Reply → таймаут найден.

3️⃣Проверяем ARP-таблицу на переполнения и expiry

Если ARP-таблица забилась или записи слишком быстро удаляются → будут постоянные timeouts.

Linux:

ip -s neigh


Подозрительные признаки:
• состояние FAILED
• резкий рост timeouts
• записи часто переходят FAILED → REACHABLE → FAILED

4️⃣Проверяем ARP кэш на коммутаторе

Иногда виноват L2 — коммутатор забывает MAC или шлёт фреймы не туда.

Cisco:

show mac address-table dynamic | include <MAC>


Если MAC постоянно пропадает → проблема на сегменте.

N.A.

Читать полностью…

Network Admin

Почему 10G линк работает на 1G и как это поймать

Линк поднялся, всё зелёное, но скорость как на старом железе. Первая мысль: проблема в приложении или сети. На деле часто линк просто не договорился о скорости.

Смотрим на какой скорости реально работает интерфейс:

ethtool eth0 | grep -E "Speed|Duplex|Auto"
ip -s link show eth0


Если Speed: 1000Mb/s на 10G интерфейсе, autonegotiation не договорился или принудительно выставлена неверная скорость.

Проверяем ошибки на интерфейсе:

ethtool -S eth0 | grep -E "error|drop|miss|fail"


Много ошибок на физическом уровне говорят о проблеме с кабелем или SFP.

Смотрим что видит интерфейс с другой стороны через LLDP:

lldpctl eth0


Покажет что анонсирует сосед: скорость, duplex, модель устройства.

Принудительно выставляем скорость если autonegotiation не работает:

ethtool -s eth0 speed 10000 duplex full autoneg off


Проверяем SFP модуль: температуру, мощность сигнала, vendor:

ethtool -m eth0


Если rx_power или tx_power сильно ниже нормы для данного типа модуля, проблема в оптике или трансивере.

⚡️ DAC-кабели (прямое медное подключение) иногда не работают с чужими SFP-модулями даже если физически подходят. Вендор-лок на уровне прошивки коммутатора: Cisco по умолчанию не принимает non-Cisco трансиверы без service unsupported-transceiver.

N.A.

Читать полностью…

Network Admin

Почему роутер не всегда выбирает маршрут с наименьшей метрикой

Метрика это не единственный критерий выбора маршрута. Сначала роутер смотрит на длину префикса: более специфичный маршрут всегда побеждает независимо от метрики.

Маршрут 192.168.1.0/24 с метрикой 100 выиграет у 192.168.0.0/16 с метрикой 1. Longest prefix match, основа IP-маршрутизации.


Второй критерий: administrative distance. Если маршрут до одной сети пришёл от OSPF и от статики одновременно, роутер выбирает по AD, а не метрике. Статика имеет AD 1, OSPF 110, eBGP 20, iBGP 200. Маршрут с меньшим AD побеждает даже если метрика хуже.

На Cisco смотрим что реально в таблице и почему:

show ip route 10.0.0.0
show ip route 10.0.0.0 255.255.255.0 longer-prefixes


В выводе видно AD и метрику в формате [AD/metric]:

O 10.0.0.0/24 [110/20] via 192.168.1.1


Если маршрут которого ожидаешь не появляется, проверяем все источники:

show ip route summary
show ip bgp 10.0.0.0
show ip ospf database


⚡️ BGP это отдельная история: внутри BGP выбор лучшего маршрута идёт по своему алгоритму из 13 шагов, метрика там только один из критериев и далеко не первый. Weight, Local Preference, AS-path length всё это важнее.

N.A.

Читать полностью…

Network Admin

Почему mmap быстрее read() для больших файлов и когда это не так

read() работает так: ядро копирует данные из page cache в буфер в user space. 


Два адресных пространства, одна лишняя копия на каждый вызов. При больших файлах это накапливается.

mmap отображает файл прямо в виртуальное адресное пространство процесса. Никакой копии, процесс читает данные напрямую из page cache через указатель. Первое обращение к странице вызывает page fault, ядро подгружает её с диска, дальше доступ как к обычной памяти.

На больших файлах с последовательным чтением разница заметна: меньше syscall-ов, меньше копирований, меньше переключений контекста. 


Именно поэтому базы данных, поисковые движки и компиляторы используют mmap для работы с большими структурами данных.

Когда mmap медленнее

При случайном доступе к очень большому файлу mmap генерирует много мелких page fault-ов. Каждый fault это обращение к ядру, TLB miss, возможно диск. read() с большим буфером читает последовательно и prefetch работает лучше.

На NUMA-системах mmap может давать неожиданные результаты: страницы аллоцируются на одном узле, процесс работает на другом, латентность растёт.


При записи mmap требует явного msync() чтобы гарантировать сброс на диск. Легко забыть, данные теряются при падении процесса.

Смотрим page fault-ы конкретного процесса:

/usr/bin/time -v ./myprogram 2>&1 | grep "Page faults"
perf stat -e page-faults ./myprogram


N.A.

Читать полностью…

Network Admin

Почему ICMP redirect считается дырой в безопасности

ICMP redirect это сообщение которое роутер отправляет хосту: “для этого назначения есть путь лучше, используй вот этот шлюз”. Хост получает сообщение и обновляет свою таблицу маршрутизации на лету, без какого-либо подтверждения.

Проблема в том что никакой аутентификации нет. Любой хост в сегменте может отправить ICMP redirect от имени шлюза и перенаправить трафик жертвы через себя.

Классический MITM без особых усилий: жертва продолжает думать что общается напрямую, трафик идёт через атакующего.

Проверяем включены ли redirects на Linux:

sysctl net.ipv4.conf.all.accept_redirects
sysctl net.ipv4.conf.all.send_redirects


1 означает включено. Отключаем:

sysctl -w net.ipv4.conf.all.accept_redirects=0
sysctl -w net.ipv4.conf.all.send_redirects=0
echo "net.ipv4.conf.all.accept_redirects=0" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.send_redirects=0" >> /etc/sysctl.conf


На Cisco роутер по умолчанию отправляет redirects. Отключаем на интерфейсе:

interface Gi0/0
no ip redirects


Отдельная история с secure_redirects: Linux по умолчанию принимает redirects только от шлюзов из своей таблицы маршрутизации. Это частичная защита, но не полная: если атакующий находится на том же сегменте что и шлюз, ограничение не помогает.

sysctl net.ipv4.conf.all.secure_redirects


N.A.

Читать полностью…

Network Admin

Почему traceroute показывает асимметричный путь и когда это нормально

Запускаешь traceroute до хоста и видишь что хопы идут через один город, а ответы приходят явно другим путём.

Или часть хопов показывает латентность выше чем финальный хост. Выглядит как проблема, но чаще всего это просто нормальная работа интернета.


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

Латентность растёт а потом падает к финальному хопу, это тоже не аномалия. Промежуточные роутеры отвечают на TTL exceeded с низким приоритетом, часто через менее оптимальный интерфейс. Финальный хост отвечает нормально.

Цифры на хопах показывают не задержку пути а задержку до конкретного роутера с его стороны.

Смотрим путь в обе стороны:

traceroute 8.8.8.8
mtr --report 8.8.8.8


mtr показывает потери и латентность в реальном времени по каждому хопу, намного информативнее одного traceroute.

Когда асимметрия это реальная проблема: stateful firewall или NAT на пути видит только половину сессии. Пакеты в одну сторону проходят, в другую дропаются потому что состояние соединения не было установлено через этот узел.

mtr --report --report-cycles 20 <IP>


Если конкретный хоп показывает стабильные потери только в одну сторону, вот где проблема.

N.A.

Читать полностью…

Network Admin

Почему после замены коммутатора половина сети перестала работать

Заменили коммутатор, всё подключили, часть хостов работает, часть нет. Физически всё поднято, линки горят. Начинается час диагностики.

Обычно проблема в одном из трёх

Новый коммутатор пришёл с дефолтной конфигурацией. Все порты в VLAN 1, транки не настроены. Хосты которые работают находятся в VLAN 1 и просто повезло. Остальные VLANы не существуют на новом железе.

show vlan brief
show interfaces trunk


Если VLANы не созданы или транк не поднят, вот оно.

STP выбрал новый коммутатор Root Bridge потому что у него меньший MAC или приоритет не был выставлен. Топология пересчиталась, часть портов ушла в blocking. Хосты за этими портами недоступны.

show spanning-tree
show spanning-tree detail | include root


Смотрим кто стал Root и почему. Если новый коммутатор, выставляем приоритет обратно на нужное железо:

spanning-tree vlan 1 priority 4096


Старый коммутатор работал с negotiated duplex или speed, новый договорился иначе. Часть портов поднялась в half-duplex, отсюда коллизии и потери.

show interfaces Gi0/1 | include duplex


Если видим half-duplex там где не должно быть, фиксим явно:

interface Gi0/1
duplex full
speed 1000


N.A.

Читать полностью…

Network Admin

Что происходит когда два DHCP-сервера отвечают на один запрос

Подключил кто-то в офисе домашний роутер к корпоративной сети, или подняли новый DHCP и старый не выключили. Оба слышат broadcast, оба отвечают.


Клиент берёт первый пришедший offer. Не правильный, а именно первый. Если левый сервер ответил быстрее, клиент получает адрес из чужого пула, чужой шлюз, чужой DNS. Настроен, но в сеть не ходит или ходит куда не надо.

Хуже когда пулы пересекаются: два клиента получают одинаковый IP и оба теряют связь. Без каких-либо ошибок на их стороне.

Смотрим кто вообще отвечает на DHCP в сегменте:

sudo tcpdump -i eth0 port 67 or port 68 -n
nmap --script broadcast-dhcp-discover


Если в выводе несколько Server Identifier, проблема подтверждена.

Лечится DHCP Snooping на коммутаторе: офферы разрешены только с доверенных портов, со всех остальных дропаются:

ip dhcp snooping
ip dhcp snooping vlan 10

interface Gi0/1
ip dhcp snooping trust

interface range Gi0/2 - 24
no ip dhcp snooping trust


N.A.

Читать полностью…

Network Admin

Что такое IX и как трафик идёт внутри него

IX (Internet Exchange) это физическая точка где провайдеры, CDN и крупные сети подключаются друг к другу напрямую. Вместо того чтобы гонять трафик через транзитного провайдера и платить за каждый гигабит, участники обмениваются трафиком напрямую и бесплатно между собой.

Крупнейшие точки обмена: DE-CIX во Франкфурте, AMS-IX в Амстердаме, MSK-IX в Москве. Через DE-CIX проходит больше 10 Тбит/с в пике.


Как устроено внутри

Физически IX это один большой коммутатор (или несколько связанных), к которому все участники подключают свои роутеры. Эта общая среда называется IXP fabric. Каждый участник получает порт и IP-адрес в общей подсети IX.

Дальше всё через BGP. Каждый участник поднимает BGP-сессии с теми с кем хочет обмениваться трафиком, анонсирует свои префиксы и получает чужие. Никакой автоматики, только явные пиринговые договорённости.

Route Server

Чтобы не поднимать сотни BGP-сессий с каждым участником отдельно, большинство IX предоставляют Route Server.

Подключаешься к одному RS, получаешь маршруты от всех участников кто тоже подключён к RS. Можно фильтровать что принимать и что анонсировать.

router bgp 65001
neighbor 193.178.185.1 remote-as 65000
neighbor 193.178.185.1 description MSK-IX Route Server


Как трафик идёт внутри

Пакет от пользователя провайдера А до сервера в сети провайдера Б: роутер А смотрит BGP-таблицу, видит что префикс Б получен через IX, отправляет пакет напрямую на роутер Б через IXP fabric. Транзитный провайдер не участвует, задержка меньше, стоимость ниже.

N.A.

Читать полностью…

Network Admin

Как работает TCAM и почему правила ACL влияют на производительность железа

Обычная RAM ищет данные по адресу: дай адрес, получи значение. TCAM работает наоборот: дай значение, получи результат за один такт. Content Addressable Memory, и T означает Ternary: каждый бит может быть 0, 1 или X (don’t care). Именно X позволяет матчить префиксы и маски.

Благодаря этому коммутатор находит совпадение для любого пакета за одну операцию, независимо от размера таблицы. Именно поэтому железо форвардит трафик на линейной скорости.


Почему TCAM дорогой и ограниченный

TCAM потребляет в 5-10 раз больше энергии и площади чристалла чем обычная SRAM. Поэтому его мало: на типичном enterprise-коммутаторе несколько десятков тысяч записей, и они делятся между маршрутами, ACL, QoS и MAC-таблицей.

Посмотреть сколько TCAM осталось на Cisco:

show platform tcam utilization
show sdm prefer


Как ACL влияют на TCAM

Каждая строка ACL это одна или несколько записей в TCAM. Правило с диапазоном портов разбивается на несколько записей потому что TCAM не умеет в диапазоны нативно.

Правило permit tcp any any gt 1024 может развернуться в десятки записей. На больших ACL это незаметно, но на коммутаторах с маленьким TCAM таблица заканчивается и новые правила просто не применяются.

show ip access-lists
show platform hardware capacity


Что делать при нехватке

Меняем SDM profile чтобы перераспределить TCAM между функциями. Например отдать больше под ACL за счёт MAC-таблицы:

sdm prefer acl
reload


N.A.

Читать полностью…

Network Admin

Как коммутатор строит CAM-таблицу и что происходит при переполнении

CAM-таблица это то, за счёт чего коммутатор работает как коммутатор, а не как хаб. Без неё каждый фрейм уходил бы на все порты.

Как строится таблица

Коммутатор учится пассивно: когда фрейм приходит на порт, смотрит на source MAC и записывает на каком порту он находится.

Когда нужно отправить фрейм, ищет destination MAC. Нашёл, отправил на конкретный порт. Не нашёл, flooding на все порты кроме входящего. Записи живут 300 секунд по умолчанию, потом удаляются.

show mac address-table
show mac address-table aging-time


Что происходит при переполнении

CAM хранится в аппаратной памяти фиксированного размера. Когда таблица полна, новые записи не добавляются и любой фрейм с неизвестным MAC уходит флудом. Коммутатор деградирует до хаба.

На этом построена атака MAC flooding: генерируются фреймы с тысячами случайных source MAC, таблица забивается, и весь трафик начинает идти на порт атакующего тоже.

Защита

Port Security ограничивает количество MAC на порту:

interface Gi0/1
switchport port-security
switchport port-security maximum 2
switchport port-security violation restrict

show port-security interface Gi0/1


N.A.

Читать полностью…

Network Admin

Anycast: как это работает за пределами DNS

Anycast это когда один и тот же IP-адрес анонсируется из нескольких точек одновременно. Клиент отправляет пакет, сеть сама выбирает ближайший узел по метрикам BGP.

Никакого DNS, никакого балансировщика между клиентом и сервером.


Большинство знает anycast по DNS: 8.8.8.8 это не один сервер, а сотни точек по всему миру. Но этим применение не ограничивается.

CDN используют anycast чтобы отдавать статику с ближайшего к пользователю POP-а. Cloudflare, Fastly, Akamai, все работают так. Пользователь в Берлине получает контент из Франкфурта, а не из Нью-Йорка, хотя обращается к одному IP.

DDoS-mitigation строится на том же принципе. Атака распределяется между всеми точками присутствия, ни одна не получает весь объём трафика.


NTP-серверы пула pool.ntp.org тоже anycast, клиент всегда попадает на географически близкий узел без какой-либо логики на своей стороне.

Как анонсируется anycast-префикс

Каждая точка присутствия поднимает BGP-сессию с апстримом и анонсирует один и тот же префикс:

router bgp 65001
network 192.0.2.0 mask 255.255.255.0

ip route 192.0.2.0 255.255.255.0 Null0


Маршрут в Null0 нужен чтобы BGP принял префикс для анонса, реальный трафик обрабатывается локально.

N.A.

Читать полностью…

Network Admin

ICMP типы, которые нельзя блокировать

Блокировать весь ICMP это распространённая ошибка которую делают из соображений безопасности.

Часть типов действительно можно заблокировать, но несколько критически важны для работы сети.

Type 3: Destination Unreachable

Самый важный. Код 4 (Fragmentation Needed) используется в Path MTU Discovery: промежуточный узел сообщает отправителю что пакет слишком большой и нужно уменьшить размер. Без него крупные пакеты молча дропаются, мелкие проходят. Симптом: SSH работает, scp зависает, большие страницы не грузятся.

iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 3 -j ACCEPT


Type 11: Time Exceeded

TTL закончился, пакет дропнут. Без этого типа traceroute не работает совсем: не получает ответов от промежуточных хопов и не строит путь. Не критично для трафика, критично для диагностики.

Type 12: Parameter Problem

Сообщает об ошибке в заголовке IP-пакета. Без него отправитель не узнает что пакет был отброшен из-за некорректного заголовка.

Что можно блокировать без последствий

Type 8 (Echo Request) и Type 0 (Echo Reply) это ping. Блокировка ломает только ping, на реальный трафик не влияет. Type 9 и 10 (Router Advertisement/Solicitation) в большинстве сетей не нужны.

Минимальный набор который должен проходить:

iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 12 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 11 -j ACCEPT


N.A

Читать полностью…

Network Admin

А ваши данные в S3 надежно защищены?
Проверьте вашу инфраструктуру и узнайте несколько лайфхаков на вебинаре

30 июня эксперты Selectel расскажут об эффективных механизмах защиты данных в S3 под разные задачи: например, для защиты от случайного удаления или кибератак и для соответствия регуляторным требованиям. В практическом блоке покажут реальные примеры настройки S3 через API и CLI.

📍 Онлайн
⏰ 30 июня в 12:00
👥 Для DevOps-специалистов, системных администраторов, специалистов по информационной безопасности и всех, кто не хочет столкнуться с утечкой и удалением данных.


Регистрируйтесь ➡️ https://slc.tl/6lnjx

Больше мероприятий для ИТ-специалистов в канале @selectel_events. Подписывайтесь!

Реклама. АО "Селектел". erid:2W5zFGd7S57

Читать полностью…

Network Admin

Почему сессия рвётся ровно через N минут

Если сессия рвётся не случайно а по таймеру, где-то на пути есть устройство которое принудительно закрывает idle или долгие соединения. Регулярность это ключ к диагностике.

Первым делом замеряем точное время разрыва в нескольких сессиях. Если цифра одинаковая или кратная, это таймаут а не флуктуация сети.


Где живут таймауты

NAT на роутере или файерволе закрывает записи в таблице трансляций после периода бездействия. Типичные значения: 30 минут на Cisco ASA, 5 минут для UDP на Linux conntrack. TCP-сессия без трафика выглядит для NAT как мёртвая.

Load balancer держит сессии в таблице и закрывает их по таймауту. nginx по умолчанию 60 секунд, AWS ALB 60 секунд, HAProxy 50 секунд. Бэкенд считает сессию живой, балансировщик уже нет.

Файервол с stateful инспекцией делает то же самое что NAT, только без трансляции адресов.

Смотрим conntrack таймауты на Linux:

sysctl net.netfilter.nf_conntrack_tcp_timeout_established
sysctl net.netfilter.nf_conntrack_udp_timeout
cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_close_wait


Смотрим таймауты nginx:

grep -E "timeout|keepalive" /etc/nginx/nginx.conf /etc/nginx/conf.d/*.conf


Как локализовать где именно рвётся

Запускаем tcpdump на обоих концах одновременно и смотрим кто отправляет FIN или RST:

tcpdump -i eth0 -w /tmp/capture.pcap host <IP> and port <PORT>


Если RST приходит не от собеседника а от промежуточного узла, в поле TTL будет другое значение чем у остального трафика от этого хоста.

Быстрый тест

Держим соединение живым искусственным трафиком и смотрим изменилось ли время разрыва:

ssh -o ServerAliveInterval=30 user@host


Если с keepalive сессия живёт дольше, таймаут на idle трафик подтверждён.

N.A

Читать полностью…

Network Admin

Многоуровневая фильтрация трафика с iptables и nftables

iptables и nftables — два подхода к фильтрации трафика в Linux.

iptables — классика, знакомая большинству системных администраторов, работает через цепочки INPUT, OUTPUT, FORWARD.

nftables — современный инструмент, который объединяет IPv4, IPv6 и L2 фильтрацию в единой структуре, с более компактным синтаксисом и улучшенной производительностью.

С помощью них можно: ограничивать доступ по IP, блокировать конкретные порты, фильтровать трафик между VLAN, логировать подозрительные соединения и создавать сложные правила с условием источника, назначения и интерфейса.

Создадим простое ограничение трафика через nftables:


sudo nft add table inet filter
sudo nft add chain inet filter input { type filter hook input priority 0; }
sudo nft add rule inet filter input ip saddr 192.168.1.0/24 accept
sudo nft add rule inet filter input tcp dport 22 accept
sudo nft add rule inet filter input drop


Логирование SSH попыток:


sudo nft add rule inet filter input tcp dport 22 log prefix "SSH DROP: " counter drop


Проверка правил:


sudo nft list ruleset


N.A.

Читать полностью…

Network Admin

Почему autonegotiation ломается и когда его лучше отключить

Autonegotiation это протокол согласования скорости и duplex между двумя портами. Работает через обмен FLP (Fast Link Pulse) сигналами до установки линка. Когда всё работает, трогать не надо. Когда ломается, диагностировать неочевидно.

Чаще всего ломается на стыке старого и нового оборудования: одна сторона анонсирует одно, другая понимает иначе. 


Классический результат: линк поднимается на 100Мбит half-duplex вместо гигабита. Формально работает, по факту коллизии и потери на любой нагрузке.

Смотрим что согласовалось:

ethtool eth0 | grep -E "Speed|Duplex|Link"


Проверяем ошибки которые говорят о duplex mismatch:

ethtool -S eth0 | grep -E "collision|late_collision|deferred"


Много коллизий при нормальном линке, почти всегда duplex mismatch.

Когда отключать autonegotiation: на линках к старому оборудованию которое плохо его реализует, на trunk-портах где важна предсказуемость, на линках где наблюдается периодическая смена скорости.

Выставляем принудительно на обоих концах:

ethtool -s eth0 speed 1000 duplex full autoneg off


На Cisco:

interface Gi0/1
speed 1000
duplex full
no negotiation auto


⚡️ Принудительная скорость на одном конце при включённом autonegotiation на другом хуже чем оба в auto. Один конец не получает FLP и падает в half-duplex по умолчанию. Если отключаешь autoneg, отключай на обоих концах.

N.A.

Читать полностью…

Network Admin

Как работает TCP window scaling и почему его отключение убивает скорость

TCP window это сколько данных можно отправить не дожидаясь подтверждения.

Без window scaling максимум 65535 байт, это ограничение 16-битного поля в заголовке. На канале с большой задержкой этого катастрофически мало.

Считается просто: пропускная способность = window size / RTT. Канал 1 Гбит, RTT 100мс, без scaling максимум 65535 / 0.1 = 655 Кбит/с. Гигабитный канал работает как мегабитный.

Window scaling добавляет множитель до 1073741824 байт. Согласовывается при TCP handshake через опцию WS.

Проверяем включён ли:

sysctl net.ipv4.tcp_window_scaling
ss -tin dst <IP> | grep wscale


Смотрим реальные размеры окна в Wireshark: фильтр tcp.window_size, если значения не растут выше 65535, scaling не работает.

Включаем если выключен:

sysctl -w net.ipv4.tcp_window_scaling=1
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"


⚡️ Некоторые файерволы и middlebox-ы обрезают TCP-опции при handshake. Window scaling согласовывается один раз и если файервол дропнул опцию WS, весь поток работает без scaling. Симптом: скорость нормальная на коротких дистанциях и падает на каналах с высоким RTT.

N.A.

Читать полностью…

Network Admin

Настройка VLAN на Linux через systemd-networkd

systemd-networkd это не только для серверов без GUI, на практике удобнее nmcli для воспроизводимых конфигураций: файлы в /etc/systemd/network/, всё декларативно, легко версионировать в git.

Типичный сценарий: сервер подключён к trunk-порту коммутатора, нужно поднять несколько VLAN-интерфейсов с разными адресами.

Создаём VLAN-интерфейсы

Для каждого VLAN нужно два файла: .netdev описывает интерфейс, .network настраивает его.

VLAN 10:

# /etc/systemd/network/vlan10.netdev
[NetDev]
Name=eth0.10
Kind=vlan

[VLAN]
Id=10

# /etc/systemd/network/vlan10.network
[Match]
Name=eth0.10

[Network]
Address=192.168.10.1/24
Gateway=192.168.10.254


VLAN 20 аналогично, меняем Id и адреса.

Привязываем физический интерфейс

Физический интерфейс должен знать что он trunk и какие VLAN на нём живут:

# /etc/systemd/network/eth0.network
[Match]
Name=eth0

[Network]
VLAN=eth0.10
VLAN=eth0.20


Применяем:

systemctl restart systemd-networkd


Проверка

ip -d link show eth0.10
ip addr show eth0.10
networkctl status eth0.10


networkctl status покажет состояние интерфейса, привязанные адреса и есть ли carrier.

N.A.

Читать полностью…

Network Admin

Настройка WireGuard: сервер, клиент, роутинг

WireGuard проще IPsec и OpenVPN по конфигурации, быстрее поднимается и меньше точек где можно ошибиться. Вот минимальная рабочая конфигурация.

Сервер

Генерируем ключи:

wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key


Конфиг сервера /etc/wireguard/wg0.conf:

[Interface]
PrivateKey = <server_private_key>
Address = 10.0.0.1/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = <client_public_key>
AllowedIPs = 10.0.0.2/32


Включаем форвардинг и поднимаем интерфейс:

sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
wg-quick up wg0
systemctl enable wg-quick@wg0


Клиент

wg genkey | tee /etc/wireguard/client_private.key | wg pubkey > /etc/wireguard/client_public.key


Конфиг клиента:

[Interface]
PrivateKey = <client_private_key>
Address = 10.0.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = <server_public_key>
Endpoint = <server_ip>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25


wg-quick up wg0


Проверка

wg show
ping 10.0.0.1
curl ifconfig.me


wg show покажет активные peer-ы, последнее рукопожатие и переданный трафик. Если handshake давно не было, туннель не установлен.

N.A.

Читать полностью…

Network Admin

Что происходит когда OSPF area 0 теряет связность

Area 0 это backbone. Все остальные area обязаны быть физически или логически подключены к ней.

Если area 0 разваливается на части, OSPF не пересчитывает маршруты в обход, он просто перестаёт видеть часть сети.


Два роутера в area 0 потеряли связь между собой. Каждый считает что его кусок backbone и есть вся сеть. Area которые висят за каждым из них становятся недостижимы с другой стороны. Никаких fallback, никакого альтернативного пути если он не был настроен заранее.

Смотрим что происходит с соседями и LSA:

show ip ospf neighbor
show ip ospf database
show ip ospf database summary


Если в базе данных пропали LSA от роутеров на другой стороне разрыва, связность потеряна. Маршруты до их сетей исчезнут из таблицы маршрутизации.

show ip route ospf


Временное решение пока чинится физика: virtual-link через транзитную area. Натягиваем логический туннель между двумя ABR через area которая ещё жива:

router ospf 1
area 1 virtual-link <router-id соседнего ABR>


На обоих ABR с обеих сторон разрыва. Virtual-link восстанавливает связность area 0 поверх transit area.

N.A.

Читать полностью…

Network Admin

Как ведёт себя сеть при split-brain в HSRP

Два роутера в HSRP обмениваются hello-пакетами каждые 3 секунды. Если связь между ними пропадает, каждый решает что сосед умер и становится Active.

Оба держат один виртуальный IP, оба отвечают на ARP-запросы своим MAC.


Клиенты в этот момент делятся на два лагеря в зависимости от того чей ARP-ответ пришёл последним.

Половина трафика идёт через один роутер, половина через другой. Если маршруты на них разные, часть сессий рвётся, часть работает.

Отлаживать это неприятно потому что проблема плавающая и воспроизводится через раз.

Смотрим состояние HSRP и кто сейчас Active:

show standby brief
show standby


Если оба показывают Active, split-brain в действии. Проверяем доступность между роутерами:

ping <IP соседнего роутера> source <интерфейс HSRP>


Чаще всего причина не в роутерах а в коммутаторе между ними: упал транк, слетел VLAN, сработал STP. Hello-пакеты не проходят, оба уходят в Active.

show interfaces trunk
show spanning-tree vlan <ID>


N.A.

Читать полностью…

Network Admin

Ethernet OAM (802.1ag) с Linux и FRRouting

Ethernet OAM (Operations, Administration and Maintenance) по стандарту 802.1ag позволяет контролировать доступность и состояние линков на уровне L2.

На Linux можно использовать утилиты eth-oam для генерации OAM-сообщений (Continuity Check Messages, Loopback, Link Trace).

Пример проверки линка:

# Проверка доступности линка между хостами через CFM Continuity Check
eth-oam-ccm -i eth0 -m 1 -t 10


Где -i — интерфейс, -m — Maintenance Association ID, -t — интервал в секундах.

Для интеграции с FRRouting можно настроить уведомления о недоступности линка и динамически изменять маршруты.

Например, при падении линка BGP-сессия будет разорвана и маршруты уйдут на резервный путь.

Дополнительно можно использовать Loopback и Link Trace для диагностики проблем:

# Loopback запрос к соседнему устройству
eth-oam-lb -i eth0 -m 1

# Trace путь до узла через L2
eth-oam-lt -i eth0 -m 1 -d <MAC-адрес-соседа>


N.A.

Читать полностью…

Network Admin

Почему MTU 1500 в реальности никогда не 1500. Часть 2

Почему фрагментация не всегда спасает:
Когда пакет не влезает в MTU промежуточного узла, тот должен отправить отправителю ICMP Fragmentation Needed.

Отправитель получает сообщение, уменьшает размер сегмента и пробует снова. Это называется Path MTU Discovery и работает хорошо в теории.


На практике многие сети и файерволы блокируют ICMP полностью. Сообщение Fragmentation Needed не доходит, отправитель продолжает слать большие пакеты, они дропаются без каких-либо уведомлений.

Симптом характерный: мелкие запросы проходят нормально, крупные зависают или обрываются.

Проверяем реальный Path MTU до хоста и тестируем конкретный размер пакета:

tracepath 8.8.8.8
ping -M do -s 1400 8.8.8.8


Если ping с -M do (don’t fragment) падает на определённом размере, MTU на пути именно там.

Как фиксить

Выставляем MTU вручную на туннельном интерфейсе:

ip link set dev tun0 mtu 1420


Для PPPoE на Cisco MSS clamp ограничивает размер TCP-сегментов на уровне роутера, не давая клиентам использовать значения выше допустимого:

interface Dialer0
ip tcp adjust-mss 1452


N.A.

Читать полностью…

Network Admin

Почему MTU 1500 в реальности никогда не 1500?

MTU 1500 это максимальный размер payload в Ethernet-фрейме. Цифра знакомая, но в реальной сети между твоим приложением и получателем почти всегда есть что-то, что откусывает от этого значения.

Иногда немного, иногда достаточно чтобы сломать крупные передачи.


Туннели

Любой туннель оборачивает оригинальный пакет в новый и добавляет свои заголовки. GRE забирает 24 байта, IPsec в tunnel mode от 50 до 70 байт в зависимости от алгоритмов шифрования, WireGuard 60 байт, VXLAN 50 байт.

Если на пути несколько туннелей, байты суммируются. Итоговый MTU внутри может оказаться 1400 и ниже, при этом интерфейс снаружи честно показывает 1500.

PPPoE

PPPoE используют большинство провайдеров на последней миле. Протокол добавляет 8 байт заголовка к каждому фрейму, реальный MTU на интерфейсе становится 1492. 


Если роутер не учитывает это и анонсирует клиентам MSS под 1500, крупные TCP-сегменты начинают фрагментироваться или молча дропаться на пути.

Делаем вторую часть с более подробным разбором на практике?

N.A.

Читать полностью…

Network Admin

Proxy ARP: когда роутер отвечает на чужие ARP-запросы

Обычно на ARP-запрос “кто такой 192.168.1.50?” отвечает сам хост с этим IP. Proxy ARP меняет это поведение: роутер перехватывает запрос и отвечает своим MAC-адресом, как будто этот IP находится на нём. Хост отправляет трафик на роутер, роутер форвардит дальше.

Изначально это придумали для соединения подсетей без настройки маршрутов на конечных устройствах. Актуально было в эпоху когда маски подсетей на хостах не совпадали с реальной топологией.


Где это реально используется сейчас

В облаках и гипервизорах Proxy ARP используется постоянно. Когда виртуальная машина получает IP из одной подсети, а физически находится на хосте в другой, гипервизор отвечает на ARP-запросы за неё. VMware, KVM с определёнными сетевыми конфигурациями, AWS при определённых настройках VPC, всё это Proxy ARP под капотом.

Когда это ломает сеть

Если Proxy ARP включён на роутере по умолчанию (на Cisco он включён), а в сети несколько роутеров, начинается хаос.

Несколько устройств отвечают на один ARP-запрос разными MAC-адресами, трафик уходит не туда, сессии рвутся.
Вторая проблема: хосты кешируют ARP-ответы. Если роутер ответил за чужой IP, хост будет слать трафик через него даже когда прямой маршрут появился.

Проверяем на Cisco:

show ip interface Gi0/0 | include proxy


Отключаем если не нужен:

interface Gi0/0
no ip proxy-arp


На Linux:

cat /proc/sys/net/ipv4/conf/eth0/proxy_arp
echo 0 > /proc/sys/net/ipv4/conf/eth0/proxy_arp


N.A.

Читать полностью…

Network Admin

BGP Blackholing: как быстро дропать DDoS-трафик на уровне сети

Когда на сервер идёт DDoS, стандартный ответ: заблокировать на фаерволе.

Сложность в том, что трафик всё равно доходит до твоего канала и забивает его. Blackholing решает это на уровень выше, трафик дропается ещё у провайдера или на границе сети.

Идея простая: анонсируешь BGP-соседу маршрут до атакуемого IP с community-тегом, который говорит “дропай этот трафик”. Провайдер получает анонс и перенаправляет трафик в null на своей стороне до того как он дошёл до тебя.

Как это выглядит на практике

Создаём статический маршрут в null и анонсируем его через BGP с нужным community (значение уточняется у провайдера, обычно это RTBH community):

ip route 203.0.113.5 255.255.255.255 Null0

route-map BLACKHOLE permit 10
set community 65535:666 additive
set local-preference 200

router bgp 65001
neighbor 198.51.100.1 route-map BLACKHOLE out
network 203.0.113.5 mask 255.255.255.255


Проверяем что маршрут анонсируется соседу:

show bgp ipv4 unicast 203.0.113.5
show bgp neighbors 198.51.100.1 advertised-routes


Убираем blackhole когда атака закончилась

no ip route 203.0.113.5 255.255.255.255 Null0
clear ip bgp 198.51.100.1 soft out


N.A.

Читать полностью…
Subscribe to a channel