Хорошо, вот моя проблема. Пожалуйста, простите меня, это немного сложно. Я почти на 100% уверен, что это вызвано ошибкой ядра MacOS 10.6, но поскольку мы не можем рассчитывать на исправление ошибки, мне нужен обходной путь.
Я узнал ранее , что "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 - только одну из них. И, по-видимому, не тот.
Любой из следующих обходных путей решает проблему, но нежелателен:
route
) и создайте их заново. Однако , каждая из этих опций временно оставляет систему в состоянии, в котором пакеты не маршрутизируются. Более того, поскольку я на самом деле не знаю, что делает этот sysctl (может ли кто-нибудь указать мне на документацию по нему?), Я бы очень хотел, чтобы моя программа могла вернуть его в нормальное состояние при выходе. Но если я это сделаю, то при следующем запуске моей программы она снова выйдет из строя.
Думаю, что мне действительно нужно сделать, это просто очистить таблицу ARP, но, возможно, я упускаю что-то очевидное. Есть ли простой способ решить эту проблему или мне придется прибегнуть к чему-то уродливому?
(Кстати, программа, над которой я работаю, имеет открытый исходный код и называется sshuttle . Если вы попробуете ее на свежий Mac с sysctl по умолчанию 1, вы сможете легко воспроизвести проблему.)
Спасибо за любые предложения.
Я делаю это так: List какой простой способ выполнить лексикографическое упорядочение списка строк с помощью guava.
Я делаю это следующим образом: List