很多网上提供的屏蔽某域名的方法都是把该域名指向127.0.0.1,为什么不指向0.0.0.0?如果本机上运行着web server的话,前者有可能产生问题吧?

2012-09-17 23:29:32 +08:00
 skydiver
10496 次点击
所在节点    问与答
25 条回复
skydiver
2012-09-17 23:36:01 +08:00
每次都要手动把网上down下来的hosts里面的127.0.0.1全部替换成0.0.0.0。。。太麻烦了。。。
vking
2012-09-17 23:51:50 +08:00
批量替換127為0衹需要一秒钟。
skydiver
2012-09-18 00:08:34 +08:00
@vking 只是想不懂为啥很多地方都把屏蔽的域名指向127.0.0.1,难道这个ip比0.0.0.0还好写么
fanzeyi
2012-09-18 00:10:02 +08:00
=_= 其实我想问

这两个不一样么.. 我这里 0.0.0.0 == 127.0.0.1 的……
skydiver
2012-09-18 00:12:23 +08:00
@fanzeyi 127.0.0.1是本机ip,0.0.0.0是表示无法访问的ip
paloalto
2012-09-18 00:35:20 +08:00
@skydiver 我这里 0.0.0.0 == 127.0.0.1 的
+1

而且Python 的 web.py 框架默认的本地开发服务器地址就是0.0.0.0:8080
raptium
2012-09-18 00:38:16 +08:00
@paloalto bind 的時候 0.0.0.0 是指本機所有 interface
連接的時候 0.0.0.0 就不是指本機了
skydiver
2012-09-18 00:39:13 +08:00
@paloalto 这个是不一样的。监听0.0.0.0:8080表示在所有可用接口上监听8080端口。实际本地地址还是127.0.0.1:8080
Air_Mu
2012-09-18 01:03:08 +08:00
可能会有什么问题?比如什么?
bulldozer
2012-09-18 09:35:38 +08:00
0.0.0.0作为地址,不是一个合法地址。仅仅是屏蔽web,一般不会有问题,浏览器会辨析这个问题。但对于某些第三方程序就可能出现一些意外的错误。 尤其0.0.0.0在不同场合表示不同的含义,完全取决于程序作者的处理方式。

127.0.0.1则不同,它是一个合法地址,而且只要TCPIP协议栈生效,这个地址一般说都存在且无歧义,正常情况下不会导致第三方程序出现意外错误,顶多是端口连接超时。
bulldozer
2012-09-18 09:38:47 +08:00
一个简单的例子,比如 有人ping www.sina.com.cn,如果解析为0.0.0.0,一些特殊ping实现,会理解为ping所在网段的全部地址。
bulldozer
2012-09-18 09:46:15 +08:00
在一个大型局域网环境中,应尽量避免使用0.0.0.0作为解析地址,很多程序员在实际中会把这个地址作为广播地址,当碰到这个地址,程序可能发送一个大的广播出去。有可能会引起一些意想不到的事情。
dingstyle
2012-09-18 10:15:49 +08:00
根据RFC1122,Section 3.1.2.3:

We now summarize the important special cases for Class A, B, and C IP addresses, using the following notation for an IP address:

{ <Network-number>, <Host-number> }

or
{ <Network-number>, <Subnet-number>, <Host-number> }
...

(a) { 0, 0 }

This host on this network. MUST NOT be sent, except as
a source address as part of an initialization procedure
by which the host learns its own IP address.

简单来说,0.0.0.0只在host初始化时可用作源地址,但绝不是一个合法的接收地址。

来源:http://serverfault.com/questions/78048/whats-the-difference-between-ip-address-0-0-0-0-and-127-0-0-1
skydiver
2012-09-18 10:25:21 +08:00
@bulldozer 0.0.0.0 is a non-routable meta-address used to designate an invalid, unknown or non applicable target.
http://en.wikipedia.org/wiki/0.0.0.0

@dingstyle 因为0.0.0.0不是一个合法的接收地址,所以发送到这个地址的包 MUST NOT be sent。所以0.0.0.0 比较适合作为屏蔽的用途~
bulldozer
2012-09-18 10:32:59 +08:00
@skydiver

你说的是tcpip标准或rfc中的定义。而0.0.0.0(包括x.x.0.0等)在实际中应用,尤其在一些相对较老应用系统中,歧义非常大。

只要做过网络编程,就知道对这种情况,程序员的处理方法不同的,很多程序员并不是碰到0.0.0.0就当异常抛出,而是作为一个边界情况来进行处理(如广播)

也就是说switch和路由不会处理0.0.0.0,但具体程序碰到0.0.0.0,如ping,程序员有可能把他处理为ping 1.0.0.0,1.0.0.1这样实际地址循环进行下去,而这种情况就是“合法化”了。这个是个非常简化的例子,在较老版本sun unix机器上,ping整个网段是可以做到的。
bulldozer
2012-09-18 10:47:57 +08:00
我们可以假设,一个监控程序,弹出一个对话框,有一个文本框,上面写着“请输入需要监控的机器的网址,0.0.0.0 表示局域网所有机器”,而你本想监控www.sina.com.cn这台机器,但www.sina.com.cn被解析为0.0.0.0,这个程序会如何操作?非常可能,它会去监控这个网络内部所有可达地址。

又或者,一个程序,需要给某些地址发送消息,而程序员默认0.0.0.0缺省表示所有机器,这个程序会如何处理发往www.sina.com.cn这个误解析的地址?

127.0.0.1是没有歧义的,它就是本机的回环地址。
bulldozer
2012-09-18 10:55:29 +08:00
192.169.0.0,通常用来表示一个网段内任意主机。而0.0.0.0通常表示任意主机,这实际上是TCPIP的一个事实标准。0.0.0.0不是合法地址,但往往拿来作为一个泛指所有合法地址的通配符。

比如缺省路由,0.0.0.0就是用来泛指任意主机。
skydiver
2012-09-18 11:00:55 +08:00
@bulldozer 多谢指点。我觉得这个确实在某些复杂度情况下会导致问题,但是一般修改hosts只是为了屏蔽http访问,使用0.0.0.0应该是没有问题的吧
chainkhoo
2012-09-18 19:15:53 +08:00
表示一直在用HostX 简单又省心 批量设置
sophy
2012-09-18 20:11:40 +08:00
0000不好看

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/47933

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX