我已經“綁定”了整個 IPv6 /64 - 現在如何讓我的核心響應 ARP 以接受數據包?
我正在使用 CentOS 8 流。我的 IP 是 2001:570:1:b86::12,我執行了這個:-
ip -6 route add local 2001:570:1:b86::/64 dev lo
並建構並執行其中一個,我現在可以(本地)連接到我在這 18,446,744,073,709,551,615 個 IP 地址中的任何一個上的伺服器,並且一切正常。我還可以從遠端機器連接到現有的 2001:570:1:b86::12 並且它在網際網路上也可以正常工作。
但是,我無法從遠端連接到我的任何其他 IP…
$ ping6 -c 1 2001:570:1:b86:1234:2345:3456:6789 PING6(56=40+8+8 bytes) 2001:8000:1ced:6d00:f507:cb71:703f:afe1 --> 2001:570:1:b86:1234:2345:3456:6789 --- 2001:570:1:b86:1234:2345:3456:6789 ping6 statistics --- 1 packets transmitted, 0 packets received, 100.0% packet loss
看看這個,我的盒子似乎沒有回复 ARP 嗎?
# tcpdump -i eno1 -n -nn -vvv -XX proto 58 dropped privs to tcpdump tcpdump: listening on eno1, link-type EN10MB (Ethernet), capture size 262144 bytes 00:11:47.354817 IP6 (class 0xc0, hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::629c:9fff:fe86:c00 > ff02::1:ff56:6789: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has 2001:570:1:b86:1234:2345:3456:6789 source link-address option (1), length 8 (1): 60:9c:9f:86:0c:00 0x0000: 609c 9f86 0c00 0x0000: 3333 ff56 6789 609c 9f86 0c00 86dd 6c00 33.Vg.`.......l. 0x0010: 0000 0020 3aff fe80 0000 0000 0000 629c ....:.........b. 0x0020: 9fff fe86 0c00 ff02 0000 0000 0000 0000 ................ 0x0030: 0001 ff56 6789 8700 f8a7 0000 0000 2001 ...Vg........... 0x0040: 0570 0001 0b86 1234 2345 3456 6789 0101 .p.....4#E4Vg... 0x0050: 609c 9f86 0c00 `..... 00:11:48.389831 IP6 (class 0xc0, hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::629c:9fff:fe86:c00 > ff02::1:ff56:6789: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has 2001:570:1:b86:1234:2345:3456:6789 source link-address option (1), length 8 (1): 60:9c:9f:86:0c:00 0x0000: 609c 9f86 0c00 0x0000: 3333 ff56 6789 609c 9f86 0c00 86dd 6c00 33.Vg.`.......l. 0x0010: 0000 0020 3aff fe80 0000 0000 0000 629c ....:.........b. 0x0020: 9fff fe86 0c00 ff02 0000 0000 0000 0000 ................ 0x0030: 0001 ff56 6789 8700 f8a7 0000 0000 2001 ...Vg........... 0x0040: 0570 0001 0b86 1234 2345 3456 6789 0101 .p.....4#E4Vg... 0x0050: 609c 9f86 0c00 `..... 00:11:49.386308 IP6 (class 0xc0, hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::629c:9fff:fe86:c00 > ff02::1:ff56:6789: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has 2001:570:1:b86:1234:2345:3456:6789 source link-address option (1), length 8 (1): 60:9c:9f:86:0c:00 0x0000: 609c 9f86 0c00 0x0000: 3333 ff56 6789 609c 9f86 0c00 86dd 6c00 33.Vg.`.......l. 0x0010: 0000 0020 3aff fe80 0000 0000 0000 629c ....:.........b. 0x0020: 9fff fe86 0c00 ff02 0000 0000 0000 0000 ................ 0x0030: 0001 ff56 6789 8700 f8a7 0000 0000 2001 ...Vg........... 0x0040: 0570 0001 0b86 1234 2345 3456 6789 0101 .p.....4#E4Vg... 0x0050: 609c 9f86 0c00 `.....
我如何告訴核心指示路由器我的盒子是接受這些數據包的盒子?
如果這與 tproxy 有關,我確實有(不知道在我的防火牆中做什麼才能讓這些 ARP 正常工作)
# lsmod | grep tproxy nf_tproxy_ipv6 16384 0
建議?
OP 的方法從 Linux 2.6.37 開始就可以使用,但需要額外的設置。
ARP 的 IPv6 等效項是NDP(它使用 ICMPv6 多播/單播,而不是 ARP 的專用 L2 協議和廣播/單播)。
proxy_ndp
此處的行為與代理 ARP 不完全相同(它仍然需要按 IP 設置,我們在這裡不需要)並且無濟於事。取而代之的是一個專門的守護程序ndppd
,它監聽 NDP 請求以(通常)代表其他系統回答可以管理這種情況。它必須設置為在回答之前不嘗試查詢後端系統,因為沒有這樣的其他系統。假設這裡:
- 主界面呼叫
eth0
- system 在這個 /64 中是單獨的(除了可能是其路由器的可選全域地址)。
- 系統不應該設置為路由器。請參閱小警告。
啟用 EPEL(包
epel-release
),安裝ndppd
,並使用與此類似的配置/etc/ndppd.conf
:proxy eth0 { router no rule 2001:570:1:b86::/64 { static } }
static
使守護程序立即回答而不查詢任何後端系統,這是在這種情況下必須做的,因為所有地址都屬於(或更準確地說,所有查詢都應該到達)主機。注意事項:
ndppd
啟動時會產生警告,因為網路遮罩很大。當系統的路由器未明確設置為通過 2001:570:1:b86::12 或(更好)通過系統
eth0
介面上的連結本地地址路由此 /64 塊時,這一點很重要。如果在沒有正確設置路由器的情況下對塊進行遠端網路掃描,則此路由器將為 /64 掃描中看到的每個新地址分配一個 NDP 條目。小型(家用)路由器的設計不夠健壯並且不夠快地驅逐舊條目可能無法很好地處理這個問題並進入記憶體不足/高 CPU 使用條件(即:DoS)。
- 由於實際主機的 IPv6 地址在 /64 中,因此查詢該地址將得到兩個 NDP 答案:一個來自核心,另一個來自
ndppd
. 如果系統實際上是路由器,這可能會導致間歇性路由問題。在這種情況下router yes
可以深思熟慮。ndppd
的配置似乎沒有子網覆蓋包括此子網的更大網路,就像在路由表中發生的那樣。