V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
skydiver
V2EX  ›  问与答

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

  •  
  •   skydiver · 2012-09-17 23:29:32 +08:00 · 10483 次点击
    这是一个创建于 4458 天前的主题,其中的信息可能已经有所发展或是发生改变。
    25 条回复    1970-01-01 08:00:00 +08:00
    skydiver
        1
    skydiver  
    OP
       2012-09-17 23:36:01 +08:00
    每次都要手动把网上down下来的hosts里面的127.0.0.1全部替换成0.0.0.0。。。太麻烦了。。。
    vking
        2
    vking  
       2012-09-17 23:51:50 +08:00
    批量替換127為0衹需要一秒钟。
    skydiver
        3
    skydiver  
    OP
       2012-09-18 00:08:34 +08:00
    @vking 只是想不懂为啥很多地方都把屏蔽的域名指向127.0.0.1,难道这个ip比0.0.0.0还好写么
    fanzeyi
        4
    fanzeyi  
       2012-09-18 00:10:02 +08:00
    =_= 其实我想问

    这两个不一样么.. 我这里 0.0.0.0 == 127.0.0.1 的……
    skydiver
        5
    skydiver  
    OP
       2012-09-18 00:12:23 +08:00
    @fanzeyi 127.0.0.1是本机ip,0.0.0.0是表示无法访问的ip
    paloalto
        6
    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
        7
    raptium  
       2012-09-18 00:38:16 +08:00
    @paloalto bind 的時候 0.0.0.0 是指本機所有 interface
    連接的時候 0.0.0.0 就不是指本機了
    skydiver
        8
    skydiver  
    OP
       2012-09-18 00:39:13 +08:00   ❤️ 1
    @paloalto 这个是不一样的。监听0.0.0.0:8080表示在所有可用接口上监听8080端口。实际本地地址还是127.0.0.1:8080
    Air_Mu
        9
    Air_Mu  
       2012-09-18 01:03:08 +08:00
    可能会有什么问题?比如什么?
    bulldozer
        10
    bulldozer  
       2012-09-18 09:35:38 +08:00
    0.0.0.0作为地址,不是一个合法地址。仅仅是屏蔽web,一般不会有问题,浏览器会辨析这个问题。但对于某些第三方程序就可能出现一些意外的错误。 尤其0.0.0.0在不同场合表示不同的含义,完全取决于程序作者的处理方式。

    127.0.0.1则不同,它是一个合法地址,而且只要TCPIP协议栈生效,这个地址一般说都存在且无歧义,正常情况下不会导致第三方程序出现意外错误,顶多是端口连接超时。
    bulldozer
        11
    bulldozer  
       2012-09-18 09:38:47 +08:00
    一个简单的例子,比如 有人ping www.sina.com.cn,如果解析为0.0.0.0,一些特殊ping实现,会理解为ping所在网段的全部地址。
    bulldozer
        12
    bulldozer  
       2012-09-18 09:46:15 +08:00
    在一个大型局域网环境中,应尽量避免使用0.0.0.0作为解析地址,很多程序员在实际中会把这个地址作为广播地址,当碰到这个地址,程序可能发送一个大的广播出去。有可能会引起一些意想不到的事情。
    dingstyle
        13
    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
        14
    skydiver  
    OP
       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
        15
    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
        16
    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
        17
    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
        18
    skydiver  
    OP
       2012-09-18 11:00:55 +08:00
    @bulldozer 多谢指点。我觉得这个确实在某些复杂度情况下会导致问题,但是一般修改hosts只是为了屏蔽http访问,使用0.0.0.0应该是没有问题的吧
    chainkhoo
        19
    chainkhoo  
       2012-09-18 19:15:53 +08:00
    表示一直在用HostX 简单又省心 批量设置
    sophy
        20
    sophy  
       2012-09-18 20:11:40 +08:00
    0000不好看
    Tang
        21
    Tang  
       2012-09-18 20:27:06 +08:00
    你可以用0.0.0.1或者::1哦
    skydiver
        22
    skydiver  
    OP
       2012-09-18 21:08:55 +08:00
    @Tang ::1还是指向本机的 哈哈
    regent
        23
    regent  
       2012-09-19 13:27:32 +08:00
    这个东西还这么复杂啊……
    likexian
        24
    likexian  
       2012-09-19 13:32:07 +08:00
    curl -v 0.0.0.0
    * About to connect() to 0.0.0.0 port 80 (#0)
    * Trying 0.0.0.0... connected
    * Connected to 0.0.0.0 (0.0.0.0) port 80 (#0)
    > GET / HTTP/1.1
    > User-Agent: curl/7.19.7 (i486-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
    > Host: 0.0.0.0
    > Accept: */*
    >
    < HTTP/1.1 200 OK
    < Date: Wed, 19 Sep 2012 05:31:27 GMT
    < Server: Apache/2.2.14 (Ubuntu)
    < Last-Modified: Thu, 20 Oct 2011 02:19:35 GMT
    < ETag: "1214f3-0-4afb1967808ed"
    < Accept-Ranges: bytes
    < Content-Length: 0
    < Vary: Accept-Encoding
    < Content-Type: text/html
    <
    * Connection #0 to host 0.0.0.0 left intact
    * Closing connection #0
    skydiver
        25
    skydiver  
    OP
       2012-09-19 15:08:07 +08:00
    @likexian 貌似在linux里0.0.0.0是本机
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   868 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 21:16 · PVG 05:16 · LAX 13:16 · JFK 16:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.