Kernel-Modules

我已經“綁定”了整個 IPv6 /64 - 現在如何讓我的核心響應 ARP 以接受數據包?

  • September 5, 2021

我正在使用 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的配置似乎沒有子網覆蓋包括此子網的更大網路,就像在路由表中發生的那樣。

引用自:https://unix.stackexchange.com/questions/667689