为什么我的脚本跟在/ etc / hosts之后,但是当有SOCKS代理时浏览器没有?

时间:2013-06-19 07:43:25

标签: dns proxy osx-mountain-lion hosts socks

办公室里的MacBook无法访问互联网。所以我通过SSH建立了一个即时SOCKS代理来访问stackoverflow。我主要使用我的MacBook进行开发,所以我依靠/etc/hosts和虚拟主机在本地测试一些网站。

但是,当我尝试向/etc/hosts添加条目时,浏览器不会转到我预期的网站...

我的MacBook的WIFI已关闭并连接到公司LAN:

 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 ohho@192.168.12.128

然后在我的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

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的内容。

但是,如果我尝试在浏览器(Safari / Chrome / Firefox)中打开网站:http://air.company.com,则不会返回curl之类的结果。 Chrome会出错:

  

此网页不可用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>

我也尝试使用ruby脚本:

 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网站的Web服务器返回内容,而不是MacBook(127.0.01)中的内容。为什么呢?

P.S:

如果我禁用SOCKS代理,浏览器会正确返回127.0.0.1中的内容。

如果我断开LAN电缆,浏览器会正确返回127.0.0.1中的内容。

5 个答案:

答案 0 :(得分:3)

SOCKS5将远程进行DNS查找;这对安全来说是件好事。

我认为您想要的是指示您的浏览器不要将代理用于内部或您的自定义开发地址。

为此,请设置“绕过这些主机和域名的代理设置:”以包含*.company.com。如果您的设置特别复杂,则可以设置proxy access control(又名.pac)文件,该文件可以非常精细地控制代理内容以及直接访问的内容。

答案 1 :(得分:1)

我会尽力回答,因为我已经遇到了这个问题。

当您使用Socks5连接时,您的IP解析将转发到socks服务器。

在版本5,SOCKS实施可能会收到完整的域名作为目的地和源地址[1](第4页)。

在Mac OS上,默认为SOCKS 5,如[2] at(NSStreamSOCKSProxyVersionKey)所示。

因此,默认情况下,mac客户端将使用SOCKS5并转发DNS请求。

我希望这能回答你的问题: “为什么我的脚本跟在/ etc / hosts之后,但是当有SOCKS代理时浏览器没有?” - &GT;因为SOCKS5实现转发dns请求:)

问候

1 - http://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

答案 2 :(得分:1)

使用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

答案 3 :(得分:1)

这是一个DNS问题。尝试在本地解析名称。

答案 4 :(得分:0)

我也遇到了这个问题,只需更改/etc/host条目

即可解决

只需删除:

  

127.0.0.1 www.microsoft.com

并添加:

  

192.168.8.250 www.microsoft.com

inshort添加您的服务器ip地址,而不是loopback ip