Почему мой скрипт следует за /etc/hosts, а браузеры — нет, когда есть SOCKS-прокси?

У моего MacBook в офисе нет доступа в Интернет. Поэтому я установил мгновенный SOCKS-прокси через SSH для доступа к stackoverflow. В основном я использую свой MacBook для разработки, поэтому я полагаюсь на /etc/hosts и виртуальные хосты для локального тестирования некоторых сайтов.

Однако, когда я пытаюсь добавить запись в /etc/hosts, браузер не переходит на тот сайт, на который я рассчитывал...

WIFI моего MacBook выключен и подключен к локальной сети компании:

 IP address:  192.168.8.250
 Subnet mask: 255.255.255.0
 Router:      192.168.8.1
 DNS server:  8.8.8.8

По умолчанию нет доступа в Интернет.

Там есть ящик для разработки Linux (192.168.12.128), у которого есть доступ к Интернету, поэтому я настроил мгновенный прокси-сервер SOCKS, чтобы получить доступ к Интернету для моего MacBook:

 ssh -fND localhost:30000 [email protected]

Затем в Системных настройках моего MacBook> Сеть> Прокси

 (Enable) SOCKS Proxy
 SOCKS Proxy sever: 127.0.0.1:30000
 Bypass proxy settings for these Hosts & Domains:
   *.local, 169.254/16, 127.0.0.1

Теперь я могу просматривать веб-страницы, пока все хорошо.

Для разработки я создал несколько записей в /etc/hosts для виртуальных хостов:

 127.0.0.1 air.company.com

In bash:

 $ ping air.company.com
 PING air.ohho.es (127.0.0.1): 56 data bytes
 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.046 ms

 $ curl air.company.com
 <html>OK</html>

Это выглядит хорошо, и curl прекрасно возвращает содержимое index.html.

Однако, если я попытаюсь открыть сайт:http://air.company.com в браузерах (Safari/Chrome/Firefox), ни один из них не вернет такой результат, как curl. Хром выдает ошибку:

Эта веб-страница недоступна Веб-страница по адресу http://air.company.com/ может быть временно недоступна или возможно, навсегда переехал на новый веб-адрес. Ошибка 120 (net::ERR_SOCKS_CONNECTION_FAILED): неизвестная ошибка.

Если я добавлю еще одну запись в /etc/hosts:

 127.0.0.1 www.microsoft.com

В bash выглядит нормально:

 $ ping www.microsoft.com
 PING www.microsoft.com (127.0.0.1): 56 data bytes
 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.047 ms
 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.128 ms
 ^C
 --- www.microsoft.com ping statistics ---
 2 packets transmitted, 2 packets received, 0.0% packet loss
 round-trip min/avg/max/stddev = 0.047/0.087/0.128/0.041 ms

 $ curl www.microsoft.com
 <html>OK</html>

Я также пытаюсь использовать рубиновый скрипт:

 require 'socket'
 require 'curl'

 ip = IPSocket.getaddress('www.microsoft.com')
 puts ip

 puts

 http = Curl.get("http://www.microsoft.com/")
 puts http.body_str

Вывод выглядит нормально:

 $ bundle exec ruby openweb.rb 
 127.0.0.1

 <html>OK</html>

Однако, когда я использую браузеры, браузеры возвращают содержимое с веб-сервера настоящего сайта Microsoft вместо содержимого моего MacBook (127.0.01). Почему?

p.s.:

Если я отключу прокси-сервер SOCKS, браузер правильно вернет содержимое с 127.0.0.1.

Если я отключу кабель локальной сети, браузер правильно вернет содержимое с 127.0.0.1.


person ohho    schedule 19.06.2013    source источник


Ответы (5)


SOCKS5 будет выполнять поиск DNS удаленно; это хорошо для безопасности.

Я думаю, что вы хотите, чтобы ваш браузер не использовал прокси для внутренних или ваших пользовательских адресов разработки.

Для этого установите «Настройки обхода прокси-сервера для этих хостов и доменов:», чтобы включить *.company.com. Если у вас особенно сложные настройки, вы можете настроить управление доступом через прокси-сервер (он же .pac) файл, который позволяет очень точно контролировать, что проходит через прокси, а к чему осуществляется прямой доступ.

person Emil Sit    schedule 27.06.2013

Я постараюсь ответить на него как можно лучше, так как у меня уже была эта проблема.

Когда вы используете соединение Socks5, ваше разрешение IP перенаправляется на сервер socks.

В версии 5 реализация SOCKS может получать полные доменные имена в качестве адресов назначения и источника[1] (стр. 4).

В Mac OS по умолчанию используется SOCKS 5, как указано в [2] в (NSStreamSOCKSProxyVersionKey).

Таким образом, по умолчанию клиент Mac будет использовать SOCKS5 и БУДЕТ пересылать запросы DNS.

Я надеюсь, что это ответ на ваш вопрос: "Почему мой скрипт следует за /etc/hosts, а браузеры - нет, когда есть прокси-сервер SOCKS?" --> потому что реализация SOCKS5 перенаправляет DNS-запросы :)

С уважением

1http://www.ietf.org/rfc/rfc1928.txt

2 – https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSStream_Class/Reference/Reference.html#//apple_ref/doc/c_ref/NSStreamSOCKSProxyConfigurationKey

person Carlos Henrique Cano    schedule 22.06.2013

Клиенты SOCKSv4a и SOCKSv5 фактически могут подключить сервер к домену имя, а не только к адресу (http://en.wikipedia.org/wiki/SOCKS#).SOCKS4a).

                                                      ----------
                                                      -   DNS  -
                                                      ┐---------
                                                     .
                                                    .
----------------                   ----------------.-
-              ====================-                -
- Browser      = CON microsoft.com - SOCKS Server   -
-              ====================-                -
----------------                   ------------------

А так как сервер SOCKS имеет доступ в Интернет, вы можете видеть сайт Microsoft, а не вашу локальную версию.


Идеи:

  • Если вы можете изменить версию протокола SOCKS на версию 4, это должно сработать.
  • Вероятно, лучше в долгосрочной перспективе: отключить удаленный DNS в браузере, по крайней мере, Firefox поддерживает этот параметр: Network. proxy.socks.remote_dns.
person thriqon    schedule 27.06.2013

Это проблема с ДНС. Попробуйте разрешить имена локально.

person Alin Florin    schedule 27.06.2013

Я также столкнулся с этой проблемой и решил, просто изменив запись /etc/host

Просто удалите:

127.0.0.1 www.microsoft.com

и добавьте:

192.168.8.250 www.microsoft.com

Короче говоря, добавьте адрес вашего сервера ip вместо loopback ip

person Kaleem Ullah    schedule 05.05.2017