Просмотр маршрутов в 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 по умолчанию, чтобы получить требуемый результат. Полная команда
Читайте также: