Лестница стека: где именно сломалось
Прежде чем стрелять командами, договоримся о порядке. Сеть - это слои, и проблема всегда живёт на каком-то одном. Снизу вверх:
- Линк - есть ли вообще соединение? Wi-Fi подключился, кабель воткнут, интерфейс поднят.
- IP-адрес - выдал ли DHCP адрес, не словил ли ты self-assigned 169.254.x.x (верный признак, что DHCP не ответил).
- Шлюз и маршрут - видишь ли ты роутер, уходит ли трафик наружу.
- DNS - резолвятся ли имена в адреса. Это место, где "интернета нет", хотя по IP всё пингуется.
- Приложение - порт, прокси, TLS, конкретный сервис.
Быстрый снимок состояния даёт scutil - это интерфейс к динамическому store конфигурации macOS (тот самый configd, который рулит сетью). Он знает текущий первичный сервис, DNS и прокси без всякого копания в Системных настройках:
Код: Выделить всё
# какой интерфейс сейчас "главный" (через что идёт трафик в интернет)
scutil --nwi
# действующие DNS-резолверы - то, что система реально использует
scutil --dns
# настройки прокси (привет, корпоративный PAC-файл)
scutil --proxy
Код: Выделить всё
DNS configuration
resolver #1
search domain[0] : lan
nameserver[0] : 192.168.1.1
flags : Request A records, Request AAAA records
reach : 0x00020002 (Reachable,Directly Reachable Address)

ping, traceroute и DNS-резолв руками
Базовая связность - это ping на Mac. Но пингуй с умом: сначала по IP, потом по имени. Разница в одну букву экономит диагноз.
Код: Выделить всё
# 1. жив ли вообще путь наружу - пингуем по IP, минуя DNS
ping -c 4 1.1.1.1
# 2. работает ли резолв имён - то же самое, но по домену
ping -c 4 cyberlake.ru
Код: Выделить всё
64 bytes from 1.1.1.1: icmp_seq=0 ttl=57 time=12.418 ms
...
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 12.418/14.002/16.310/1.503 ms
traceroute на Mac показывает маршрут по хопам - где именно трафик застревает:
Код: Выделить всё
traceroute -n cyberlake.ru
Код: Выделить всё
1 192.168.1.1 1.204 ms 1.110 ms 1.087 ms
2 10.0.0.1 8.901 ms 9.122 ms 8.880 ms
3 * * *
4 185.12.34.1 14.5 ms 14.1 ms 13.9 ms
Для резолва имён прицельно есть dig (из пакета bind, идёт в системе) и nslookup. dig точнее и показывает всю кухню:
Код: Выделить всё
dig cyberlake.ru +short # просто адрес, без шелухи
dig @1.1.1.1 cyberlake.ru # спросить конкретный сервер в обход системного
dig cyberlake.ru MX # почтовые записи
mtr, проверка портов через nc и кто занял порт
traceroute - это снимок, а сеть дышит. mtr (My TraceRoute) совмещает ping и traceroute и крутит их в реальном времени, показывая потери по каждому хопу. В системе его нет, ставим через Homebrew (на Apple Silicon он ляжет в /opt/homebrew):
Код: Выделить всё
brew install mtr
sudo mtr -n cyberlake.ru # нужен root для raw-сокетов
Проверка портов - это nc (netcat), в системе из коробки. Классика "хост слушает порт или нет":
Код: Выделить всё
# -z только сканирует (zero-I/O), -v подробно, -G таймаут коннекта 5 сек
nc -zv -G 5 cyberlake.ru 443
Код: Выделить всё
Connection to cyberlake.ru port 443 [tcp/https] succeeded!
Теперь зеркальная задача - проверка занятых портов локально на самом Mac. Кто-то уже сидит на 8080, и твой dev-сервер не стартует. lsof -i (list open files, а сокеты в Unix - тоже файлы):
Код: Выделить всё
# кто слушает конкретный порт
sudo lsof -nP -i :8080
# все слушающие TCP-порты разом
sudo lsof -nP -iTCP -sTCP:LISTEN
Код: Выделить всё
COMMAND PID USER FD TYPE DEVICE NODE NAME
node 47218 khovanskiy 23u IPv4 ... TCP *:8080 (LISTEN)
Wi-Fi не работает на Mac: wdutil и Wireless Diagnostics
Отдельный фронт - когда Wi-Fi не работает на Mac или работает отвратительно. Тут шкала сигнала врёт, и нужны цифры. Самый быстрый путь: зажми Option (Alt) и кликни по иконке Wi-Fi в меню-баре - откроется расширенная панель с реальными параметрами: RSSI, Noise, Tx Rate, канал и его ширину. Оттуда же запускается приложение Беспроводная диагностика (Wireless Diagnostics). А если зажать Option и удерживать при клике - в меню появится пункт "Открыть Беспроводную диагностику".
Но мы за CLI. Старый добрый airport устарел и выпилен, ему на замену пришёл wdutil. Команда wdutil info - это снимок всего радио-окружения, и info, в отличие от остальных подкоманд, работает даже без sudo (хотя под sudo вывод полнее и не маскирует MAC/SSID):
Код: Выделить всё
sudo wdutil info
Код: Выделить всё
NETWORK
SSID : MyHomeWiFi
BSSID : a1:b2:c3:d4:e5:f6
Channel : 6g149/160
RSSI : -52 dBm
Noise : -92 dBm
Tx Rate : 1200.0 Mbps
PHY Mode : 11ax
MCS Index : 11
- RSSI (уровень сигнала) в дБм: -52 отлично, -67 рабочий минимум, ниже -75 уже боль. Чем ближе к нулю - тем лучше.
- Noise (шум): -92 нормально. Считай SNR = RSSI минус Noise. -52 минус (-92) = 40 дБ, отличный запас. Если SNR падает ниже 20 дБ - скорость рухнет, даже когда "палочек" полно.
- Channel: 6g149 значит диапазон 6 ГГц (Wi-Fi 6E), канал 149. 2g - это 2.4 ГГц, забитый микроволновками и соседями. Если ты на 2g при наличии 5/6 ГГц - вот причина тормозов.
- Tx Rate: фактическая канальная скорость. Резко просела при том же RSSI - помехи или переключение на узкий канал.
Перехват трафика и сброс DNS-кэша
Когда верхние ступени не дали ответа, спускаешься смотреть пакеты глазами. tcpdump на Mac есть из коробки и работает на raw-сокетах, поэтому нужен sudo. Базовый рецепт - слушать конкретный хост на конкретном интерфейсе:
Код: Выделить всё
# en0 - Wi-Fi; -n не резолвить; port 443 - только HTTPS-трафик
sudo tcpdump -ni en0 host cyberlake.ru and port 443
Код: Выделить всё
14:22:01.337 IP 192.168.1.50.51324 > 185.12.34.1.443: Flags [S], seq 91...
14:22:01.349 IP 185.12.34.1.443 > 192.168.1.50.51324: Flags [S.], seq 12...
14:22:01.349 IP 192.168.1.50.51324 > 185.12.34.1.443: Flags [.], ack 1
Отдельная частая болячка - DNS-кэш. Старый IP закэшировался, сайт переехал, а Mac упорно лезет на мёртвый адрес. Сброс DNS-кэша на актуальных macOS (Sonoma, Sequoia, Tahoe) - это две команды одной строкой:
Код: Выделить всё
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
mDNSResponder заодно отвечает за Bonjour и зону .local - это локальное обнаружение устройств (принтеры, AirPlay, ssh user@macbook.local). Если .local-имена резолвятся через раз, виноват обычно mDNSResponder или multicast, который режет точка доступа с включённой клиент-изоляцией. Тот же HUP его и лечит. Не дёргай эти команды профилактически "на всякий случай" - кэш существует не просто так, без него каждый резолв пойдёт заново и сёрфинг слегка замедлится.
Мини-лаба: пройди стек руками
Пятнадцать минут, повтори на своём Mac и закрепи лестницу диагностики:
- Сними состояние: scutil --nwi, scutil --dns. Найди свой первичный интерфейс и основной DNS-сервер. Запиши их.
- Проверь связность: ping -c 4 1.1.1.1, потом ping -c 4 ya.ru. Оба прошли? Глянь packet loss и разброс в round-trip.
- Сравни резолверы: dig ya.ru +short и dig @1.1.1.1 ya.ru +short. Ответы совпали? Если нет - твой системный DNS чудит.
- Прогони маршрут: traceroute -n ya.ru. Посчитай хопы до цели, найди, где скачок задержки.
- Проверь сервис: nc -zv -G 5 ya.ru 443. Дождись succeeded.
- Wi-Fi в цифрах: sudo wdutil info. Найди RSSI и Noise, посчитай SNR. Больше 25 дБ - канал здоровый.
- Загляни в пакеты: sudo tcpdump -ni en0 -c 20 port 443 и параллельно открой пару сайтов. Увидь хендшейки.
- Финал: sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder - сбрось кэш и повтори dig.
- ping по IP-адресу проходит, а ping по доменному имени - нет. На какой ступени стека проблема и какой одной командой ты это подтвердишь?
- Чем scutil --dns принципиально полезнее, чем просто посмотреть DNS в Системных настройках? Что он показывает такого, чего нет в GUI?
- Почему для полного сброса DNS-кэша недостаточно одной dscacheutil -flushcache и зачем нужен killall -HUP mDNSResponder?
- В выводе wdutil info ты видишь RSSI -49 dBm и Noise -60 dBm. "Палочек" полно, но скорость низкая. Посчитай SNR и объясни, почему связь плохая.
Диагностика сети на Mac - это дисциплина, а не угадайка. Идёшь по лестнице снизу вверх: scutil дал снимок, ping отделил линк от DNS, traceroute и mtr показали, где рвётся путь, nc проверил порт удалённо, lsof - локально, wdutil дал честные цифры по Wi-Fi вместо вранья шкалы, а tcpdump показал пакеты глазами, когда выше ответа не нашлось. Почти всё это уже стоит в системе - BSD-наследие macOS работает на тебя. Запомни главное: каждый инструмент отвечает на один конкретный вопрос, и сила не в количестве команд, а в правильном порядке. Сначала пойми, на каком ты слое, потом стреляй.