Прозрачное проксирование оставляет сокеты с помощью SYN_RCVD в MacOS X 10.6 Snow Leopard (и, возможно, FreeBSD)

Я пытаюсь создать прозрачный прокси-сервер на моей машине MacOS для портирования прозрачной VPN-сети на основе sshuttle ssh из Linux. Я думаю, что почти у меня это работает, но, к сожалению, почти не на 100%.

Короткая версия это. В одном окне запустите что-то, что прослушивает порт 12300:

$ while :; do nc -l 12300; done

Теперь включите проксирование:

# sysctl -w net.inet.ip.forwarding=1
# sysctl -w net.inet.ip.fw.enable=1
# ipfw add 1000 fwd 127.0.0.1,12300 log tcp from any to any

А теперь проверьте это:

$ telnet localhost 9999   # any port number will do
  # this works; type stuff and you'll see it in the nc window

$ telnet google.com 80    # any host/port will do
  # this *doesn't* work!

После последнего эксперимента я вижу такие строки в netstat:

$ netstat -tn | grep ^tcp4
tcp4       0      0  66.249.91.104.80       192.168.1.130.61072    SYN_RCVD
tcp4       0      0  192.168.1.130.61072    66.249.91.104.80       SYN_SENT

Второй сокет принадлежит моей программе telnet; первое более подозрительно. SYN_RCVD подразумевает, что мой SYN-пакет был правильно перехвачен брандмауэром и принят ядром, но, очевидно, SYNACK никогда не отправлялся обратно в telnet, потому что он все еще находится в SYN_SENT.

С другой стороны, если я убью сервер nc, я получу это:

$ telnet google.com 80
Trying 66.249.81.104...
telnet: connect to address 66.249.81.104: Connection refused
telnet: Unable to connect to remote host

... как и ожидалось: мой прокси-сервер не работает, поэтому ipfw перенаправляет мое соединение на порт 12300, который никто не слушает, т.е. В соединении отказано.

Мой uname говорит это:

$ uname -a
Darwin mean.local 10.2.0 Darwin Kernel Version 10.2.0: Tue Nov  3 10:37:10 PST 2009; root:xnu-1486.2.11~1/RELEASE_I386 i386

Кто-нибудь видит какие-либо другие результаты? (Меня особенно интересуют результаты Snow Leopard vs Leopard, так как в интернете ходят слухи о нарушении транспрокси в версии Snow Leopard). Любой совет, как это исправить?

3 ответа

Понял! Я не уверен, что это ошибка в Snow Leopard или какая-то новая функция безопасности. Но кто-то отправил в список рассылки sshuttle решение этой проблемы, а именно:

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

Выполнение этой команды делает приведенный выше набор команд (в вопросе, опубликованном выше), работает правильно, как в MacOS 10.5. Таким образом, прозрачное проксирование снова работает.

При таких вещах я сталкивался со всевозможными странными проблемами с ipfw, и обычно причина связана с тем, что все проходит по одному и тому же правилу в обоих направлениях, когда вы действительно имели в виду только одно. правила переадресации + natd могут быть особенно хитрыми, чтобы получить право.

Сейчас у меня нет времени поиграть с ним, но вы можете попробовать создать набор правил, который заставит пакеты из telnet -> {everything} попадать в правило fwd, но не пакеты nc -> telnet.

Единственное, что я могу сделать, это угадать здесь, просто немного подглядывая:P

Итак, я думаю, что Avery 10.2 еще не исправлен для ошибки: http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/133732

Также описано на kerneltrap.org/mailarchive/freebsd-current/2007/11/20/431855

Пока 10,5 уже есть. Имеет смысл для меня, учитывая даты выхода Дарвина. Я думаю, мы узнаем, когда emaste запустит его и на более старой версии. Во всяком случае, я не управляю BSD или Дарвином, только попал в это из сообщения в блоге Эйвери:P

Другие вопросы по тегам