Просмотр маршрутов в Mac OS

Обновлено: 21.11.2024

Если вы запустите netstat -rn на Mac (я использую Mojave 10.14.6, но я подозреваю, что это относится ко всем MacOS), вы получите таблицу IP-маршрутов, но некоторые IP-адреса будут неполными, а сетевая маска столбец не существует:

Как следует интерпретировать неполные IP-адреса? Например, что такое 127? Должен ли я интерпретировать это как 127.0.0.0? Всегда ли это правило — считать, что отсутствующие октеты равны 0 и что отображаемый октет в таблице маршрутов Mac является самым значащим октетом (т. е. 127 — это 127.0.0.0, а не 0.0.0.127)?

Кроме того, в Windows ( route print ) и Linux ( route -n ) есть столбец netmask/genmask. Но поскольку на Mac такого столбца нет, я предполагаю, что он заменен нотацией CIDR в столбце «Назначение» (например, 192.168.1.1/32 вместо 192.168.1.1 с маской 255.255.255.255). Но тогда не все маршруты имеют обозначение CIDR в столбце «Назначение» — например, 239.255.255.250 в приведенной выше таблице. Когда косая черта и следующая за ней маска опущены в IP-адресе в столбце назначения, следует ли нам предполагать, что маска всегда равна 0.0.0.0?

1 Ответ 1

Версия netstat, которая поставляется с macOS (и, возможно, с другими Unix-системами, производными от BSD?), использует несколько идиосинкразическое сокращение для адреса и сетевой маски. Как вы поняли, он использует нотацию CIDR в столбце назначения, а не имеет отдельный столбец сетевой маски. Но в нем используется пара сокращений, основанных на «классовой» системе адресации до CIDR (спасибо @grawity за то, что он указал на это и заставил меня взглянуть на исходный код, чтобы подтвердить это).

Краткое резюме: в старой классовой системе адреса, где первый октет был от 0 до 127 (с зарезервированными 0 и 127), были сетями "класса A" с сетевой маской 255.0.0.0 (то, что мы сейчас называем /8). 128.x - 191.x были сетями «класса B» с сетевой маской 255.255.0.0 ( /16 ). 192.xx — 223.xx были сетями «класса C» с сетевой маской 255.255.255.0 ( /24 ). Остальное адресное пространство было «Класса D» (для многоадресной рассылки) и «Класса E» (зарезервировано) с неопределенными сетевыми масками. Эта система была негибкой и неэффективной, поэтому в 1993(!) ее заменила бесклассовая междоменная маршрутизация (CIDR), но остатки ее сохранились в разных местах, в том числе и здесь.

По сути, netstat пропускает то, что соответствует ожидаемому в классовой системе (и, следовательно, может быть выведено из этой системы). Ну, за исключением того, что он рассматривает классы D и E как имеющие ту же неявную сетевую маску, что и класс C (т. е. /24 ).

  • Если адрес оканчивается на 0 октетов, тогда как в старой системе хостовая часть должна была находиться, эти октеты не учитываются. Так, например, 10/24 — это сокращение от 10.0.0.0/24. Но 177.0.0.0/24 будет сокращен только до 177.0/24 , потому что это будет сеть класса B, поэтому второй октет считается значимым.
  • Если сетевая маска совпадает с той, что была в старой системе, ИЛИ если это запись маршрутизации "хост", суффикс CIDR опускается. Например, 169.254 — это сокращение от 169.254.0.0/16, поскольку 169 относится к классу B.

Это немного сложно, но перевести его обратно в полный список несложно: если в нем не указан суффикс CIDR, это всего лишь 8-кратное количество октетов, явно перечисленных (или /32 для записей узлов); и если в списке нет 4 октетов, добавьте «.0» к части адреса по мере необходимости. Например, 169.254 -> 169.254/16 -> 169.254.0.0/16 .

При работе с Linux вы привыкаете к тому, как работает Linux, но когда вы переключаетесь с Linux на Mac OS X, вы замечаете, что некоторые вещи обрабатываются по-другому.

С одним из таких отличий я столкнулся недавно. Речь идет о том, как вы считываете маршруты, которые у вас есть в настоящее время. Я привык к тому, как вы показываете их в Linux с помощью следующей команды:

Мне нравится добавлять параметр "-n", чтобы не преобразовывать IP-адреса в имена. Это может значительно ускорить вывод маршрутов.

Но когда вы переключитесь на OS X, вы заметите, что команда «маршрут» существует, но работает по-другому. Если вы откроете справочную страницу «route» в системе Linux, а затем в OS X, вы сразу увидите следующую разницу.

Справочные страницы Linux содержат следующее описание команды:

Но справочная страница OS X покажет это только в описании:

Отсутствующее слово «show» намекает на то, что команда route не покажет нам маршруты, как мы привыкли в Linux. Чтобы получить такой же список активных записей маршрутизации, как и в Linux, необходимо выполнить следующую команду:

Вывод команды netstat в Mac OS X очень похож на вывод, к которому вы привыкли в Linux. Параметр «-r» сообщает netstat, что нужно показать таблицу маршрутизации, а параметр «-n», как и в случае с командой «route», позволяет избежать разрешения DNS.Команда netstat используется для отображения не только таблицы маршрутизации, но также доступна в Linux. При выполнении в Linux она покажет тот же вывод, что и команда route.

Добавление маршрута

Для добавления маршрута в таблицу маршрутизации Linux и OS X используйте команду route, но имейте в виду, что даже здесь есть различия. В OS X, чтобы указать маршрут для сети 10.0.0.0/24 для маршрутизации к шлюзу 10.0.0.1, вы используете следующую команду.

Но если вы работаете в системе Linux, вам придется использовать следующую команду, чтобы сделать то же самое:

Синтаксис очень близок к синтаксису OS X, но не идентичен ему. В OS X параметры назначения и шлюза определяются их позицией в командной строке, команда Linux ожидает, что параметры будут иметь префикс «-net» и «gw».

Справочная страница соответствующих команд обычно является хорошим источником информации о различиях между Linux и Mac OS X.

Я использую vpnc в качестве VPN-клиента. Я также делаю некоторые хитрые вещи с маршрутом, чтобы убедиться, что я все еще могу получить доступ к своей локальной сети и т. д. и т. д. (подробности здесь не очень важны).

Иногда таблица маршрутизации настолько перегружена, что я получаю сообщение ping: sendto: Сеть недоступна для URL-адресов, которые в противном случае должны разрешаться.

В настоящее время, если я перезапущу Mac OS X, все вернется в норму. Что я хотел бы сделать, так это сбросить таблицы маршрутизации на «по умолчанию» (например, на то, что установлено при загрузке) без перезагрузки всей системы.

Я думаю, что шаг 1 — это сброс маршрута (удаление всех маршрутов). А на шаге 2 необходимо перезагрузить все маршруты по умолчанию.

Есть мысли, как это сделать? (например, что такое шаг 2?)

EDIT
Кроме того, я заметил еще один симптом: traceroute также не работает на указанном адресе. Например:

traceroute: bind: невозможно назначить запрошенный адрес

Ниже приведены все возможные решения или предложения по приведенным выше вопросам.

Предложение: 1:

Вам нужно сбросить маршруты . Используйте route -n flush несколько раз. Затем добавьте свои маршруты с помощью route add.

Предложение: 2:

Я столкнулся с этой проблемой при использовании домашнего сервера OpenVPN и подключении к нему с помощью приложения Tunnelblick на Mac.

С моей стороны происходило то, что маршрут с моим домашним IP-адресом в качестве пункта назначения и неправильным шлюзом оставался после отключения от VPN. Удаление этого маршрута просто решило проблему

Пример: я нахожусь в школе и после загрузки нового компьютера подключаюсь к беспроводной сети. Я подключаюсь к своему домашнему серверу OpenVPN с помощью Tunnelblick.

Я отключился от VPN-сервера. Я меняю беспроводные сети. Это меняет мой шлюз по умолчанию.

После этого я ни при каких обстоятельствах не могу подключиться к своей домашней сети (VPN, ping и т. д.). Если я просто удалю маршрут:

Возможна проблема с настройкой сервера/клиента OpenVPN, которая покидает этот маршрут (и мне было бы интересно узнать, что это такое), но я установил сценарий пост-отключения Tunnelblick, который автоматизирует удаление этого маршрута. .

Мне нужно получить шлюз по умолчанию на компьютере Mac. Я знаю, что в Linux route -n даст вывод, из которого я могу легко получить эту информацию. Однако это не работает в Mac OSX (Snow Leopard).

Я также попробовал netstat -nr | grep 'default' , но я надеялся на более чистый вывод, подобный тому, который выдает route -n в Linux/Unix. netstat -nr перечисляет все интерфейсы и шлюз по умолчанию для них.

Любое предложение или подсказка в правильном направлении будут оценены.

К вашему сведению, вы можете Option + щелкнуть значок WiFi в строке состояния. Это показывает дополнительную информацию, включая шлюз.

5 ответов 5

Вы можете попробовать:

Это не то же самое, что route -n в GNU/Linux (или даже ip route show ), но полезно для проверки информации о маршруте по умолчанию. Кроме того, вы можете проверить маршрут, по которому пакеты будут идти к определенному хосту. Например,

Вывод будет похож на:

IMHO netstat -nr - это то, что вам нужно. Даже служебное приложение MacOSX Network (*) использует вывод netstat для отображения информации о маршрутизации.

Надеюсь, это поможет :)

(*) Вы можете запустить сетевую утилиту, открыв /Applications/Utilities/Network\ Utility.app

Спасибо. Вы только что сэкономили мне несколько часов в новом доме, когда модем Time Warner решил, что ему нужен IP-адрес, который раньше был у моего маршрутизатора, и ifconfig солгал о шлюзе.

Для получения списка связанных IP-адресов вы можете использовать команду netstat

Это дает длинный список IP-адресов, и найти нужное поле непросто.Результат примера выглядит следующим образом:

IP-адрес шлюза указан в первой строке; один со значением по умолчанию в первом столбце.

Чтобы отобразить только выбранные строки результата, мы можем использовать команду grep вместе с netstat

Эта команда фильтрует и отображает те строки результата, которые имеют значение по умолчанию. В этом случае вы можете увидеть следующий результат:

Если вас интересует только IP-адрес шлюза и ничего больше, вы можете дополнительно отфильтровать результат с помощью awk. Команда awk сопоставляет шаблон во входном результате и отображает вывод. Это может быть полезно, когда вы используете свой результат непосредственно в какой-либо программе или пакетном задании.

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

В этом случае netstat отображает все результаты, grep выбирает только строку со значением «по умолчанию», а awk далее сопоставляет шаблон, чтобы отобразить второй столбец в тексте.

Вы можете аналогичным образом использовать команду route -n get по умолчанию, чтобы получить требуемый результат. Полная команда

Читайте также: