Troubleshooting — Computer Networks для Junior
База знаний типичных ошибок курса Computer Networks для Junior.
Категория
Симптомы
- Браузер не открывает страницы, любые сетевые запросы фейлятся. Может быть полностью (никакие хосты не доступны) или частично (некоторые сайты работают).
Причина
L1: кабель не подключён, Wi-Fi не сконнектился, физическая поломка адаптера L2: проблема с DHCP -- не получили IP-адрес (видно как 169.254.x.x на Linux/macOS или 0.0.0.0) L3: получили IP, но нет связи с gateway (ping gateway не идёт) L3 routing: есть связь с gateway, но он не пускает дальше (роут до 8.8.8.8 ломается) L4-7: gateway пускает, но DNS не резолвит (ping 8.8.8.8 ок, ping google.com нет) Captive portal в публичном Wi-Fi -- надо открыть browser и пройти auth
Решение
- L1: переподключить кабель, перезайти в Wi-Fi, проверить адаптер sudo ip link set en0 up
- L2: запросить новый IP через DHCP -- sudo dhclient -v eth0 (Linux), sudo ipconfig set en0 DHCP (macOS)
- L3 нет gateway: проверить роуты ip route, добавить default gateway sudo ip route add default via 192.168.1.1
- L3 gateway не отвечает: рестарт router'а, проверить кабели, ARP-таблицу ip neigh
- DNS: попробовать другой resolver -- sudo systemd-resolve --set-dns=8.8.8.8 --interface=eth0 или через /etc/resolv.conf
- Captive portal: открыть neverssl.com или 1.1.1.1 в браузере -- должен показать страницу авторизации
Симптомы
- curl/browser ругаются: 'Could not resolve host: example.com', 'name or service not known', 'NXDOMAIN'. Ping по IP работает, по имени нет.
Причина
Системный resolver сломан или недоступен (/etc/resolv.conf пуст или указывает на dead resolver) DNS-сервер провайдера перегружен или фильтрует домен Домен реально не существует (опечатка, истёк, не зарегистрирован) Локальное переопределение в /etc/hosts указывает на неверный IP DNSSEC validation failure -- запись подписана неверно, валидирующий resolver отказывает VPN изменил resolver, но не пробрасывает запросы корректно Корпоративный DNS блокирует внешние домены или требует VPN
Решение
- Сменить resolver на публичный: добавить nameserver 8.8.8.8 в /etc/resolv.conf (Linux без systemd-resolved)
- Через systemd-resolved: sudo resolvectl dns eth0 8.8.8.8 1.1.1.1
- macOS: System Settings > Network > Wi-Fi > Details > DNS -- добавить 1.1.1.1
- Очистить локальный DNS-кэш: sudo killall -HUP mDNSResponder (macOS), sudo systemd-resolve --flush-caches (Linux)
- Если домен не существует -- проверить регистрацию через whois example.com
- Если DNSSEC fail -- попробовать resolver без DNSSEC валидации, репортить владельцу зоны
- При VPN -- проверить, что VPN client настраивает DNS правильно (split-DNS если нужно)
Симптомы
- Каждое первое открытие сайта занимает 1-2 секунды на резолв, потом быстро. dig example.com показывает Query time: 300 ms.
Причина
DNS-сервер далеко (географически) или перегружен Системный resolver идёт каскадом через несколько узлов (Pi-hole -> upstream -> ...) DNS over HTTPS / DNS over TLS добавляет latency на handshake Local DNS cache (nscd / systemd-resolved) сломан или отключён ISP делает DNS hijacking -- перенаправляет на свой slow resolver Domain имеет очень короткий TTL (5 сек) -- кэш не работает, каждый раз идём заново Загруженный uplink -- DNS-пакет ждёт в очереди
Решение
- Переключиться на быстрый resolver: 1.1.1.1 (Cloudflare), 8.8.8.8 (Google), 9.9.9.9 (Quad9)
- Включить локальный DNS-кэш: systemd-resolved (Linux), dnsmasq, или Unbound в caching mode
- Использовать DoH через Cloudflare WARP / NextDNS -- иногда быстрее plain DNS
- Если ISP делает DNS hijacking -- VPN или DoH спасают
- При очень коротких TTL -- ничего не сделаешь, владелец домена так настроил (часто для health checks)
- Проверить нагрузку на uplink: запустить speedtest во время медленного DNS
Симптомы
- curl: 'SSL: error:1408F10B' или 'SSL routines:ssl3_get_record:wrong version number'. Browser: 'SSL_PROTOCOL_ERROR', 'ERR_SSL_VERSION_OR_CIPHER_MISMATCH'.
Причина
Несовместимые версии TLS -- клиент TLS 1.3, сервер только TLS 1.0/1.1 Нет общих cipher suites между клиентом и сервером Сертификат сервера expired -- браузер отказывается продолжать Сертификат подписан неизвестным CA (self-signed или корпоративный CA) Hostname mismatch -- сертификат на другой домен (SAN не совпадает) SNI не настроен -- сервер отдаёт default cert вместо нужного MITM proxy в инспектирующем режиме режет TLS
Решение
- Если сервер на старом TLS -- попросить admin обновить (TLS 1.0/1.1 deprecated с 2020)
- Обновить клиента: brew upgrade openssl, обновить Python/curl
- Сертификат expired -- ops чинит на сервере (Let's Encrypt auto-renew)
- Self-signed: добавить сертификат в trust store, или curl --cacert /path/to/ca.pem
- Hostname mismatch: использовать правильный hostname или --resolve override
- Проверить, что используется SNI: openssl s_client требует -servername
Симптомы
- Connection refused: сервер ответил мгновенно отказом (TCP RST). Connection timed out: сервер не отвечает вообще, клиент висит 30-120 секунд.
Причина
Refused: на сервере никто не слушает на этом порту, ядро шлёт TCP RST в ответ на SYN Refused: SELinux / AppArmor блокирует bind Timeout: пакет дошёл до фильтра, который тихо дропает (DROP в iptables, default в security groups) Timeout: маршрут до сервера сломан, пакет потерян по пути Timeout: сервер перегружен и не успевает accept Timeout: VPN не пропускает, или firewall в политике DROP (не REJECT)
Решение
- Refused: убедиться, что приложение запущено и слушает на правильном порту/интерфейсе (0.0.0.0 vs 127.0.0.1)
- Refused от 127.0.0.1: приложение биндится только на localhost -- надо bind на 0.0.0.0 для внешнего доступа
- Timeout с firewall: проверить iptables -L (Linux), security groups (AWS), Windows Firewall
- Timeout без firewall: traceroute -T -p 443 example.com -- где обрывается
- Timeout из-за routing: проверить ip route, BGP-announcements у провайдера
- Если timeout из конкретной локации -- может быть geo-blocking; VPN из другой страны проверит
Симптомы
- При старте сервера: 'OSError: [Errno 98] Address already in use', 'EADDRINUSE: address already in use 0.0.0.0:8080'. Сервер не стартует.
Причина
Другой процесс уже слушает на этом порту Предыдущий запуск этого же сервера не завершился (висит как zombie) Соединение в состоянии TIME_WAIT держит порт (после crash или kill без graceful shutdown) Порт зарезервирован системой как ephemeral (если ниже /proc/sys/net/ipv4/ip_local_port_range) Bind на 0.0.0.0:8080 конфликтует с bind на 127.0.0.1:8080
Решение
- Найти и убить процесс: kill <PID> (graceful), kill -9 <PID> (force)
- Если TIME_WAIT: подождать ~60 секунд, или включить SO_REUSEADDR в коде сервера (Python: server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1))
- Сменить порт на свободный (8081, 8082, ...) -- временный workaround
- При Docker: docker ps -- может быть запущен контейнер с -p 8080:8080
- При macOS Sonoma+: AirPlay Receiver использует port 5000, отключить в System Settings
- Долгосрочно: в production добавить SO_REUSEADDR в socket setup
Симптомы
- ping до 8.8.8.8 = 10ms, ping до api.example.com = 500ms. Только до одного сервиса медленно, остальные ок.
Причина
Сервер физически далеко (другой континент) Маршрут через перегруженный или плохой ISP -- traceroute покажет, где скачок BGP-маршрут не оптимален: пакет идёт через далёкий transit Сервер перегружен -- ICMP обрабатывается с задержкой (хотя ICMP должен быть приоритетным) CDN edge для вашего региона не работает, fallback на origin Локальный uplink перегружен -- bufferbloat QoS на промежуточном узле дропает или замедляет ICMP/UDP
Решение
- Если latency = расстояние -- ничего не сделаешь без VPN или edge ближе
- Если плохой hop -- репортить ISP, использовать другого provider
- Если CDN edge не работает -- очистить DNS-кэш, попробовать другой resolver (geoDNS даст ближайший)
- Bufferbloat: настроить SQM (Smart Queue Management) на router'е (CAKE, fq_codel)
- Использовать CDN с anycast (Cloudflare, Fastly) -- меньше зависит от маршрутов
- Для критичных сервисов: дедикейтед канал (AWS Direct Connect, GCP Interconnect)
Симптомы
- ping показывает X% packet loss. TCP-сессии страдают (медленно, иногда RST). Видео-звонки лагают.
Причина
Плохое физическое соединение (старый кабель, помехи на Wi-Fi) Перегруженный uplink -- роутер дропает пакеты, не успевая отправить Дефектный hop по маршруту -- mtr покажет на каком MTU mismatch + ICMP заблокирован -- большие пакеты дропаются молча Wi-Fi rate adaptation -- слабый сигнал = больше retransmits = выглядит как loss Сервер дропает: bufferbloat, rate limiting, DDoS-фильтр Half-duplex mismatch (раритет, но бывает на старых свичах)
Решение
- Wi-Fi: переключиться на 5 GHz или ближе к точке доступа, поменять канал
- Ethernet: проверить кабель (тестер или просто заменить), порты на свиче
- Bufferbloat на uplink: SQM на router'е
- MTU: попробовать ping -M do -s 1472 example.com (MTU 1500 - 28 = 1472); если фейлит, ОС или маршрут роняют MTU
- Если loss только в одной AS -- репортить ISP
- Большие потери на сервере: смотреть в логи rate limiting, DDoS-защиту
Симптомы
- Странные SSL-warning'и (cert не от того CA), трафик идёт через неизвестный gateway, дублирующиеся MAC-адреса в ARP-таблице, MITM-detection алерт.
Причина
Атакующий шлёт gratuitous ARP, ассоциируя свой MAC с IP gateway Атакующий шлёт ARP-ответы 'IP жертвы = мой MAC', перехватывая обратный трафик Неисправный сетевой адаптер шлёт мусорные ARP Дубликат IP в сети -- два хоста считают, что IP их Тест от security team / red team Mobile device с broken NetworkManager в hotspot mode
Решение
- Сразу: отключиться от untrusted Wi-Fi, перейти на VPN или mobile data
- Long-term defense: статические ARP-записи для gateway -- ip neigh add 192.168.1.1 lladdr aa:bb:cc:dd:ee:ff dev eth0
- На enterprise switch: включить DAI (Dynamic ARP Inspection) и DHCP snooping
- Использовать VPN с end-to-end шифрованием -- даже при ARP poisoning контент защищён TLS
- Запустить arpwatch для долгосрочного мониторинга изменений
- В корпоративной сети репортить security team -- может быть инсайдер или взломанный host
Симптомы
- После подключения к сети нет IP-адреса, или получили link-local 169.254.0.0/16 (APIPA). ip addr show показывает inet 169.254.x.x.
Причина
DHCP-сервер недоступен или не отвечает (broadcast не дошёл) DHCP-сервер исчерпал pool адресов MAC-filtering на DHCP-сервере -- ваш MAC не в whitelist Wi-Fi подключился к сети, но без auth/captive portal Сетевой адаптер сломан или драйвер криво загрузился Слишком жёсткий timeout DHCP-клиента (особенно при гибридных Wi-Fi) VLAN mismatch -- порт настроен на untagged VLAN, в котором нет DHCP
Решение
- Force renewal: sudo dhclient -v eth0 или sudo ipconfig set en0 DHCP
- Перезагрузить сетевой стек: sudo systemctl restart NetworkManager (Linux), wifi off/on (macOS)
- Wi-Fi: отключиться, забыть сеть, переподключиться (часто из-за protected/auth state)
- Если есть admin доступ к router: проверить DHCP pool, освободить leases
- Временный workaround: ручной static IP в той же подсети -- но только если знаете свободный
- MAC filtering: добавить MAC в whitelist или сменить MAC: sudo ip link set eth0 address aa:bb:cc:dd:ee:ff
Симптомы
- example.com не открывается, google.com и yandex.ru работают. Curl или browser виснут или возвращают timeout/refused.
Причина
Сайт реально лежит (down, проверь downforeveryoneorjustme.com) DNS-резолв даёт неверный IP -- DNS cache, /etc/hosts override, geo-routing fail ISP блокирует сайт по требованию регулятора Cloudflare/CDN считает вас ботом (после VPN или massive requests) -- 1020 Access Denied Firewall на вашей стороне блокирует destination IP/range Сайт переехал на новый IP, у вас старая DNS-запись BGP-проблема -- маршрут до AS сайта обрывается
Решение
- DNS cache: sudo killall -HUP mDNSResponder (macOS), sudo resolvectl flush-caches (Linux)
- Сменить resolver: dig @8.8.8.8 example.com -- если резолвится, проблема в resolver'е
- Если IP отдаёт правильный, но не reachable -- проверить firewall: iptables -L (Linux), sudo pfctl -s rules (macOS)
- ISP block: VPN из другой страны проверит -- если работает, это блокировка
- Cloudflare 1020: подождать, очистить cookies, отключить VPN -- через 24 часа разблочат
- Если сайт down -- ждать, репортить владельцам, проверять @site_status в Twitter
Симптомы
- Сервер отвечает 502 Bad Gateway или 504 Gateway Timeout. NGINX/HAProxy/CloudFront показывает свою error page.
Причина
502: backend ответил невалидным HTTP, или соединение оборвалось (TCP RST / FIN до ответа) 502: backend crash во время обработки запроса 504: backend не успел ответить за configured timeout (например, NGINX proxy_read_timeout = 60s) 504: backend overloaded -- очередь запросов, не успевает Long-running query в БД -- backend ждёт DB, proxy ждёт backend, всё timeout Связь между proxy и backend сломана -- VPC routing, security group, network split TLS между proxy и backend -- если backend требует HTTPS, а proxy шлёт plain
Решение
- 502: чинить backend -- crash, segfault, restart
- 504: увеличить timeout на proxy (NGINX proxy_read_timeout, ALB idle_timeout) ИЛИ оптимизировать backend
- Long DB query: оптимизировать запрос, добавить индексы, async-обработка с polling
- Backend overload: горизонтально масштабироваться (больше pods/instances), включить autoscaling
- Network split: проверить, что backend reachable с proxy -- curl с proxy-машины
- TLS mismatch: настроить proxy_pass на правильную схему (http:// vs https://)
- Если 502/504 нестабильно -- circuit breaker на proxy и retry с jitter
Симптомы
- Browser console: 'Access to fetch at https://api.example.com/data from origin https://app.example.com has been blocked by CORS policy: No Access-Control-Allow-Origin header'. Запрос в Network видим, ответ 200 -- но JS не может прочитать.
Причина
Сервер не возвращает Access-Control-Allow-Origin или возвращает другой origin Preflight (OPTIONS) запрос не возвращает корректные headers (Access-Control-Allow-Methods, Headers) Используется credentials (cookies) -- сервер не вернул Access-Control-Allow-Credentials: true Wildcard Allow-Origin: * не сочетается с credentials -- надо точный origin В CORS-headers неверный case или typo Proxy/CDN срезает CORS-headers по пути Production-only баг: на dev origin localhost:3000 в whitelist, production app.com нет
Решение
- Сервер: добавить header Access-Control-Allow-Origin: https://app.example.com (точный или валидный domain)
- Сервер: обработать OPTIONS preflight -- вернуть 204 с Access-Control-Allow-Methods и Headers
- С cookies: Access-Control-Allow-Origin не может быть *; нужен точный origin + Allow-Credentials: true; и withCredentials: true в fetch
- Если домены разные (api.example.com и app.example.com) -- настроить CORS-policy explicitly
- Workaround на dev: запустить browser с --disable-web-security (только для дебага)
- Лучше -- использовать reverse proxy: app.example.com/api/* -> api.example.com -- same origin, CORS не нужен
Симптомы
- Curl: 'curl: (56) Recv failure: Connection reset by peer'. Приложение: 'ECONNRESET'. Запрос идёт, потом обрывается.
Причина
Сервер послал TCP RST -- например, после crash, kill -9, или явного reset(2) Firewall в середине пути послал RST для разрыва сессии (stateful inspection) Сервер закрыл соединение по timeout, но клиент пытался писать -- получил RST Idle timeout на load balancer (NGINX upstream_keepalive_timeout, AWS ALB idle_timeout по умолчанию 60s) OOM killer убил backend-процесс MTU mismatch с PMTUD не работает -- packet drop, потом timeout, потом RST Application layer: сервер обнаружил malformed запрос и сбросил соединение
Решение
- Если RST после длительного idle -- настроить TCP keep-alive: net.ipv4.tcp_keepalive_time = 60
- На LB: увеличить idle_timeout, или клиент должен слать keep-alive часто
- OOM: добавить memory limits в systemd unit или Kubernetes, увеличить swap
- Сервер crash: чинить root cause -- логи, sentry, ASAN
- Stateful firewall: проверить session table; иногда нужно увеличить timeout
- Application-level: ловить ECONNRESET, retry с backoff (для idempotent запросов)
Симптомы
- На одном интерфейсе интернет, на другом нет. Часто после смены кабеля, реконфигурации, апдейта macOS/Linux.
Причина
Метрики routes: оба интерфейса имеют default gateway, но с разным приоритетом -- система использует один Один интерфейс получил IP, другой нет (DHCP fail) DNS-серверы прописались только на одном интерфейсе Кабель Ethernet сдох, или порт на свиче деактивирован macOS Service Order не пускает Ethernet (System Settings > Network > ... > Set Service Order) VLAN tagging требуется на Ethernet, на Wi-Fi нет VPN -- только один интерфейс в split tunneling
Решение
- Linux: настроить metric для routes -- меньше metric = выше приоритет; sudo ip route change default via 192.168.1.1 dev eth0 metric 100
- macOS: System Settings > Network > ... > выбрать интерфейс > Set Service Order сверху вниз по приоритету
- Force использовать интерфейс: sudo route delete default; sudo route add default 192.168.1.1 -ifscope en0
- Ethernet порт мёртв -- физически проверить link LED, ethtool eth0 покажет 'Link detected: yes/no'
- VLAN: настроить VLAN-интерфейс на Ethernet (vconfig add eth0 100)
- На время дебага можно отключить ненужный интерфейс: sudo ip link set wlan0 down
Симптомы
- VPN client показывает Connected. Public интернет работает. Но internal-сервисы (10.0.0.0/8 диапазон) недоступны. Или наоборот: internal ок, наружу нет.
Причина
Split tunneling: VPN роутит только internal, остальное напрямую (или наоборот) Маршрут до internal-подсети не добавлен в routing table после VPN-up DNS не пробрасывается через VPN -- internal-имена не резолвятся Конфликт IP-диапазона: ваша local-сеть 10.0.0.0/24, internal тоже 10.0.0.0/24 -- маршруты ломаются Firewall на стороне корпоративной сети не пускает ваш source IP (assigned VPN client IP) MTU слишком большой -- internal-сервис не отвечает на большие пакеты
Решение
- Добавить маршрут вручную: sudo ip route add 10.0.0.0/8 dev tun0
- DNS: добавить internal-resolver в /etc/resolv.conf или systemd-resolved override
- Конфликт IP: сменить local subnet (192.168.42.0/24 вместо 10.x); или корпорация даёт другой client IP range
- Split tunneling: проверить настройки VPN client -- 'Send all traffic over VPN' или 'Only specific subnets'
- MTU: настроить tun-interface на меньший MTU (1400 типично): sudo ip link set dev tun0 mtu 1400
- Если firewall блочит: запросить ops -- какой source IP whitelist'ить, обычно VPN client pool
Симптомы
- После включения DoH в браузере или системе -- часть сайтов не открывается, internal-домены не резолвятся, медленно работает.
Причина
DoH идёт мимо корпоративного split-DNS -- internal-домены не резолвятся DoH-провайдер блокирует домены (Quad9 фильтрует malware -- может зацепить и false positive) Корпоративный firewall блокирует подключение к DoH-серверам DoH-сервер медленный или недоступен -- timeout каждого запроса Browser использует DoH, ОС нет -- разнобой между ними DoH не следует /etc/hosts override
Решение
- Для internal-доменов настроить split-DoH: корпоративные домены через internal resolver, остальное -- DoH
- Browser: в Firefox network.trr.excluded-domains -- список доменов, для которых не использовать DoH
- Сменить DoH-провайдера: Cloudflare, Google, Quad9, NextDNS -- разная фильтрация
- Корпоративная сеть может вообще запрещать DoH -- использовать system DNS как обычно
- Если медленно -- использовать DNSCrypt, или вернуться к plain DNS
- Проверить, что у ОС и browser один и тот же resolver -- избегать рассогласования
Симптомы
- Некоторые сайты работают медленно или не работают совсем (только IPv6, fallback на v4 не успевает). Некоторые приложения timeout на резолве AAAA.
Причина
ISP даёт IPv6, но маршрутизация в часть интернета сломана (broken IPv6) Браузер сначала пробует IPv6 (Happy Eyeballs), timeout -- потом IPv4 -- видим как delay DNS возвращает AAAA, но v6 не работает -- timeout, fallback на A Local firewall блокирует IPv6 outbound по умолчанию VPN не поддерживает IPv6 -- утечка через v6 в обход VPN, либо v6 полностью off MTU mismatch: IPv6 не фрагментирует на роутерах, нужен PMTUD router'у не настроены RA (Router Advertisement)
Решение
- Если v6 broken: отключить на интерфейсе: sudo sysctl net.ipv6.conf.eth0.disable_ipv6=1
- Force IPv4 в приложениях: в Python socket.AF_INET, в curl -4
- Включить Happy Eyeballs v2 (RFC 8305) -- быстрее fallback, < 250ms timeout
- MTU: настроить меньший MTU на роутере (1280 -- минимум для IPv6)
- VPN: убедиться, что v6 либо полностью off, либо tunneled (иначе утечка реального IPv6 -- privacy leak)
- Проверять провайдера: репортить broken v6, попросить native IPv6 или 6rd tunnel
Симптомы
- Маленькие запросы (ping, простой GET) работают. Большие (POST с body, скачивание файла) виснут или timeout. Часто на VPN, GRE, IPsec.
Причина
Туннель добавляет overhead (IPsec ~50 байт, GRE ~24, WireGuard ~60), эффективный MTU меньше 1500 Промежуточный роутер режет пакет, но ICMP 'Fragmentation Needed' блокирован firewall'ом DF (Don't Fragment) bit стоит, фрагментация запрещена -- пакет дропается молча В IPv6 фрагментация только на отправителе -- если PMTUD сломан, обрыв TCP MSS Clamping не настроен на роутере -- большие сегменты не режутся под MTU
Решение
- Установить меньший MTU на интерфейсе: sudo ip link set dev tun0 mtu 1380
- Включить TCP MSS clamping на роутере: iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
- Разрешить ICMP Fragmentation Needed (type 3 code 4) в firewall'е -- никогда не блочить
- Для WireGuard: установить MTU 1380 (или 1280 для conservative)
- Если ничего не помогает -- отключить DF bit (но это плохо для производительности)
- Сначала чинить ICMP -- PMTUD должен работать; меньший MTU -- workaround
Симптомы
- В Wireshark или tcpdump видно много '[TCP Retransmission]', '[TCP Dup ACK]'. Throughput низкий несмотря на хороший link.
Причина
Реальные потери пакетов -- сетевая проблема, см. packet-loss Out-of-order delivery -- асимметричный routing, разные пути для пакетов Receiver окно нулевое -- получатель медленно читает (backpressure) Spurious retransmissions: ACK задержался, отправитель решил, что потеря, повторил Wi-Fi: retransmits на L2 не видны TCP, но increase RTT, заставляют RTO срабатывать Bad NIC driver: дропает пакеты при заполнении ring buffer TSO/GSO/GRO offloading сломан -- крупные сегменты теряются, ретрансмит мелкими
Решение
- Чинить root cause loss -- кабель, Wi-Fi сигнал, перегруженный hop
- Disable TSO/GSO/GRO для теста: sudo ethtool -K eth0 tso off gso off gro off
- На сервере при backpressure: увеличить receive buffer; в приложении быстрее читать из socket
- Сменить congestion control algorithm: sudo sysctl net.ipv4.tcp_congestion_control=bbr (вместо cubic)
- Увеличить TCP buffers: net.core.rmem_max, net.ipv4.tcp_rmem
- Если spurious -- настроить RTO min/max, включить F-RTO (RFC 5682)
Симптомы
- Wireshark запускается, но в списке интерфейсов пусто. Или интерфейсы есть, но при capture показывает 0 packets. На Linux/macOS.
Причина
Wireshark запущен без root / прав на capture (нет CAP_NET_RAW) На Linux не настроен setuid на dumpcap, или не в группе wireshark macOS: ChmodBPF не установлен (ставится при инсталляции Wireshark, но иногда сбрасывается) Capture фильтр слишком жёсткий и режет всё Promiscuous mode не работает (не у каждого NIC можно включить) Запись с loopback на macOS требует специального BPF На Wi-Fi видны только свои пакеты в managed mode -- для монитора нужен monitor mode
Решение
- Linux: добавить себя в группу wireshark: sudo usermod -aG wireshark $USER (нужен relogin)
- Linux: дать capabilities dumpcap: sudo setcap cap_net_raw,cap_net_admin+eip /usr/bin/dumpcap
- macOS: переустановить Wireshark с brew install --cask wireshark; запустить /Applications/Wireshark.app/Contents/Resources/Extras/Install\ ChmodBPF.pkg
- Удалить capture фильтр -- начать с пустого фильтра, потом сужать
- Wi-Fi monitor mode: на macOS airport sniff <channel>, на Linux iw dev wlan0 set type monitor
- Loopback на macOS: использовать интерфейс 'Loopback: lo0' если есть
Симптомы
- traceroute example.com: первые 3-4 hop'а показывают IP, потом N звёздочек, потом снова IP последнего hop'а.
Причина
Промежуточный роутер не отвечает на ICMP Time Exceeded (отключено или rate-limit) Роутер отвечает, но ICMP заблокирован firewall'ом на обратном пути Routing асимметричен -- ответ идёт другим путём через другие роутеры MPLS-сегмент: роутеры внутри MPLS-cloud не дегенерируют TTL (или дегенерируют только в edges) Великий китайский firewall и подобные: дропают часть ICMP traceroute использует UDP/порт 33434+ -- может быть блокирован, попробуй -T или -I Антифрод-системы у крупных сервисов (Cloudflare) могут rate-limit ICMP
Решение
- Звёздочки сами по себе НЕ значат разрыв -- если последний hop достигнут, всё ок
- Если последний hop в звёздочках -- destination недостижим
- Попробовать -T (TCP) или -I (ICMP) вместо UDP
- Если по UDP-портам блочат, по TCP/443 обычно проходит лучше
- Если хочется точную картину -- mtr с большим количеством циклов даёт стабильную статистику
- Принять как есть: privacy/security соображения у админов часть hop'ов скрывают
Симптомы
- ping/curl выдаёт 'Network is unreachable' или 'No route to host' или 'Destination Host Unreachable'.
Причина
'Network unreachable': в routing table нет маршрута до целевой подсети (даже default gateway не помогает) 'No route to host': есть маршрут, но gateway не знает, как добраться (ARP не разрешает) 'Host unreachable' от ICMP: роутер по пути не может доставить (нет маршрута дальше) Default gateway упал -- маршрут есть, но gateway не отвечает VPN отключился и удалил маршруты, остались только локальные Конфликт routes -- более специфичный (longer prefix) с неработающим next-hop
Решение
- 'Network unreachable' -- добавить default route: sudo ip route add default via 192.168.1.1
- 'No route to host' -- проверить ARP, очистить: sudo ip neigh flush all; перезапустить интерфейс
- Gateway упал -- рестарт роутера, проверить кабели
- VPN dropped routes -- переподключиться, или вручную добавить: sudo ip route add 10.0.0.0/8 dev tun0
- Конфликт routes -- удалить лишний: sudo ip route del 10.0.0.0/8 via <broken-gateway>
- Если ничего не помогает -- ip route show table all (видит маршруты в других таблицах), и rule list
Симптомы
- curl: 'SSL certificate problem: self signed certificate'. Browser: 'NET::ERR_CERT_AUTHORITY_INVALID', 'Your connection is not private'. Python requests: 'SSLError: CERTIFICATE_VERIFY_FAILED'.
Причина
Сервер использует самоподписанный сертификат (typical для internal/staging) Сертификат подписан корпоративной CA, не входящей в системный trust store Истёкший сертификат сертификата (corner case -- CA expired) MITM-proxy в инспектирующем режиме подменяет cert Сертификат signed корректно, но trust chain broken (intermediate CA не отдаётся сервером)
Решение
- Добавить cert в системный trust store (Linux): sudo cp cert.pem /usr/local/share/ca-certificates/myca.crt && sudo update-ca-certificates
- macOS: sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain cert.pem
- Python -- использовать truststore (3.10+): pip install truststore && truststore.inject_into_ssl()
- Per-request override в curl: curl --cacert /path/to/ca.pem; в requests: verify='/path/to/ca.pem'
- Никогда в prod, только дебаг: curl -k или verify=False -- отключает защиту полностью
- Если broken chain -- ops чинит на сервере: настроить full chain (server cert + intermediate)
Симптомы
- curl example.com висит, ничего не выводит, не таймаутит самостоятельно (или таймаутит через 120+ сек).
Причина
Сервер ответил, но не закрывает соединение -- ждёт ещё запроса (HTTP keep-alive) Connect ok, но сервер не отвечает на HTTP-запрос (overloaded, ждёт DB) Файрвол дропает пакеты тихо (DROP, не REJECT) Сервер -- streaming endpoint -- надо ждать или прервать вручную DNS-резолв висит (системный resolver сломан) На сервере backend получил запрос и ушёл в бесконечный loop
Решение
- Всегда ставить --connect-timeout и --max-time: curl --connect-timeout 10 --max-time 60 https://example.com
- Если streaming endpoint -- использовать -N (--no-buffer) и просто остановить через Ctrl+C
- DNS висит -- сменить resolver: curl --resolve example.com:443:1.2.3.4 https://example.com
- Если ждёт keep-alive -- HTTP 1.0 не использует: curl --http1.0 https://example.com
- При длинном backend processing -- увеличить max-time или async-обработка с polling
- Сравнить с другого host'а -- если там работает, проблема в локальной сети
Симптомы
- Внезапно теряется сеть, потом восстанавливается. arp -an показывает несколько MAC за одним IP. ОС выводит 'duplicate IP detected'.
Причина
Два host'а получили один static IP DHCP-сервер выдал IP, который уже занят (static на другом host'е) DHCP-leases не синхронизированы между несколькими серверами Сетевой адаптер с broken DAD (Duplicate Address Detection) Network bridge неправильно настроен -- один IP виден через два пути ARP spoofing атака
Решение
- Сменить IP на одном из конфликтующих host'ов
- В DHCP-сервере: добавить IP в exclude-list, чтобы не выдавался
- Если несколько DHCP-серверов -- настроить failover/sharing pool, или оставить один
- На сетевом порту: limit MAC addresses (port security) -- предотвращает spoofing
- Включить arping -D в скрипте startup сервиса -- проверять перед bind
- Если ARP spoofing -- см. arp-poisoning-suspicion
Симптомы
- Link 1 Gbps, но iperf3 показывает 50 Mbps. scp медленный. При этом ping ок, loss нет.
Причина
Маленькие TCP buffers -- BDP (bandwidth-delay product) больше window size Default congestion control (cubic) не оптимален для long-fat networks TCP window scaling не работает (старый сервер или мидл-боксы) Высокий latency без масштабирования окна -- 1 RTT cap на propagation Single-thread bottleneck -- TCP делит ресурсы между стримами; одиночный stream не насыщает Запросы маленькие -- много syscalls и context switches убивают throughput
Решение
- Включить BBR (вместо cubic): sudo sysctl net.ipv4.tcp_congestion_control=bbr
- Увеличить TCP buffers: net.ipv4.tcp_rmem = '4096 87380 16777216', net.core.rmem_max = 16777216
- Использовать параллельные стримы (-P в iperf3, --transfers в rsync)
- Включить TCP window scaling: sudo sysctl net.ipv4.tcp_window_scaling=1
- Если приложение -- batch syscalls (sendfile, splice, io_uring)
- Jumbo frames (MTU 9000) если все hop'ы поддерживают -- меньше overhead