Network Admin
Обучающий канал по сетевому и системному администрированию. Сотрудничество: @dad_admin Биржа: https://telega.in/c/networkadm РКН: https://bit.ly/4ioc61C
Показати більше📈 Аналітичний огляд Telegram-каналу Network Admin
Канал Network Admin (@networkadm) у мовному сегменті Російська є активним учасником. На даний момент спільнота об'єднує 12 399 підписників, посідаючи 9 781 місце в категорії Технології та додатки та 51 817 місце у регіоні Росія.
📊 Показники аудиторії та динаміка
З моменту свого створення невідомо, проект продемонстрував стрімке зростання, зібравши аудиторію у 12 399 підписників.
За останніми даними від 15 вересня, 2026, канал демонструє стабільну активність. Хоча за останні 30 днів спостерігається зміна кількості учасників на -12, а за останні 24 години на 1, загальне охоплення залишається високим.
- Статус верифікації: Не верифікований
- Рівень залученості (ER): Середній показник залученості аудиторії становить 13.68%. Протягом перших 24 годин після публікації контент зазвичай збирає 5.90% реакцій від загальної кількості підписників.
- Охоплення публікацій: В середньому кожен допис отримує 1 696 переглядів. Протягом першої доби публікація в середньому набирає 731 переглядів.
- Реакції та взаємодія: Аудиторія активно підтримує контент: середня кількість реакцій на один пост – 4.
- Тематичні інтереси: Контент зосереджений навколо ключових тем, таких як vlan, arp, интерфейс, ping, dhcp.
📝 Опис та контентна політика
Автор описує ресурс як майданчик для висловлення суб'єктивної думки:
“Обучающий канал по сетевому и системному администрированию.
Сотрудничество: @dad_admin
Биржа: https://telega.in/c/networkadm
РКН: https://bit.ly/4ioc61C”
Завдяки високій частоті оновлень (останні дані отримано 16 вересня, 2026), канал підтримує актуальність та високий рівень охоплення публікацій. Аналітика показує, що аудиторія активно взаємодіє з контентом, що робить його важливою точкою впливу в категорії Технології та додатки.
R1 → R5 → R8 → R12Каждый SID занимает IPv6-адрес, поэтому длинный путь быстро раздувает SRH. Например:
SID 1 SID 2 SID 3 SID 4 SID 5 ...Чем больше сегментов, тем больше служебных данных приходится тащить вместе с пакетом. uSID (micro-SID) решает эту проблему другим способом. Вместо того чтобы использовать полноценный 128-битный SID для каждого шага, несколько коротких инструкций помещаются внутрь одного IPv6-адреса:
IPv6 address ┌──────────────┬───────────────────────────────┐ │ locator │ uSID │ uSID │ uSID │ uSID │ └──────────────┴───────────────────────────────┘Условно:
LOC:R1 | R5 | R8 | R12Когда пакет проходит через очередной SRv6 node, текущий uSID обрабатывается, а следующий становится активным. В результате тот же логический путь:
R1 → R5 → R8 → R12можно закодировать компактнее, чем последовательностью отдельных 128-битных SID. Зачем это вообще нужно? Потому что SRv6 использует IPv6-адреса для инструкций. Если построить длинный traffic-engineered path и записать каждый шаг отдельным SID, служебная часть пакета начинает заметно расти. uSID позволяет уплотнить несколько инструкций в один SID-контейнер, сохраняя модель SRv6. Условно:
обычный SRv6:
[SID][SID][SID][SID][SID]
uSID:
[Locator | uSID | uSID | uSID | uSID]То есть uSID - это не новый routing protocol и не «более быстрый IPv6». Это способ сделать SRv6-путь компактнее, когда количество инструкций становится большим. N.A.
R1 ── R2 ── R4
│
X
│
R3 ── R4
R1 знает, что если линк R2-R4 пропадёт, трафик можно отправить через R3.
При отказе R2 не ждёт полноценного SPF для восстановления forwarding. Он использует заранее рассчитанный backup path.
В SR-сетях этот путь можно выразить через Segment List:
R1 → [SID R3] → R4И пакет сразу получает альтернативный forwarding path. Получается:
обычный convergence: link down ↓ LSA/LSP ↓ SPF ↓ новый маршрут ↓ FIB update ↓ forwarding TI-LFA: link down ↓ локальная защита ↓ backup path ↓ forwardingСамая интересная часть здесь в том, что TI-LFA не пытается быстрее пересчитать всю сеть. Он старается сделать так, чтобы при отказе маршрутизатору вообще не пришлось ждать этого пересчёта для уже идущего трафика. Поэтому TI-LFA особенно полезен в сетях, где несколько десятков миллисекунд уже имеют значение: транспорт, датацентры, backbone и другие чувствительные к потере трафика сервисы. N.A.
show spanning-tree
показывает не просто «какой порт заблокирован». Она позволяет понять, почему именно этот порт проиграл выбор пути.
Например:
VLAN 10
Root ID Priority 24586
Address 0011.2233.4455
Interface Role Sts Cost
Gi1/0/1 Root FWD 4
Gi1/0/2 Altn BLK 4
На первый взгляд кажется:
Gi1/0/2 - резервный линк, всё нормально.
Но STP выбирает не «основной и резервный кабель». Каждый switch сравнивает BPDU и стоимость пути до Root Bridge.
Если два пути имеют одинаковый cost, в дело идут дополнительные tie-breaker:
Root Bridge
↓
Root Path Cost
↓
Sender Bridge ID
↓
Sender Port ID
Поэтому после замены коммутатора или изменения priority один и тот же физический линк вполне может внезапно стать BLK.
Особенно полезно смотреть:
show spanning-tree vlan 10 detailТам можно увидеть изменения topology и понять, почему STP пересчитал дерево, а не просто констатировать, что порт заблокирован. N.A.
65000:100Но делают они совершенно разные вещи. Представим двух клиентов:
Customer A 10.10.10.0/24 Customer B 10.10.10.0/24Для обычного BGP это один и тот же IPv4-префикс. RD добавляет к нему уникальность:
RD 65000:100 + 10.10.10.0/24
↓
65000:100:10.10.10.0/24
У второго клиента:
65000:200:10.10.10.0/24Теперь PE-маршрутизатор может хранить оба маршрута, несмотря на одинаковый IPv4 prefix. Но RD не решает, кому этот маршрут можно импортировать. Для этого используется RT. Например:
VRF-A export RT 65000:100 import RT 65000:200А у другой VRF:
VRF-B export RT 65000:200 import RT 65000:100Получается:
VRF-A │ │ export RT 65000:100 ↓ MP-BGP ↓ │ import RT 65000:100 ↓ VRF-BТо есть логика примерно такая:
RD → «Как сделать этот маршрут уникальным?» RT → «В какие VRF этот маршрут можно импортировать?»И здесь есть важный момент. Одинаковый RD не означает, что VRF должны видеть маршруты друг друга. И наоборот: одинаковый RT не означает, что маршруты имеют одинаковый RD. Их можно даже специально сделать разными:
VRF-A RD: 65000:101 RT export: 65000:100 VRF-B RD: 65000:202 RT import: 65000:100Маршруты будут различаться в VPN control plane благодаря RD, а политика распространения между VRF будет определяться RT. Поэтому RD и RT лучше запомнить не как «две похожие цифры», а как две разные функции: RD - идентичность VPN-маршрута. RT - политика его распространения. N.A.
bpftool prog profile: кто съедает CPU внутри BPF
BPF-программы могут работать в сетевом пути тысячи и миллионы раз в секунду.
Поэтому проблема иногда выглядит странно:
CPU → 100% приложение → почти не грузит network traffic → высокийСмотреть только на процессы в
top здесь недостаточно.
У bpftool есть режим профилирования конкретной BPF-программы:
bpftool prog showНаходим нужную программу и получаем её ID:
123: xdp name firewallПосле этого:
bpftool prog profile id 123Можно получить статистику выполнения программы и понять, сколько процессорного времени она реально потребляет. Почему это полезно? Допустим, на сервере стоит XDP-фильтр. Он должен быстро отбрасывать мусорный трафик, но внутри программы появилась сложная логика: несколько map lookup, дополнительные проверки и работа с большим количеством пакетов. При небольшом трафике это незаметно. А при 5 млн PPS:
5 000 000 packets/sec
×
несколько дополнительных операций
↓
существенная нагрузка CPU
И в итоге администратор видит просто высокий softirq/CPU usage, хотя источник нагрузки находится внутри BPF-программы.
Это особенно интересно тем, что BPF выполняется не как отдельный процесс, который можно найти в top.
То есть искать:
top ps auxв этом случае недостаточно. Логика диагностики получается другой:
CPU ↑ ↓ network/softirq ↑ ↓ BPF подозрителен ↓ bpftool prog show ↓ bpftool prog profileИ это уже позволяет искать не «какой процесс грузит CPU», а какая программа внутри kernel datapath тратит процессорное время. N.A.
ip neigh flush dev eth0
После этого:
ip neigh show dev eth0
может показать:
10.10.10.1 INCOMPLETEЯдро ещё не знает MAC шлюза и отправит ARP-запрос:
Who has 10.10.10.1?После ответа запись снова станет, например:
10.10.10.1 lladdr aa:bb:cc:dd:ee:ff REACHABLEНо есть важный нюанс.
flush не чинит ARP-проблему. Если шлюз не отвечает на ARP, после очистки вы просто получите INCOMPLETE и потерю связи.
Поэтому команда полезна именно как диагностический приём:
ip neigh show dev eth0
ip neigh flush dev eth0
ip neigh show dev eth0
Если после flush сосед снова быстро появляется с правильным MAC - проблема могла быть в устаревшем состоянии neighbor table.
Если остаётся:
INCOMPLETEищите уже ниже:
tcpdump -ni eth0 arp
N.A.eth0 → 10.0.1.10/24 eth1 → 10.0.2.10/24И оба имеют доступ к внешней сети. Когда приложение обращается к:
8.8.8.8Linux не выбирает интерфейс по принципу «первый доступный». Сначала он делает routing lookup:
ip route get 8.8.8.8
Например:
8.8.8.8 via 10.0.1.1 dev eth0 src 10.0.1.10Здесь kernel уже определил:
destination → 8.8.8.8
gateway → 10.0.1.1
interface → eth0
source IP → 10.0.1.10
Но интереснее становится, когда появляются ip rule.
ip ruleНапример:
0: from all lookup local 100: from 10.0.2.0/24 lookup isp2 200: from all lookup mainТеперь два почти одинаковых запроса могут получить разные маршруты:
source 10.0.1.10 → eth0 source 10.0.2.10 → eth1При этом обычный:
ip routeможет вообще не объяснить, почему второй пакет пошёл через
eth1.
Для конкретного источника можно проверить:
ip route get 8.8.8.8 from 10.0.2.10И получить уже другой результат. Поэтому на multi-homed сервере вопрос «какой default route стоит?» часто недостаточен. Нужно смотреть какой routing policy применяется именно к этому пакету. N.A.
192.168.1.50он получает ещё и lease time:
lease: 8 hoursПри обычной работе клиент не ждёт окончания lease. Он пытается продлить его заранее. Упрощённо:
0% ───────── 50% ───────── 87.5% ───── 100%
│ │
renew rebind expire
На этапе T1 клиент обращается к DHCP-серверу, который выдал lease.
Если тот недоступен, позже начинается T2 - клиент уже пытается продлить аренду через broadcast, чтобы найти любой доступный DHCP-сервер.
Посмотреть lease на Linux можно, например, через:
networkctl status eth0
или:
cat /var/lib/dhcp/dhclient.leases
При перезагрузке клиент может попытаться вернуть себе прежний адрес. Но DHCP-сервер не обязан его сохранить: он проверяет актуальность lease и состояние пула.
Поэтому ситуация:
сервер был → 192.168.1.50 перезагрузился сервер снова появился → 192.168.1.73не обязательно означает ошибку DHCP. Между клиентом и сервером существует отдельное состояние аренды, и IP-адрес - только одна его часть. Именно поэтому при проблемах с DHCP полезно смотреть не только
ip addr, а кто выдал lease, когда он истекает и на каком этапе продления находится клиент.
N.A.ip neigh showНапример:
10.0.0.1 dev eth0 lladdr aa:bb:cc:dd:ee:ff STALEВажно не только наличие MAC, но и состояние записи: REACHABLE, STALE, DELAY, PROBE, FAILED. 2️⃣Проверяем ARP непосредственно до gateway
arping -I eth0 10.0.0.1
Если ответы приходят с неожиданного MAC, проблема уже не в маршрутизации.
3️⃣Смотрим ARP на интерфейсе
tcpdump -ni eth0 arp
Можно увидеть, кто спрашивает:
Who-has 10.0.0.10?и кто отвечает:
10.0.0.10 is-at 11:22:33:44:55:66Если разные устройства получают разные MAC для одного IP - это уже серьёзный признак конфликта или некорректного failover. 4️⃣Наблюдаем изменения neighbor table в реальном времени
ip monitor neighПолезно, когда проблема появляется не постоянно: можно увидеть, как запись меняется между состояниями или удаляется. 5️⃣Проверяем доступность после обновления ARP
ping -c 5 10.0.0.1
Но ping здесь - только финальная проверка. Успешный ICMP сам по себе не говорит, что ARP работает корректно.
Типичный сценарий после замены:
старый сервер
10.0.0.10 → AA:AA:AA:AA:AA:AA
↓ замена
новый сервер
10.0.0.10 → BB:BB:BB:BB:BB:BB
Если где-то ещё осталась старая ARP-запись, трафик может продолжать уходить на AA:AA:AA:AA:AA:AA.
Поэтому после замены сервера полезно проверять не только:
ip addr ip routeно и связку:
IP → ARP/neighbor → MAC → реальный интерфейс
Именно она часто объясняет ситуацию, когда сервер уже заменили, а сеть ещё живёт по старой записи.
N.A.10.10.10.0/24 peer A: AS_PATH 64501 64502 peer B: AS_PATH 64503 64504 64505На первый взгляд BGP должен выбрать A. Но если у маршрута от B выше
LOCAL_PREF, он может стать предпочтительным ещё до того, как длина AS_PATH вообще сыграет роль.
Условно:
A → LOCAL_PREF 100 → AS_PATH 2 B → LOCAL_PREF 200 → AS_PATH 3 BGP выберет B.Это важный момент: BGP ищет не «самый короткий маршрут», а лучший маршрут по последовательности атрибутов. На выбор могут влиять:
LOCAL_PREF
↓
AS_PATH
↓
ORIGIN
↓
MED
↓
eBGP / iBGP
↓
IGP metric
↓
router ID / другие tie-breaker
Поэтому добавление ещё одного AS в путь не обязательно заставит трафик пойти через другого провайдера.
Посмотреть, почему конкретный маршрут победил:
show bgp ipv4 unicast 10.10.10.0/24А в FRRouting удобно смотреть ещё и выбранный best path:
vtysh -c "show bgp ipv4 unicast 10.10.10.0/24"
Именно поэтому при разборе BGP-проблемы вопрос «у какого peer меньше AS_PATH?» часто оказывается слишком ранним.
Сначала нужно понять, какой атрибут сделал маршрут предпочтительнее.
N.A.eth0 → 10.0.0.10/24Приложение выполняет:
curl http://10.0.0.10:8080
Интуитивно кажется, что будет:
application
↓
eth0
↓
switch
↓
eth0
↓
server
Но Linux сначала проверяет destination и видит, что 10.0.0.10 принадлежит самому хосту.
Маршрут будет иметь тип local:
ip route get 10.0.0.10Например:
local 10.0.0.10 dev lo src 10.0.0.10Поэтому физический eth0 в этом обмене вообще не участвует:
application
↓
local routing
↓
lo
↓
local socket
Это важно при диагностике.
Можно поставить:
tcpdump -ni eth0 port 8080
и не увидеть вообще ничего, хотя curl успешно устанавливает соединение.
А вот:
tcpdump -ni lo port 8080покажет этот трафик. Причём это не означает, что
lo - какой-то физический интерфейс. Это отдельный путь local delivery внутри сетевого стека Linux.
Поэтому проверка «пакет дошёл до сервера через его сетевую карту?» иногда вообще поставлена неправильно: если источник и destination находятся на одном хосте, пакет мог никогда не попасть на wire.
N.A.Host A → Who has 10.0.0.10? Host B → 10.0.0.10 is aa:bb:cc:dd:ee:ffНо устройство может само отправить ARP-пакет, не дожидаясь никакого запроса. Это и есть Gratuitous ARP. Например, виртуальный IP переезжает:
до:
10.0.0.10 → aa:aa:aa:aa:aa:aa
после:
10.0.0.10 → bb:bb:bb:bb:bb:bbНовое устройство отправляет объявление:
10.0.0.10 is-at bb:bb:bb:bb:bb:bbСоседи получают его и обновляют ARP-кэш. В результате трафик начинает идти на новый MAC практически сразу - без того, чтобы каждый клиент самостоятельно выполнял ARP lookup. Посмотреть такие объявления:
tcpdump -ni eth0 arp
А текущую таблицу соседей:
ip neigh showЭто особенно важно при: ⏺failover виртуального IP ⏺миграции виртуальной машины ⏺переключении кластера на резервный узел Поэтому после переноса сервиса между хостами может измениться не DNS, не маршрут и не IP-адрес - меняется только MAC, связанный с уже известным IP, и сеть быстро узнаёт об этом через gratuitous ARP. N.A.
NIC → RX ring → driver → kernelНо бесконечной очереди не бывает. Если CPU стабильно обрабатывает, например, 500 тыс. пакетов/с, а приходит 700 тыс.:
500k → 700k → 900k → ...ring постепенно заполняется, после чего начинаются drops. Увеличение ring позволяет накопить больше пакетов:
ethtool -g eth0
ethtool -G eth0 rx 4096
Но если скорость обработки не изменилась, это только отодвинет момент переполнения.
Более того, слишком глубокая очередь может увеличить latency: пакет уже не теряется, но дольше ждёт своей очереди на обработку.
Поэтому при проблемах с сетью важно различать:
packet loss и packet queueingПервое означает, что пакет исчез. Второе, что пакет всё ещё жив, но уже слишком долго ждёт обработки. N.A.
tcpdump нет пакета - легко сделать вывод, что он не пришёл на сервер.
Но между физическим портом и tcpdump находится сама сетевой карта.
У NIC есть собственные RX ring buffers. Драйвер забирает из них дескрипторы и передаёт полученные данные ядру.
При перегрузке очередь может не успеть обработать входящие пакеты:
NIC ↓ RX ring ↓ driver ↓ kernel ↓ tcpdumpЕсли проблема возникает на уровне NIC/driver, пакет может исчезнуть до того, как станет виден обычному packet capture. Поэтому при странных потерях полезно смотреть не только:
ip -s link show eth0
но и аппаратную статистику:
ethtool -S eth0
А размеры RX/TX ring:
ethtool -g eth0
Можно увидеть отдельные counters вроде rx_missed_errors, rx_no_buffer или специфичные для конкретного драйвера drops.
Это важный момент при диагностике: если пакет не попал в tcpdump, это ещё не доказывает, что его не получила сетевая карта.
N.A.aa:bb:cc:dd:ee:01 → eth0 aa:bb:cc:dd:ee:02 → eth1Посмотреть таблицу можно:
bridge fdb showПосле этого кадр для
aa:bb:cc:dd:ee:02 уже не нужно отправлять на все порты - bridge знает, что destination находится за eth1.
Если destination MAC неизвестен, кадр будет flood’иться по подходящим портам. После получения ответа bridge снова обновит FDB.
У записей есть timeout, поэтому старый MAC постепенно исчезает:
bridge fdb show br br0
Особенно интересно это проявляется при миграции VM.
Было:
VM → eth0После миграции:
VM → eth1MAC тот же, но source frames начинают приходить с другого интерфейса. Bridge переучивает запись:
old MAC → eth0
↓
new MAC → eth1
Если MAC начинает постоянно перемещаться между портами, можно получить MAC flapping - и тогда проблема уже не в IP-маршрутизации.
Linux bridge в таком режиме фактически выполняет ту же базовую функцию, что и физический L2-коммутатор: строит таблицу MAC → порт на основании уже увиденного трафика.
N.A.skb
Обычно сетевой пакет проходит довольно длинный путь внутри Linux:
NIC → driver → skb → network stack → socket → applicationНо
skb создаётся не в самом начале.
XDP может выполнить программу прямо на раннем этапе обработки пакета, когда драйвер уже получил его из NIC, но обычный sk_buff ещё не создан.
Поэтому решение можно принять буквально на входе:
NIC ↓ driver ↓ XDP ├── DROP ├── PASS → обычный network stack ├── TX └── REDIRECTНапример, простой XDP-программе достаточно проверить destination IP и сразу отбросить пакет:
SEC("xdp")
int drop_packet(struct xdp_md *ctx)
{
return XDP_DROP;
}
При XDP_DROP пакет вообще не доходит до обычного kernel networking stack.
Это важно под большой нагрузкой: если отбросить ненужный трафик после создания skb, часть работы ядро уже успело выполнить. XDP позволяет перенести фильтрацию значительно раньше.
Проверить, загружена ли XDP-программа:
ip -details link show dev eth0
И посмотреть статистику:
ip -s link show dev eth0
Поэтому «firewall на сервере» - не всегда означает, что пакет сначала проходит весь сетевой стек, а потом его фильтруют. В Linux точка принятия решения может находиться практически сразу после получения кадра сетевой картой.
N.A.ss показывает тысячи соединений, а netstat - другую картину
На одном сервере можно запустить:
ss -antи получить тысячи TCP-соединений, а затем:
netstat -ant
и увидеть совсем другое количество.
Это не обязательно означает, что один из инструментов врёт.
ss работает через современный интерфейс ядра Linux - NETLINK_INET_DIAG.
Ядро отдаёт ему информацию о сокетах напрямую, поэтому ss может получать состояние соединений без перебора /proc и без старого механизма netstat.
netstat из пакета net-tools - устаревший инструмент. Его возможности и способ получения данных отличаются, а часть информации может отображаться иначе.
Особенно заметна разница на серверах с большим количеством ephemeral connections и быстро меняющимся состоянием TCP.
Для диагностики лучше смотреть не просто количество строк:
ss -sа разбивку состояний:
ss -ant | awk 'NR>1 {print $1}' | sort | uniq -c
Например:
ESTAB 18420 TIME-WAIT 7312 SYN-RECV 428И отдельно проверить конкретный listener:
ss -lntp
Важный момент: TIME-WAIT, SYN-RECV, ESTAB и listening sockets - это разные состояния kernel socket state. Поэтому простое сравнение «сколько строк показывает утилита» может давать совершенно разные выводы.
ss сегодня является основным инструментом для анализа TCP/UDP-сокетов в Linux, а netstat в новых системах обычно оставляют только ради совместимости со старыми привычками и скриптами.
N.A.PC ── SW1 ══ SW2 ══ SW3 ── Server
VLAN 30 VLAN 30 VLAN 30
На trunk-портах кадр VLAN 30 идёт с тегом 802.1Q.
Проверка на Linux:
ip -d link show eth0.30
На Cisco:
show interfaces trunk show vlan id 30При этом шлюз VLAN может находиться вообще на другом устройстве:
PC → SW1 → SW2 → SW3 → Router
VLAN 30
Коммутаторы между ними работают только на L2 и не принимают решение о маршрутизации.
Но есть важный нюанс: чем дальше растянут L2-домен, тем больше устройств получают его broadcast и unknown-unicast traffic.
Поэтому проблема иногда выглядит как «сеть внезапно стала шумной», хотя IP-маршрутизация при этом вообще не менялась.
N.A.