以下是我的ip6tables
規則:
# ip6tables -t nat -L -v
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DNAT all eth0 any anywhere 2001:470:4a71:f170::/64 to:fdde:ad00:beef:0:91f5:6dd4:e66f:cf5b
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 19 packets, 1936 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 19 packets, 1936 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all any eth0 fdde:ad00:beef::/64 anywhere
0 0 MASQUERADE udp any eth0 fd11:22::/64 anywhere
0 0 MASQUERADE tcp any eth0 fd11:22::/64 anywhere
我看到數據包通過eth0
使用離開tshark
。以下是一個代表性資料包(在介面 上接收wpan0
):
221 480.196225356 fd11:22::703c:ef83:a03d:7e1b ? 2600:1f1c:c93:da00:76c2:1dbd:72c2:d063 TCP 94 [TCP Retransmission] 49998 ? 50000 [SYN] Seq=0 Win=9 Len=0 MSS=474 WS=1 SACK_PERM=1 TSval=2889901 TSecr=0
我希望這些資料包通過 MASQUERADE 過濾器,因此它們的來源位址會重寫為乙太網路主機的 IPv6 位址 ( eth0
)。然而,儘管我希望資料包符合 ip6tables 規則,但這種情況並沒有發生。事實上,封包甚至不符合任何 MASQUERADE 規則(由計數器見證pkts
)。我不知道如何調試這個 --- 有誰知道為什麼這些資料包沒有被偽裝?
我嘗試過的事情:
- 刪除所有
conntrack
條目:conntrack -f ipv6 -D
- 重新啟動機器。
感謝您的幫忙!
編輯:
這是一些更有用的輸出:
# ip6tables-save -c
# Generated by ip6tables-save v1.6.0 on Sun Sep 2 11:44:06 2018
*filter
:INPUT ACCEPT [1812:134308]
:FORWARD ACCEPT [22:1760]
:OUTPUT ACCEPT [1782:210084]
COMMIT
# Completed on Sun Sep 2 11:44:06 2018
# Generated by ip6tables-save v1.6.0 on Sun Sep 2 11:44:06 2018
*nat
:PREROUTING ACCEPT [1:137]
:INPUT ACCEPT [1:137]
:OUTPUT ACCEPT [41:5757]
:POSTROUTING ACCEPT [41:5757]
[0:0] -A PREROUTING -d 2001:470:4a71:f170::/64 -i eth0 -j DNAT --to-destination fdde:ad00:beef:0:91f5:6dd4:e66f:cf5b
[0:0] -A POSTROUTING -s fdde:ad00:beef::/64 -o eth0 -j MASQUERADE
[0:0] -A POSTROUTING -s fd11:22::/64 -o eth0 -p udp -j MASQUERADE
[0:0] -A POSTROUTING -s fd11:22::/64 -o eth0 -p tcp -j MASQUERADE
COMMIT
# Completed on Sun Sep 2 11:44:06 2018
# ip -6 link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether b8:27:eb:96:eb:75 brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether b8:27:eb:c3:be:20 brd ff:ff:ff:ff:ff:ff
4: tap0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 06:8a:53:01:68:f2 brd ff:ff:ff:ff:ff:ff
5: wpan0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1280 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 500
link/none
# ip -6 -brief address
lo UNKNOWN ::1/128
eth0 UP 2001:470:4a71:f000::11/64 fe80::ba27:ebff:fe96:eb75/64
wpan0 UNKNOWN fdde:ad00:beef:0:cc1e:c6e2:8252:e44b/64 fd11:22::1c4d:925:de45:9d30/64 fe80::1c4d:925:de45:9d30/64 fe80::2ccb:f19:edce:c49e/64
# ip -6 route
2001:470:4a71:f000::/64 dev eth0 proto kernel metric 256 pref medium
fd11:22::/64 dev wpan0 proto kernel metric 256 pref medium
fdde:ad00:beef::/64 dev wpan0 proto kernel metric 256 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
fe80::/64 dev wpan0 proto kernel metric 256 pref medium
default via 2001:470:4a71:f000::1 dev eth0 metric 1024 pref medium
答案1
事實證明,這是因為 TCP 校驗和不正確(主機的 TCP 堆疊有錯誤)。顯然tshark
預設不會顯示這一點,但它導致 ip6tables 不偽裝來源位址。
感謝大家的努力提供協助。關於 kasperd 的建議,事實證明類似的解決方案適用於我的設定(我有 /60,而不是 /48),所以我將嘗試擺脫 ip6tables。
編輯:我現在的設定無需 NAT 即可工作。感謝您提出這個建議。
答案2
好吧,我也有同樣的問題。解決方案很簡單,只需運行:“ip6tables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT”
問題是,ip6tables 程式碼預設不載入 conntrack 模組,因此有狀態規則顯然無法運作。
而對於“IPv6 不需要 NAT!” brigade - 有時您確實需要它,例如,如果您想在 AWS 上執行 Docker 容器。它不支援 DHCP PD,因此您只能使用 NAT。