Linux
如何創建 IPv6 覆蓋網路?
我想在兩台主機上創建僅限主機的 IPv6 網路,然後在它們之間進行路由。在每台主機上,都會有一個虛擬介面,位於
ipv6_prefix::9
. 我希望能夠從 另一台主機 ping 該介面。對此是否有完善的最佳實踐?使用 6in4 隧道可以做到這一點似乎是合理的。
下面,我將完成我最近在 EC2 中嘗試的設置,使用 6in4 進行隧道。兩個主機是
10.239.143.35
和10.238.249.113
。首先,讓我們設置虛擬介面。我們將使用這些 Bash 函式:function dummy { local name="$1" ipv6="$2" ip link add "$name" type dummy ip -6 addr add "$ipv6" dev "$name" ip link set "$name" up } function calc6to4 { printf '2002:%02x%02x:%02x%02x::\n' $(tr '.' ' ' <<<"$@") } function eth0ipv4 { ip addr list dev eth0 | egrep -o 'inet [^/]+' | head -n1 | cut -d' ' -f2 }
(您可以直接將這些粘貼到您的 shell 會話中。)
在第一台主機上,我們執行:
:; ipv4="$(eth0ipv4)" :; ipv6="$(calc6to4 "$ipv4")" :; echo "ipv4 = $ipv4" "ipv6 = $ipv6" ipv4 = 10.239.143.35 ipv6 = 2002:0aef:8f23:: :; dummy dummy9 "$ipv6"9 :; ip addr show dev dummy9 69: dummy9: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN link/ether e2:69:75:10:04:2c brd ff:ff:ff:ff:ff:ff inet6 2002:aef:8f23::9/128 scope global valid_lft forever preferred_lft forever inet6 fe80::e069:75ff:fe10:42c/64 scope link valid_lft forever preferred_lft forever
Ping 似乎工作正常:
:; ping6 -q -c1 "$ipv6"9 PING 2002:0aef:8f23::9(2002:aef:8f23::9) 56 data bytes --- 2002:0aef:8f23::9 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.040/0.040/0.040/0.000 ms
現在它在第二台主機上:
:; ipv4="$(eth0ipv4)" :; ipv6="$(calc6to4 "$ipv4")" :; echo "ipv4 = $ipv4" "ipv6 = $ipv6" ipv4 = 10.238.249.113 ipv6 = 2002:0aee:f971:: :; dummy dummy9 "$ipv6"9
Ping 檢查簽出:
:; ping6 -q -c1 "$ipv6"9 PING 2002:0aee:f971::9(2002:aee:f971::9) 56 data bytes --- 2002:0aee:f971::9 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.037/0.037/0.037/0.000 ms
現在是激動人心的時刻了:用 6in4 隧道連接主機。我們在兩台主機上使用以下 Bash 函式:
function tunnel { local name="$1" self_ipv4="$2" ipv4="$3" ipv6="$4" ip tunnel add "$name" mode sit ttl 64 remote "$ipv4" local "$self_ipv4" ip -6 addr add "$ipv6"1 dev "$name" ip -6 route add "$ipv6"/64 dev "$name" metric 1 ip link set "$name" up }
在第一台主機上:
################################### IPv4 and IPv6 from host 2 ## :; tunnel tun6in4 10.239.143.35 10.238.249.113 2002:0aee:f971::
在第二個:
################################### IPv4 and IPv6 from host 1 ## :; tunnel tun6in4 10.238.249.113 10.239.143.35 2002:0aef:8f23::
當我們試圖找到從第一個主機到 的路由
2002:aee:f971::9
,綁定到第二個虛擬設備時,我們得到了一個命中::; ip -6 route get 2002:aee:f971::9 2002:aee:f971::9 from :: dev tun6in4 src 2002:aee:f971::1 metric 0 cache
但是 ping 不起作用:
:; ping6 -q -c1 2002:aee:f971::9 PING 2002:aee:f971::9(2002:aee:f971::9) 56 data bytes --- 2002:aee:f971::9 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms
也許我需要添加一個地址
eth0
?
事實證明,為了讓這個簡單的 ping 測試正常工作,隧道應該在源主機上而不是目標主機(對等方)上具有 IPv6 地址。
function tunnel { local name="$1" self_ipv4="$2" self_ipv6="$3" ipv4="$4" ipv6="$5" ip tunnel add "$name" mode sit ttl 64 remote "$ipv4" local "$self_ipv4" ip -6 addr add "$self_ipv6"1 dev "$name" ip -6 route add "$ipv6"/64 dev "$name" metric 1 ip link set "$name" up }
隧道設置命令將是:
:; tunnel tun6in4 10.239.143.35 2002:0aef:8f23:: 10.238.249.113 2002:0aee:f971:: :; tunnel tun6in4 10.238.249.113 2002:0aee:f971:: 10.239.143.35 2002:0aef:8f23::