5

我在办公室的 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 的 System Preferences > Network > Proxies

 (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

但是,如果我尝试打开站点:http://air.company.com在浏览器(Safari/Chrome/Firefox)中,它们都不会像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) 的内容。为什么?

ps:

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

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

4

5 回答 5

3

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

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

为此,请将您的“绕过这些主机和域的代理设置:”设置为包括*.company.com. 如果您有特别复杂的设置,您可以设置代理访问控制(aka .pac) 文件,该文件允许非常精细地控制通过代理的内容和直接访问的内容。

于 2013-06-27T16:34:52.413 回答
1

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

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

在版本 5 中,SOCKS 实现可以接收完整的域名作为目标和源地址[1](第 4 页)。

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

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

我希望这能回答您的问题:“当有 SOCKS 代理时,为什么我的脚本遵循 /etc/hosts 而浏览器不遵循?” --> 因为 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

于 2013-06-22T17:36:07.360 回答
1

使用 SOCKSv4a 和 SOCKSv5 客户端实际上能够让服务器连接到域名而不仅仅是地址 ( http://en.wikipedia.org/wiki/SOCKS#SOCKS4a )。

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

而且由于 SOCKS 服务器可以访问 Internet,因此您可以看到 Microsoft 的站点,而不是您的本地版本。


想法:

  • 如果您能够将 SOCKS 协议的版本更改为版本 4,它应该可以工作。
  • 从长远来看可能会更好:在浏览器中禁用远程 DNS,至少 Firefox 支持此设置:Network.proxy.socks.remote_dns
于 2013-06-27T07:38:16.260 回答
1

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

于 2013-06-27T10:48:23.807 回答
0

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

只需删除:

127.0.0.1 www.microsoft.com

并添加:

192.168.8.250 www.microsoft.com

简而言之,添加您的服务器ip地址而不是loopback ip

于 2017-05-05T07:36:17.580 回答