一些 IPv6 主機將所有流量(即使在同一子網中)發送到路由器
我注意到我們 LAN 的 IPv6 路由問題。大多數客戶端 PC 都是 LTSP 瘦客戶端。他們通過 SLAAC 獲得一個地址。
Tracepath6
到同一子網上的主機顯示所有流量都是直接的。但是,我正在使用的筆記型電腦(Linux Mint 17,標準網路管理器)為自己提供了兩個 IPv6 地址,並設置了所有流量首先進入路由器的路由,包括同一子網中的流量:tracepath6 xxxx:1b0:5256:1337:10:50:0:8 1?: [LOCALHOST] 0.183ms pmtu 1500 1: xxxx:1b0:5256:1337:10:50:0:1 1.217ms
問題:
- 為什麼有些主機得到一個地址而有些主機得到更多地址?我經常看到這種情況發生。
2)為什麼這台機器選擇通過路由器路由所有流量?
路由器是dnsmasq,確實只有SLAAC:
Jan 22 11:34:36 gatekeeper dnsmasq-dhcp[9796]: IPv6 router advertisement enabled Jan 22 11:34:36 gatekeeper dnsmasq-dhcp[9796]: DHCP, IP range 10.102.20.1 -- 10.102.20.254, lease time 12h Jan 22 11:34:36 gatekeeper dnsmasq-dhcp[9796]: DHCP, IP range 10.101.20.1 -- 10.101.20.254, lease time 12h Jan 22 11:34:36 gatekeeper dnsmasq-dhcp[9796]: DHCP, IP range 10.100.0.100 -- 10.100.0.254, lease time 12h Jan 22 11:34:36 gatekeeper dnsmasq-dhcp[9796]: DHCP, IP range 10.50.20.1 -- 10.50.20.254, lease time 12h Jan 22 11:34:36 gatekeeper dnsmasq-dhcp[9796]: SLAAC on xxxx:1b0:5256:1337:: prefix valid 2h
這是我的 eth0:
eth0 Link encap:Ethernet HWaddr 18:67:b0:34:2d:dd inet addr:10.50.20.158 Bcast:10.50.255.255 Mask:255.255.0.0 inet6 addr: fe80::1a67:b0ff:fe34:2ddd/64 Scope:Link inet6 addr: xxxx:1b0:5256:1337:2532:eb1a:1151:d2f0/64 Scope:Global inet6 addr: xxxx:1b0:5256:1337:1a67:b0ff:fe34:2ddd/64 Scope:Global UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:12094 errors:0 dropped:0 overruns:0 frame:0 TX packets:17250 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2848542 (2.8 MB) TX bytes:3002689 (3.0 MB)
這些是 IPv4 路由:
> route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.50.0.1 0.0.0.0 UG 0 0 0 eth0 10.50.0.0 0.0.0.0 255.255.0.0 U 1 0 0 eth0
這些是 IPv6 路由:
Kernel IPv6 routing table Destination Next Hop Flag Met Ref Use If fe80::/64 :: U 256 1 0 eth0 ::/0 fe80::213:3bff:fe0f:c02c UG 1 0 0 eth0 ::/0 fe80::213:3bff:fe0f:c02c UGDAe 1024 0 0 eth0 ::/0 :: !n -1 1 261 lo ::1/128 :: Un 0 3 243 lo xxxx:1b0:5256:1337:1a67:b0ff:fe34:2ddd/128 :: Un 0 1 0 lo xxxx:1b0:5256:1337:2532:eb1a:1151:d2f0/128 :: Un 0 1 86 lo fe80::1a67:b0ff:fe34:2ddd/128 :: Un 0 1 178 lo ff00::/8 :: U 256 1 0 eth0 ::/0 :: !n -1 1 261 lo
直接到達其他主機的主機上不存在以下行:
::/0 fe80::213:3bff:fe0f:c02c UG 1 2 0 eth0
fe80::213:3bff:fe0f:c02c
確實是 LAN 端路由器的鏈路本地地址。編輯:我看到的行為可能是隨機的。我多次重新啟動其中一個瘦客戶端,tracepath6 有時會顯示通過路由器的流量,有時會直接流向主機。似乎每次重新啟動都不同。路由表每次都完全相同,如果我啟用/禁用 dnsmasq
off-link
選項也是如此。Edit2:例如,IPv4 始終有一條路由表明,對於您自己的子網,它應該只通過 eth0 發送。因此,當我在 IPv6 中添加此路由時,流量不再通過路由器:
/sbin/route -A inet6 add xxxx:1b0:5256:1337::/64 dev eth0
那麼,為什麼
xxxx:1b0:5256:1337::/64
預設不包括在內(在此處的任何機器上)?不應該存在一條告訴核心對於目前子網,只需通過乙太網(或 wlan,等等)發送出去的路由嗎?Edit3:我剛剛查看了 tcpdump+wireshark,發現
L
路由器廣告中未設置標誌 On-Link,儘管未設置離線連結:dhcp-range=xxxx:1b0:5256:1337::, ra-only, inifite
顯然,DNSMasq 沒有設置 on-link 是 2.63 中修復的錯誤,對於 Debian 7 來說太新了。無論如何都需要升級到 Debian 8,所以今天就這樣做。
編輯,升級完成。DNSmasq 配置行更改為:
dhcp-range=::,ra-only,constructor:eth1,infinite
現在添加了本地子網的路由。
- 為什麼有些主機得到一個地址而有些主機得到更多地址?我經常看到這種情況發生。
IPv6 主機始終獲得鏈路本地地址。其他地址取決於 RA 中的標誌和主機設置的組合。RA 可以向主機發出信號,表明 DHCPv6 伺服器可能會分發地址,主機可以根據這些地址進行操作。如果 RA 包含允許自動配置的前綴並且主機沒有禁用自動配置,則使用 SLAAC。
最初的規範說 interface-id(IPv6 地址的最後 64 位)是從鏈路層地址(通常是 MAC 地址)構造的。但這樣就可以通過網際網路跟踪設備。想像一下經常聯繫的服務 Google 或 Dropbox:無論您將筆記型電腦或手機連接到何種網路,子網都會發生變化,但 interface-id 將始終保持不變。因此,如今作業系統提供了隱私擴展。
隱私擴展使您的 interface-id 定期更改。確切的計時器取決於實現,但我們假設它每小時更改一次。您的設備每小時都會為自己配置一個新的 IPv6 地址。舊地址已被棄用,一旦您的軟體停止使用它們,它們就會被刪除。這樣你就可以得到多個地址。
另外:當 RA 包含多個設置了自動配置標誌的前綴時,您的設備將在每個前綴中配置地址。
2)為什麼這台機器選擇通過路由器路由所有流量?
這通常取決於 RA 前綴中的 On-Link 標誌。如果設置了 on-link 標誌,則設備可以創建
/64
到介面的路由。如果未設置該標誌,則設備無法知道前綴中的其他地址是否處於連結狀態,並將所有這些數據包發送到預設網關。當然,您的設備始終可以選擇(有意或由於錯誤)忽略 on-link 標誌並將所有內容髮送到預設網關。