在至少兩個版本的Linux(Ubuntu 9 和Debian 7)上,我注意到,即使我在lo 上只配置了一個環回位址(標準127.0.0.1),它也很樂意接受發送到任何127.xxx的資料包位址。我發現這非常令人驚訝,因為其他 Unix 變體會丟棄未配置位址的資料包。
- 為什麼/如何做到這一點?對於任何其他位址範圍都不會發生這種情況,不是嗎?
- 我如何讓它做更明智(和安全!)的事情並真正專注於配置的地址?
編輯:我讀過 RFC 5735,這是對其的相當草率的解釋“整個 127.0.0.0/8 區塊內的位址不會合法地出現在網路上的任何位置”到“這台機器必須接受所有這些 IP 的資料包”。畢竟,您不會看到主機接受所有 172.16.0.0/12 的資料包,只是因為它們配置了這些位址之一。
我的目的不是詢問位址的規範,而是詢問 Linux 接受封包邏輯的實作。這裡的「為什麼」和「如何」意味著實際的 Linux 核心中是什麼導致正常的「這個封包是給我的」邏輯被繞過?
答案1
環回很特殊。它是整個 127.0.0.0/8 空間,並且它永遠不會離開機器。這是僅監聽配置位址的唯一例外,如果它在環回上,那麼它是特殊的。
我想不出任何安全隱患,因為這些位址永遠不可能位於實體網路上。
答案2
正常的路由邏輯不是被繞過,並且這個配置更安全比你提議的那個。
首先讓我們來看看路由表,看看發生了什麼事。
# ip address show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
# ip route show table 0
...
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
我們可以看到該介面配置了前綴/8
,這導致Linux自動地127.0.0.0/8
產生一條前往介面的路由lo
。這強制要求該區塊的所有資料包不會出現在網路上的任何位置並在主機內部環回。
如果沒有這條路由,127.0.0.0/8
網路的封包將不是被環回到主機內部,並且可能有資格從網路介面路由出去。這會帶來不安全性和 RFC 不合規性。
請記住,「環回」正是這個意思。在常規介面上,發送到它的封包會出去,而在環回介面上,發送到它的封包會立即返回。這就是環回的含義,也是您看到此流量的原因。
答案3
它不是特定於 Linux 的(Win 的工作原理完全相同),而是遵循規範(正如 Eric 指出的):來自RFC 5735 - 特殊用途 IPv4 位址
127.0.0.0/8 - This block is assigned for use as the Internet host
loopback address. A datagram sent by a higher-level protocol to an
address anywhere within this block loops back inside the host. This
is ordinarily implemented using only 127.0.0.1/32 for loopback. As
described in [RFC1122], Section 3.2.1.3, addresses within the entire
127.0.0.0/8 block do not legitimately appear on any network anywhere.