Есть ли обходной путь для неработающих записей ARP, вызванных установкой net.inet.ip.scopedroute = 0 в MacOS?

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

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

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

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

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

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

Спасибо за любые предложения. Я делаю это так: List s = newArrayList ("susen", "soumen", "dipak", "abhi", "zylo", "zala", "...

какой простой способ выполнить лексикографическое упорядочение списка строк с помощью guava. Я делаю это следующим образом:

List s = newArrayList(
    "susen", "soumen", "dipak", "abhi", "zylo",
    "zala", "gautam", "gautom", "shaswasti", "saswati");
List ts = newArrayList(transform(s, new Function() {
    @Override
        public char[] apply(String input) {
            return input.toCharArray();
        }
    }));
Collections.sort(ts, Chars.lexicographicalComparator());
s = transform(ts, new Function() {
    @Override
    public String apply(char[] input) {
        return String.valueOf(input);
    }
});
System.out.println(s);

7
задан reevesy 1 July 2014 в 16:05
поделиться