9 октября в Москве пройдет СисАдмин 2026 — большая конференция для системных администраторов, ИТ-менеджеров, инженеров и специалистов по поддержке инфраструктуры.
📍 Москва, кластер «Ломоносов»
📅 9 октября 2026
🗣 Офлайн-формат, один день
Участие бесплатное, нужно только зарегистрироваться - sysadminconf.ru
О чем конференция
✔️ Управление рабочими местами на Windows, Linux, macOS;
✔️ MDM/UEM/EMM;
✔️ Администрирование техники Apple;
✔️ Управление ИТ-инфраструктурой и мониторинг;
✔️ Информационная безопасность для системных администраторов;
✔️ Миграция на Linux;
✔️ Организация работы ИТ-отдела и поддержки и многое другое.
📌 СисАдмин 2026 — это более 700 участников, ИТ-выставка, насыщенная программа, неформальное общение и квиз с призами.
Вы можете не только прийти как гость, но и бесплатно выступить с докладом. Для этого оставьте заявку на сайте.
До встречи на СисАдмин 🙌
#реклама
О рекламодателе
📍 Москва, кластер «Ломоносов»
📅 9 октября 2026
🗣 Офлайн-формат, один день
Участие бесплатное, нужно только зарегистрироваться - sysadminconf.ru
О чем конференция
✔️ Управление рабочими местами на Windows, Linux, macOS;
✔️ MDM/UEM/EMM;
✔️ Администрирование техники Apple;
✔️ Управление ИТ-инфраструктурой и мониторинг;
✔️ Информационная безопасность для системных администраторов;
✔️ Миграция на Linux;
✔️ Организация работы ИТ-отдела и поддержки и многое другое.
📌 СисАдмин 2026 — это более 700 участников, ИТ-выставка, насыщенная программа, неформальное общение и квиз с призами.
Вы можете не только прийти как гость, но и бесплатно выступить с докладом. Для этого оставьте заявку на сайте.
До встречи на СисАдмин 🙌
#реклама
О рекламодателе
👍2❤1👎1
MPLS PHP: зачем предпоследний LSR снимает label
В MPLS пакет обычно идет через несколько LSR:
PE1 добавляет label:
На P1 и P2 не нужно заглядывать в IP-заголовок. Они работают по label: смотрят в LFIB, меняют label и отправляют пакет дальше.
Но возникает вопрос: зачем заставлять последний P-router делать ещё одну операцию?
Для этого используется PHP - Penultimate Hop Popping.
P2, то есть предпоследний LSR, заранее знает, что следующий hop — PE2. Вместо обычного swap:
он снимает label полностью:
PE2 получает уже обычный IP-пакет и не тратит ресурсы на удаление последнего MPLS label перед дальнейшей обработкой.
Обычно для этого используется специальный Implicit Null label. Он фактически означает: «на следующем hop label уже не нужен».
Получается такая цепочка:
Почему именно предпоследний, а не последний?
Потому что если последний PE всё равно должен обработать пакет дальше как IP, нет особого смысла сначала передавать ему MPLS label, чтобы он тут же его снял.
PHP переносит эту работу на предыдущий LSR и оставляет PE уже готовый к обычной обработке пакета.
В итоге путь выглядит так:
Именно поэтому в MPLS часто можно увидеть: на предпоследнем LSR label уже исчез, хотя пакет ещё не дошёл до конечного PE.
N.A.
В MPLS пакет обычно идет через несколько LSR:
PE1 → P1 → P2 → PE2
PE1 добавляет label:
IP → [Label 100] → P1 → P2 → PE2
На P1 и P2 не нужно заглядывать в IP-заголовок. Они работают по label: смотрят в LFIB, меняют label и отправляют пакет дальше.
Но возникает вопрос: зачем заставлять последний P-router делать ещё одну операцию?
Для этого используется PHP - Penultimate Hop Popping.
P2, то есть предпоследний LSR, заранее знает, что следующий hop — PE2. Вместо обычного swap:
[Label 100]
↓
[Label 200]
он снимает label полностью:
[Label 100]
↓
IP packet
↓
PE2
PE2 получает уже обычный IP-пакет и не тратит ресурсы на удаление последнего MPLS label перед дальнейшей обработкой.
Обычно для этого используется специальный Implicit Null label. Он фактически означает: «на следующем hop label уже не нужен».
Получается такая цепочка:
PE1 P1 P2 PE2
│ │ │ │
│ Label 100 │ Label 200 │ │
├───────────►├──────────►├───────────►│
│ │ │ IP │
│ │ │ без label │
Почему именно предпоследний, а не последний?
Потому что если последний PE всё равно должен обработать пакет дальше как IP, нет особого смысла сначала передавать ему MPLS label, чтобы он тут же его снял.
PHP переносит эту работу на предыдущий LSR и оставляет PE уже готовый к обычной обработке пакета.
В итоге путь выглядит так:
Ingress PE → Label switching → PHP → Egress PE
Именно поэтому в MPLS часто можно увидеть: на предпоследнем LSR label уже исчез, хотя пакет ещё не дошёл до конечного PE.
N.A.
❤2👍2
DSCP remarking: где пакет может потерять свой приоритет
DSCP хранится прямо в IP-заголовке и используется устройствами сети для выбора очереди и политики обработки.
Например, приложение отправило пакет с:
На первом маршрутизаторе он попал в priority queue.
Но дальше значение может измениться:
Это называется DSCP remarking - устройство переписывает значение DSCP.
Причин может быть несколько.
Например, на границе сети оператор разрешает клиенту использовать только определённые классы:
Или коммутатор доверяет DSCP только на uplink, а на access-портах переписывает его:
Ещё вариант - политика QoS на WAN. Перед отправкой трафика в другой сегмент сеть может изменить маркировку, чтобы она соответствовала локальной QoS-модели.
Важно: изменение DSCP не меняет сам пакет или приложение. Меняется только поле, по которому следующие устройства принимают решения о QoS.
Поэтому при проблемах с приоритетным трафиком недостаточно посмотреть DSCP на сервере:
Это ещё не означает, что приложение отправляло DSCP 0.
Он мог быть изменён где-то по пути:
Если QoS внезапно перестал работать, полезно проверять DSCP на разных участках пути и искать место, где:
Именно там находится политика, которая изменила классификацию пакета.
N.A.
DSCP хранится прямо в IP-заголовке и используется устройствами сети для выбора очереди и политики обработки.
Например, приложение отправило пакет с:
DSCP = EF (46)
На первом маршрутизаторе он попал в priority queue.
Но дальше значение может измениться:
Host
↓
Router 1 DSCP 46
↓
Router 2 DSCP 8
↓
Router 3 DSCP 8
↓
Server
Это называется DSCP remarking - устройство переписывает значение DSCP.
Причин может быть несколько.
Например, на границе сети оператор разрешает клиенту использовать только определённые классы:
DSCP 46 → DSCP 10
DSCP 34 → DSCP 8
остальные → DSCP 0
Или коммутатор доверяет DSCP только на uplink, а на access-портах переписывает его:
PC → Switch
DSCP 46
↓
policy-map
↓
DSCP 0
Ещё вариант - политика QoS на WAN. Перед отправкой трафика в другой сегмент сеть может изменить маркировку, чтобы она соответствовала локальной QoS-модели.
Важно: изменение DSCP не меняет сам пакет или приложение. Меняется только поле, по которому следующие устройства принимают решения о QoS.
Поэтому при проблемах с приоритетным трафиком недостаточно посмотреть DSCP на сервере:
tcpdump → DSCP 0
Это ещё не означает, что приложение отправляло DSCP 0.
Он мог быть изменён где-то по пути:
Host
↓
Access switch
↓
Distribution
↓
WAN router
↓
Provider
↓
Server
Если QoS внезапно перестал работать, полезно проверять DSCP на разных участках пути и искать место, где:
46 → 46 → 46 → 0
↑
remarking
Именно там находится политика, которая изменила классификацию пакета.
N.A.
👍4
Основные причины ошибки «No route to host»
Когда приложение не может подключиться к серверу,
1️⃣ На хосте нет маршрута
Linux должен понимать, через какой интерфейс и gateway отправлять пакет. Проверить конкретный маршрут можно:
Если подходящего маршрута нет, пакет не будет отправлен.
2️⃣ Неправильная маска или gateway
Например, сервер считает адрес назначения локальным из-за неправильной маски и пытается найти его через ARP вместо отправки на маршрутизатор.
Проверить:
3️⃣ Проблема с ARP
Маршрут может существовать, но следующий hop не отвечает на ARP-запросы:
Если рядом с адресом появляется:
хост не смог разрешить IP в MAC.
4️⃣ Firewall возвращает ICMP unreachable
Проверить правила:
5️⃣ Маршрутизатор не знает путь дальше
Ваш сервер может иметь правильный default route, но следующий маршрутизатор не обязан знать, где находится сеть назначения.
Проверить путь:
6️⃣ Обратный маршрут сломан
Пакет может успешно дойти до сервера, но ответ пойдет через другой маршрут или вообще не найдет пути обратно.
На сервере полезно проверить:
Особенно часто это проявляется при нескольких интерфейсах, VRF или policy routing.
7️⃣ Маршрут есть, но интерфейс фактически не работает
Например, в таблице:
но сам
Проверить:
Поэтому
N.A.
Когда приложение не может подключиться к серверу,
No route to host часто ошибочно воспринимают как проблему самого сервера. На деле причина может находиться на любом участке маршрута.Linux должен понимать, через какой интерфейс и gateway отправлять пакет. Проверить конкретный маршрут можно:
ip route get 10.10.20.15
Если подходящего маршрута нет, пакет не будет отправлен.
Например, сервер считает адрес назначения локальным из-за неправильной маски и пытается найти его через ARP вместо отправки на маршрутизатор.
Проверить:
ip addr
ip route
Маршрут может существовать, но следующий hop не отвечает на ARP-запросы:
ip neigh
Если рядом с адресом появляется:
FAILED
INCOMPLETE
хост не смог разрешить IP в MAC.
No route to host не всегда означает, что маршрута действительно нет. Firewall может отправить ICMP Destination Host Unreachable, после чего приложение получит именно такую ошибку.Проверить правила:
sudo nft list ruleset
Ваш сервер может иметь правильный default route, но следующий маршрутизатор не обязан знать, где находится сеть назначения.
Проверить путь:
traceroute -n 10.10.20.15
Пакет может успешно дойти до сервера, но ответ пойдет через другой маршрут или вообще не найдет пути обратно.
На сервере полезно проверить:
ip route get <IP-клиента>
Особенно часто это проявляется при нескольких интерфейсах, VRF или policy routing.
Например, в таблице:
10.10.20.0/24 dev eth1
но сам
eth1 находится в DOWN или физический линк не поднят.Проверить:
ip link show eth1
Поэтому
No route to host лучше читать не как «сервер недоступен», а как «на этом этапе сеть не смогла доставить пакет дальше». Сначала смотрим маршрут, затем next-hop, ARP и уже после этого разбираемся с firewall и удалённым хостом.N.A.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Почему SSL/TLS соединения падают при смене времени
Даже когда сертификаты вроде валидны и сервер доступен, HTTPS-сессии могут обрываться или выдавать ошибки handshake.
Основная причина в том, что TLS строго проверяет время: если системные часы сервера или клиента сильно отстают или опережают реальное время, сертификаты могут считаться просроченными или ещё не действительными.
⏺ Ещё одна частая причина - неправильно настроенный NTP. Без синхронизации часы расходятся, и handshake с клиентом завершается с ошибкой.
Иногда сбои связаны с expired сертификатами, которые дополнительно усугубляют проблему, особенно на новых соединениях.
Как проверить
Проверка синхронизации времени на сетевых устройствах.
Смотрим системное время на сервере.
Анализ TLS handshake и проверки сертификатов.
Проверка часового пояса и синхронизации на Linux.
N.A.
Даже когда сертификаты вроде валидны и сервер доступен, HTTPS-сессии могут обрываться или выдавать ошибки handshake.
Основная причина в том, что TLS строго проверяет время: если системные часы сервера или клиента сильно отстают или опережают реальное время, сертификаты могут считаться просроченными или ещё не действительными.
Иногда сбои связаны с expired сертификатами, которые дополнительно усугубляют проблему, особенно на новых соединениях.
Как проверить
show ntp status
Проверка синхронизации времени на сетевых устройствах.
date
Смотрим системное время на сервере.
openssl s_client -connect <host>:443
Анализ TLS handshake и проверки сертификатов.
timedatectl
Проверка часового пояса и синхронизации на Linux.
show logging | include NTP
N.A.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤2
XDP/eBPF для QoS: приоритизация UDP-трафика в Linux
В реальном времени аудио и видео сильно чувствительны к задержкам и джиттеру.
Даже небольшие перегрузки сети могут испортить VoIP или RTP-поток.
XDP — это точка входа пакета в Linux, прямо в драйвере NIC. eBPF-программа, загруженная в XDP, может:
➖ маркировать пакеты (skb->mark) для последующей обработки tc/qdisc
➖ отбрасывать или редиректить трафик
➖ собирать статистику по IP, портам или протоколам
В связке с tc или iptables можно реализовать приоритизацию UDP-трафика для VoIP/RTP без изменения приложений.
⏺ Например: приоритизация UDP-порта 5004 (RTP) и сбор статистики
Создаём простую eBPF карту для подсчёта пакетов по IP/портам:
struct bpf_map_def SEC("maps") packet_count = {
.type = BPF_MAP_TYPE_HASH,
.key_size = sizeof(struct flow_key),
.value_size = sizeof(__u64),
.max_entries = 1024,
};
В XDP-программе проверяем порт и увеличиваем счётчик:
if (udp->dest == bpf_htons(5004)) {
__u64 *cnt, zero = 0;
cnt = bpf_map_lookup_elem(&packet_count, &key);
if (!cnt)
bpf_map_update_elem(&packet_count, &key, &zero, BPF_NOEXIST);
else
__sync_fetch_and_add(cnt, 1);
skb->mark = 46; // DSCP EF для QoS
}
Загружаем XDP на интерфейс:
ip link set dev eth0 xdp obj rtp_qos.o sec xdp
Проверяем статистику через bpftool:
bpftool map dump id <map_id>
Теперь все RTP-пакеты маркируются для максимального приоритета, а количество пакетов можно отслеживать в реальном времени.
N.A.
В реальном времени аудио и видео сильно чувствительны к задержкам и джиттеру.
Даже небольшие перегрузки сети могут испортить VoIP или RTP-поток.
XDP — это точка входа пакета в Linux, прямо в драйвере NIC. eBPF-программа, загруженная в XDP, может:
В связке с tc или iptables можно реализовать приоритизацию UDP-трафика для VoIP/RTP без изменения приложений.
Создаём простую eBPF карту для подсчёта пакетов по IP/портам:
struct bpf_map_def SEC("maps") packet_count = {
.type = BPF_MAP_TYPE_HASH,
.key_size = sizeof(struct flow_key),
.value_size = sizeof(__u64),
.max_entries = 1024,
};
В XDP-программе проверяем порт и увеличиваем счётчик:
if (udp->dest == bpf_htons(5004)) {
__u64 *cnt, zero = 0;
cnt = bpf_map_lookup_elem(&packet_count, &key);
if (!cnt)
bpf_map_update_elem(&packet_count, &key, &zero, BPF_NOEXIST);
else
__sync_fetch_and_add(cnt, 1);
skb->mark = 46; // DSCP EF для QoS
}
Загружаем XDP на интерфейс:
ip link set dev eth0 xdp obj rtp_qos.o sec xdp
Проверяем статистику через bpftool:
bpftool map dump id <map_id>
Теперь все RTP-пакеты маркируются для максимального приоритета, а количество пакетов можно отслеживать в реальном времени.
N.A.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3👎1
TCP-флаги, которые нельзя блокировать бездумно
Фильтровать TCP-флаги кажется удобным способом усилить firewall: разрешить только «нормальные» пакеты и всё остальное отбросить.
Но некоторые флаги участвуют не только в установлении соединения, и их бездумная блокировка может ломать уже работающие TCP-сессии.
⏺ SYN - установка соединения
Без SYN новый TCP-сеанс просто не начнётся:
Если firewall отбрасывает входящие SYN, сервер не сможет принимать новые TCP-соединения.
⏺ ACK - подтверждение данных
ACK встречается практически во всём нормальном TCP-трафике после установки соединения.
Например:
Правило вида:
может выглядеть логично, но нельзя просто считать отсутствие ACK признаком атаки: SYN-пакет нового соединения как раз приходит без ACK.
Поэтому обычно проверяют состояние соединения через conntrack, а не только наличие флага.
⏺ RST - аварийное закрытие
RST сообщает другой стороне, что TCP-соединение больше не существует.
Например, приложение не слушает порт:
Если firewall блокирует RST без понимания контекста, клиент может вместо быстрого отказа получить долгий timeout.
RST также используется для завершения некоторых некорректных или уже несуществующих соединений.
⏺ FIN - нормальное закрытие
FIN означает: «я больше не буду отправлять данные».
Блокировка FIN может превращать нормальное закрытие соединения в зависание до срабатывания timeout.
⏺ Что делать вместо фильтрации отдельных флагов
Для stateful firewall обычно правильнее разрешать уже установленные соединения:
А новые подключения контролировать отдельно:
То есть проверять не просто «какие TCP-флаги приехали», а в каком состоянии находится соединение.
Особенно опасны универсальные правила вроде:
Они действительно могут отсеивать часть мусорного трафика, но сами по себе не являются полноценной защитой TCP.
N.A.
Фильтровать TCP-флаги кажется удобным способом усилить firewall: разрешить только «нормальные» пакеты и всё остальное отбросить.
Но некоторые флаги участвуют не только в установлении соединения, и их бездумная блокировка может ломать уже работающие TCP-сессии.
Без SYN новый TCP-сеанс просто не начнётся:
Client → SYN → Server
Client ← SYN/ACK ← Server
Client → ACK → Server
Если firewall отбрасывает входящие SYN, сервер не сможет принимать новые TCP-соединения.
ACK встречается практически во всём нормальном TCP-трафике после установки соединения.
Например:
Client → PSH, ACK
Server → ACK
Правило вида:
iptables -A INPUT -p tcp ! --tcp-flags ACK ACK -j DROP
может выглядеть логично, но нельзя просто считать отсутствие ACK признаком атаки: SYN-пакет нового соединения как раз приходит без ACK.
Поэтому обычно проверяют состояние соединения через conntrack, а не только наличие флага.
RST сообщает другой стороне, что TCP-соединение больше не существует.
Например, приложение не слушает порт:
Client → SYN → Server
Client ← RST ← Server
Если firewall блокирует RST без понимания контекста, клиент может вместо быстрого отказа получить долгий timeout.
RST также используется для завершения некоторых некорректных или уже несуществующих соединений.
FIN означает: «я больше не буду отправлять данные».
Client → FIN, ACK
Server → ACK
Server → FIN, ACK
Client → ACK
Блокировка FIN может превращать нормальное закрытие соединения в зависание до срабатывания timeout.
Для stateful firewall обычно правильнее разрешать уже установленные соединения:
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
А новые подключения контролировать отдельно:
iptables -A INPUT -p tcp --dport 22 \
-m conntrack --ctstate NEW -j ACCEPT
То есть проверять не просто «какие TCP-флаги приехали», а в каком состоянии находится соединение.
Особенно опасны универсальные правила вроде:
-p tcp --tcp-flags ALL NONE -j DROP
-p tcp --tcp-flags ALL ALL -j DROP
Они действительно могут отсеивать часть мусорного трафика, но сами по себе не являются полноценной защитой TCP.
N.A.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7👎1
Почему новые соединения идут по старому маршруту
После изменения маршрута можно увидеть странную ситуацию:
Это нормально.
⏺ Маршрут не пересчитывается как отдельное решение для каждого TCP-сеанса
Когда приложение открывает соединение, ядро выбирает маршрут для этого потока. Дальше пакеты существующего соединения обрабатываются с учётом уже созданного состояния.
Поэтому изменение:
не означает, что все уже установленные TCP-соединения мгновенно начнут использовать новый gateway.
⏺ Особенно заметен conntrack
На firewall или NAT устройство хранит состояние соединения:
Там может находиться запись
Это особенно важно при NAT: кроме маршрута существует ещё состояние трансляции адресов и портов.
⏺ Новые соединения уже могут пойти иначе
После изменения маршрута:
может показать новый интерфейс или gateway.
Поэтому одновременно возможна ситуация, когда новые подключения используют новый путь, а старые продолжают работать по прежнему состоянию.
⏺ Почему это важно при переключении каналов
При аварийном переключении WAN недостаточно просто заменить default route.
Старые TCP-сессии могут продолжать использовать прежнее состояние, а NAT/Firewall может дополнительно удерживать их до таймаута.
Из-за этого после failover часто наблюдается:
И это не обязательно означает, что новый маршрут настроен неправильно.
Проверять нужно сразу несколько вещей:
N.A.
После изменения маршрута можно увидеть странную ситуацию:
ip route уже показывает новый путь, но существующее TCP-соединение продолжает работать через старый.Это нормально.
Когда приложение открывает соединение, ядро выбирает маршрут для этого потока. Дальше пакеты существующего соединения обрабатываются с учётом уже созданного состояния.
Поэтому изменение:
ip route replace default via 192.168.1.1
не означает, что все уже установленные TCP-соединения мгновенно начнут использовать новый gateway.
На firewall или NAT устройство хранит состояние соединения:
conntrack -LТам может находиться запись
ESTABLISHED, по которой последующие пакеты распознаются как часть уже существующего потока.Это особенно важно при NAT: кроме маршрута существует ещё состояние трансляции адресов и портов.
После изменения маршрута:
ip route get 8.8.8.8
может показать новый интерфейс или gateway.
Поэтому одновременно возможна ситуация, когда новые подключения используют новый путь, а старые продолжают работать по прежнему состоянию.
При аварийном переключении WAN недостаточно просто заменить default route.
Старые TCP-сессии могут продолжать использовать прежнее состояние, а NAT/Firewall может дополнительно удерживать их до таймаута.
Из-за этого после failover часто наблюдается:
новые подключения → работают
старые подключения → timeout
И это не обязательно означает, что новый маршрут настроен неправильно.
Проверять нужно сразу несколько вещей:
ip route get <destination>
sudo conntrack -L
ss -nt
N.A.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Как проверить, что BGP-маршрут анонсируется, но не используется
Ситуация классическая: префикс в BGP есть, а трафик упорно идёт другим путём.
Почти всегда причина - не в самом анонсе, а в выборе best path или в том, как маршрут попал (или не попал) в RIB/FIB.
1️⃣ Проверяем, что маршрут вообще пришёл по BGP
Сначала убеждаемся, что апстрим реально его отдал.
Cisco:
Важно смотреть:
• есть ли несколько путей
• какой помечен как *> (best)
Если маршрута нет, дальше можно не копать.
2️⃣ Сравниваем BGP vs routing table
Маршрут может быть в BGP, но не установлен в основную таблицу.
Если вместо BGP стоит: static, OSPF или connected, то BGP просто проиграл по административной дистанции.
Смотрим атрибуты best path
Часто маршрут есть, но проигрывает по атрибутам.
Обращаем внимание на:
⏺ Local Preference (самая частая причина)
⏺ AS_PATH (длиннее — хуже)
⏺ MED
⏺ Weight (Cisco)
Даже разница в LocalPref 100 vs 200 полностью меняет путь.
4️⃣ Проверяем policy: route-map / filter
Маршрут может быть принят, но «искажён» политикой.
Иногда route-map не режет маршрут, но меняет LocalPref или MED.
5️⃣ Проверяем CEF / FIB
Бывает, BGP и RIB ок, а в forwarding таблице другое.
Если next-hop не тот, что ожидается — проблема на этапе установки в FIB.
N.A.
Ситуация классическая: префикс в BGP есть, а трафик упорно идёт другим путём.
Почти всегда причина - не в самом анонсе, а в выборе best path или в том, как маршрут попал (или не попал) в RIB/FIB.
Сначала убеждаемся, что апстрим реально его отдал.
Cisco:
show ip bgp <prefix>
Важно смотреть:
• есть ли несколько путей
• какой помечен как *> (best)
Если маршрута нет, дальше можно не копать.
Маршрут может быть в BGP, но не установлен в основную таблицу.
show ip route <prefix>
Если вместо BGP стоит: static, OSPF или connected, то BGP просто проиграл по административной дистанции.
Смотрим атрибуты best path
Часто маршрут есть, но проигрывает по атрибутам.
show ip bgp <prefix>
Обращаем внимание на:
Даже разница в LocalPref 100 vs 200 полностью меняет путь.
Маршрут может быть принят, но «искажён» политикой.
show run | section route-map
show ip bgp neighbors <IP> received-routes
Иногда route-map не режет маршрут, но меняет LocalPref или MED.
Бывает, BGP и RIB ок, а в forwarding таблице другое.
show ip cef <prefix>
Если next-hop не тот, что ожидается — проблема на этапе установки в FIB.
N.A.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2
DROP и REJECT делают одно и то же?
Нет. Оба блокируют трафик, но клиент получает совершенно разный результат.
⏺ DROP просто выбрасывает пакет:
Клиент отправляет SYN, но в ответ ничего не приходит:
TCP будет повторять попытки, пока не истечёт timeout.
⏺ REJECT блокирует соединение и отправляет ответ:
Теперь клиент получает RST и сразу понимает: соединение отвергнуто.
Поэтому поведение приложения будет разным:
DROP → «сервер молчит»
REJECT → «сервер отказал»
Это важно и для диагностики. Если всё дропать, ошибка часто выглядит как
И ещё момент: DROP не делает систему «более защищённой» автоматически. Он просто не сообщает отправителю, что пакет был отвергнут.
N.A.
Нет. Оба блокируют трафик, но клиент получает совершенно разный результат.
iptables -A INPUT -p tcp --dport 22 -j DROP
Клиент отправляет SYN, но в ответ ничего не приходит:
client → SYN → server
client ← ... ← timeout
TCP будет повторять попытки, пока не истечёт timeout.
iptables -A INPUT -p tcp --dport 22 -j REJECT --reject-with tcp-reset
Теперь клиент получает RST и сразу понимает: соединение отвергнуто.
client → SYN → server
client ← RST ← server
Поэтому поведение приложения будет разным:
DROP → «сервер молчит»
REJECT → «сервер отказал»
Это важно и для диагностики. Если всё дропать, ошибка часто выглядит как
timeout, хотя проблема на самом деле в firewall.Для ICMP-трафика REJECT может отправить ICMP unreachable вместо TCP RST.
И ещё момент: DROP не делает систему «более защищённой» автоматически. Он просто не сообщает отправителю, что пакет был отвергнут.
N.A.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8✍1
:: vs 0.0.0.0: почему IPv6-сокет иногда принимает IPv4Запускаешь сервер на
::, смотришь ss и видишь IPv6-сокет:ss -lntp
LISTEN 0 128 [::]:443
Но подключиться к нему можно и по IPv4.
Почему?
Потому что IPv6-сокет с адресом
:: может принимать IPv4-соединения через IPv4-mapped IPv6 addresses.Например:
IPv6: ::ffff:192.0.2.10
IPv4: 192.0.2.10
Поведение зависит от параметра
IPV6_V6ONLY.Проверить системное значение в Linux:
cat /proc/sys/net/ipv6/bindv6only
Если значение
0, dual-stack обычно разрешён:[::]:443
├─ IPv6
└─ IPv4
Если
1, IPv6-сокет принимает только IPv6:[::]:443 → IPv6
0.0.0.0:443 → IPv4
Это может неожиданно влиять на firewall и конфигурацию сервиса.
Например, администратор разрешил порт только в IPv6-конфигурации, увидел
[::]:443 и решил, что IPv4 там не слушается. А приложение фактически принимает оба стека.Проверить реальные сокеты:
ss -lntp
ss -lntp4
ss -lntp6
Формула:
0.0.0.0 → все IPv4-адреса.:: → все IPv6-адреса, а при IPV6_V6ONLY=0 ещё и IPv4 через mapped addresses.Поэтому
:::443 не всегда означает «только IPv6».N.A.
👍6🥰1🤯1
STP topology change: после изменения топологии MAC-адреса забываются быстрее
При изменении топологии STP может сгенерировать Topology Change Notification (TCN). После обработки уведомления коммутаторы временно ускоряют aging динамических MAC-адресов.
Обычный MAC aging может быть, например, 300 секунд.
Но после topology change коммутатор не хочет пять минут доверять старой FDB:
Топология изменилась, и какой-то из этих MAC уже может находиться за другим портом.
Поэтому старые записи начинают удаляться значительно быстрее.
Проверить FDB:
А на Cisco можно посмотреть:
После удаления записи следующий кадр к этому MAC уже не может быть отправлен напрямую.
Коммутатор ещё не знает новый порт и делает unknown unicast flooding.
Получается цепочка:
Именно поэтому после изменения STP-топологии можно увидеть всплеск flooding, хотя сам STP уже сошёлся.
N.A.
STP изменил состояние порта. Почему после этого внезапно вырос flooding?
Причина не только в пересчёте дерева.
При изменении топологии STP может сгенерировать Topology Change Notification (TCN). После обработки уведомления коммутаторы временно ускоряют aging динамических MAC-адресов.
Обычный MAC aging может быть, например, 300 секунд.
Но после topology change коммутатор не хочет пять минут доверять старой FDB:
MAC A → Gi0/1
MAC B → Gi0/2
MAC C → Gi0/3
Топология изменилась, и какой-то из этих MAC уже может находиться за другим портом.
Поэтому старые записи начинают удаляться значительно быстрее.
Проверить FDB:
bridge fdb show
А на Cisco можно посмотреть:
show mac address-table
show spanning-tree detail
После удаления записи следующий кадр к этому MAC уже не может быть отправлен напрямую.
Коммутатор ещё не знает новый порт и делает unknown unicast flooding.
Получается цепочка:
STP topology change
↓
ускоренный aging MAC
↓
старые FDB-записи исчезают
↓
unknown unicast
↓
временный flooding
Именно поэтому после изменения STP-топологии можно увидеть всплеск flooding, хотя сам STP уже сошёлся.
N.A.
❤4
OSPF Full означает, что маршрут уже появился?
Нет.
Состояние
Например:
Но это ещё не гарантирует, что конкретный prefix попадёт в routing table.
Проверяем соседство:
Видим:
Теперь проверяем маршрут:
И его может не быть.
Почему?
OSPF сначала получает информацию о топологии, а потом SPF и другие проверки решают, какие маршруты установить в RIB.
Например, prefix может быть в LSDB:
но не установиться в таблицу из-за:
⏺ недоступного next-hop ⏺ невалидного LSA ⏺ лучшего маршрута из другого источника ⏺ особенностей area / route type ⏺ фильтрации или policy
Поэтому при проблеме нельзя останавливаться на:
Нужно проверить всю цепочку:
N.A.
Состояние
Full говорит только о том, что два OSPF-соседа синхронизировали LSDB.Например:
R1 ─── R2
Full
Но это ещё не гарантирует, что конкретный prefix попадёт в routing table.
Проверяем соседство:
show ip ospf neighbor
Видим:
Neighbor State
10.0.0.2 FULL
Теперь проверяем маршрут:
show ip route 10.10.10.0
И его может не быть.
Почему?
OSPF сначала получает информацию о топологии, а потом SPF и другие проверки решают, какие маршруты установить в RIB.
Например, prefix может быть в LSDB:
show ip ospf database
но не установиться в таблицу из-за:
Поэтому при проблеме нельзя останавливаться на:
OSPF = FULL
Нужно проверить всю цепочку:
Neighbor → LSDB → SPF → RIB
N.A.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
ARP vs NDP: почему IPv6 не использует broadcast
IPv4 и IPv6 должны узнать MAC-адрес соседа. Кажется, что механизм должен быть одинаковым.
Но в IPv4:
Главное отличие:
Поэтому IPv6 не должен будить весь L2-сегмент ради поиска одного соседа.
И это не просто замена ARP на другой пакет. NDP также используется для:
⏺ обнаружения соседей ⏺ проверки доступности ⏺ определения router’ов ⏺ автоматической настройки адресов
N.A.
IPv4 и IPv6 должны узнать MAC-адрес соседа. Кажется, что механизм должен быть одинаковым.
Но в IPv4:
ARP Request → broadcast → ff:ff:ff:ff:ff:ff
В IPv6 ARP вообще нет.
Для этого используется NDP поверх ICMPv6.
Когда узлу нужен MAC соседа, он отправляет Neighbor Solicitation на специальный multicast-адрес, связанный с IPv6-адресом назначения:
ip -6 neigh
Можно увидеть:
fe80::20c:29ff:fe12:3456 dev eth0 lladdr 00:0c:29:12:34:56 REACHABLE
Главное отличие:
ARP → broadcast
NDP → multicast
Поэтому IPv6 не должен будить весь L2-сегмент ради поиска одного соседа.
И это не просто замена ARP на другой пакет. NDP также используется для:
N.A.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2
Почему jumbo frames включили, а производительность не выросла
Jumbo frames это MTU 9000 вместо стандартных 1500. Меньше заголовков на байт данных, меньше прерываний CPU. В теории быстрее, на практике часто никакого эффекта.
⏺ Самая частая причина: один интерфейс или коммутатор на пути со стандартным MTU.
Пакеты фрагментируются или дропаются, выигрыша нет. Jumbo frames работают только если все устройства end-to-end настроены одинаково.
Проверяем что путь реально поддерживает 9000:
8972 это 9000 минус 28 байт заголовков. Если пакет прошёл, путь чистый.
⏺ Вторая причина: приложение шлёт маленькими чанками. Jumbo frames помогают только когда есть что класть в большой пакет. Мелкие запросы останутся мелкими пакетами независимо от MTU.
⏺ Третья: узкое место вообще не в сетевом стеке. Jumbo frames снижают CPU overhead от обработки пакетов, но если bottleneck в диске или логике приложения, результата не будет.
⚡️ Реально помогает в узких сценариях: iSCSI, NFS, HPC, высоконагруженные линки между серверами в одном датацентре. В смешанном трафике через разные устройства эффект минимальный.
N.A
Jumbo frames это MTU 9000 вместо стандартных 1500. Меньше заголовков на байт данных, меньше прерываний CPU. В теории быстрее, на практике часто никакого эффекта.
Пакеты фрагментируются или дропаются, выигрыша нет. Jumbo frames работают только если все устройства end-to-end настроены одинаково.
Проверяем что путь реально поддерживает 9000:
ping -M do -s 8972 <IP>
8972 это 9000 минус 28 байт заголовков. Если пакет прошёл, путь чистый.
mpstat -I ALL 1
ethtool -S eth0 | grep rx_packets
N.A
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2