Хорошо, вот моя проблема.Пожалуйста, прости меня, так как это немного сложно.Я почти на 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, вы сможете легко воспроизвести проблему.)
Спасибо за любые предложения.