Назад | Перейти на главную страницу

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

Я пытаюсь создать прозрачный прокси на своем компьютере MacOS, чтобы портировать sshuttle ssh-based transproxy VPN из 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 не работает транспрокси-сервер) Есть какие-нибудь советы, как исправить?

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

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

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

Единственное, что я могу здесь сделать, это догадаться, просто немного подглядывать: 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

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

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