Есть ли обходной путь для поврежденных записей ARP, вызванный установкой net.inet.ip.scopedroute = 0 в MacOS? - PullRequest
9 голосов
/ 03 февраля 2011

Хорошо, вот моя проблема.Пожалуйста, прости меня, так как это немного сложно.Я почти на 100% уверен, что это вызвано ошибкой ядра MacOS 10.6, но, поскольку мы не можем рассчитывать на исправление ошибки, мне нужен обходной путь.

I , изученный ранее , чтоПравила «ipfw ... fwd» не работают правильно на MacOS 10.6 (он работает на 10.5), если вы сначала не выполните

sysctl -w net.inet.ip.scopedroute=0

Однако оказывается, что это решение также не идеально;Примерно через 10-15 минут после этого изменения мой Mac в основном перестает общаться с Интернетом.проверка всего, что находится за пределами моей локальной сети, начинает говорить «нет маршрута к хосту», хотя у меня абсолютно правильный маршрут по умолчанию.Я проследил проблему до неправильных записей ARP.Перед тем, как я запустил указанную выше команду, моя таблица arp выглядит следующим образом:

# arp -a
router (192.168.42.1) at 0:1c:10:b0:d4:79 on en1 ifscope [ethernet]

После запуска вышеуказанного sysctl и выполнения ping google.com, она выглядит следующим образом:

# arp -a
dd-wrt (192.168.42.1) at 0:1c:10:b0:d4:79 on en1 [ethernet]
dd-wrt (192.168.42.1) at 0:1c:10:b0:d4:79 on en1 ifscope [ethernet]

Итакдалеко, так безобидно.Но через некоторое время исходная запись arp перестает работать, и все, что у нас осталось, это новая.MacOS пытается обновить старую запись, но она никогда не возвращается.tcpdump показывает повторные запросы ARP, исходящие от моего Mac, с правильными ответами ARP, возвращаемыми маршрутизатором, но ответ никогда не помещается в таблицу ARP.Я подозреваю, что ответом является просто обновление другой ARP-записи для того же IP-адреса, поскольку они оба имеют одинаковый ключ в некоторой хэш-таблице.

Запуск "arp -a -d"(или любой вариант" arp -d ", который я пробовал) не удаляет обе записи ARP - только одна из них.И, видимо, не правильный.

Любой из следующих обходных путей устраняет проблему, но нежелателен:

  • вместо изменения sysctl во время выполнения, отредактируйте sysctl.confи перезагрузите компьютер.
  • после изменения sysctl, выключите интерфейс и снова включите его.
  • после изменения sysctl удалите все маршруты через этот интерфейс (с помощью команды route) и заново создайте их.

Однако каждый из этих параметров временно оставляет систему в состоянии, когда пакеты не маршрутизируются.Более того, поскольку я на самом деле не знаю, что делает этот sysctl (кто-то может указать мне документацию для него?), Я бы очень хотел, чтобы моя программа смогла вернуть его в нормальное состояние при выходе.Но если я сделаю это, то при следующем запуске моей программы она снова будет нарушена.

Я думаю, что мне действительно нужно 1035 * - просто очистить таблицу ARP, но, возможно, яЯ упускаю что-то очевидное.Есть ли простой способ решить эту проблему, или мне нужно прибегнуть к чему-то уродливому?

(Кстати, программа, над которой я работаю, имеет открытый исходный код и называется sshuttle . Если вы попытаетесьна новом Mac с установленным по умолчанию sysctl равным 1, вы сможете легко воспроизвести проблему.)

Спасибо за любые предложения.

1 Ответ

1 голос
/ 25 апреля 2011

Вы пробовали форму arp -d <ip> ifscope <interface>?Из вашего примера попробуйте arp -d 192.168.42.1 ifscope en1

Это то, что я использую, чтобы избавиться от записей arp ifscope'd.Обратите внимание, что вы должны быть пользователем root (или использовать sudo), чтобы избежать ошибок прав доступа.

...