Я пытаюсь создать прозрачный прокси на своем компьютере 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.