同一主機上來自不同提供者的兩個 ipv6 隧道

同一主機上來自不同提供者的兩個 ipv6 隧道

我的問題與問題但差異不大:

我有一個 Ubuntu vps,主介面上有一個 IPv4。我想在這台機器上有兩個獨立的 IPv6 隧道,它們來自兩個不同的供應商,具有不同的端點位址。當我單獨嘗試其中一個時。一切都還好。但是當我添加第二個隧道時,第一個隧道仍然有效,但第二個隧道無法從外部 ping 通。不過,它可以 ping 通自身和網關。

我將這些行添加到我的/etc/network/interfaces

auto he-ipv6
iface he-ipv6 inet6 v4tunnel
        address 2001:xxx:xxx:xxxx::2
        netmask 64
        endpoint xx.xx.xx.xx
        local yy.yy.yyy.yy
        ttl 255
        gateway 2001:xxx:xxx:xxxx::1

auto sbtb-ipv6
iface sbtb-ipv6 inet6 v4tunnel
        address 2a09:xxx:xxx:xxxx::2
        netmask 64
        endpoint zz.zz.zz.zz
        local yy.yy.yyy.yy
        ttl 255
        gateway 2a09:xxx:xxx:xxxx::1

有誰知道問題出在哪裡或我該如何進一步解決這個問題?

答案1

幾點說明

對於網路配置工具以外的ifupdownv4tunnel確實是第3層隧道可以根據使用ip tunnel add FOO mode sit ...或 的等效工具建立ip link add name FOO type sit ...

第 3 層介面沒有第 2 層位址(無乙太網路 MAC 位址),因此不必解析底層 2 層的位址:第 3 層介面不會發生 ARP (IPv4) 和 NDP (IPv6) 。出於同樣的原因,沒有需要解析的網關:其網關屬性不需要網關,但語法仍然可以允許在創建路由表條目時猜測要使用的接口而不指定接口,這通常是所做的事情,包括隧道代理自帶的設定範例。最後,OP 的設定不需要使用 /64 網路遮罩和網關。但這個答案仍然會堅持這些設置,因此讀者可以更容易地將其適應第 2 層介面隧道,然後所有這些設定都將成為強制性的。同樣,通常只需要有關非預設介面(此處sbtb-ipv6)的設置,但無論如何我都為這兩個介面提供了設定。剩下的唯一差異是哪個介面取得主路由表中的預設路由。

多宿主和策略路由

現在這是一個案例使用多個地址的多宿主系統每個都有自己的到達 (IPv6) 互聯網的路徑。上游路由器肯定會實現嚴格反向路徑轉送(SRPF)用於反欺騙:每個來源位址必須透過其專用路徑傳輸。對於簡單路由,僅使用一個預設路由(顯示的第一個路由)。可以添加具有較長度量的第二個預設路由,但在具有較短度量的路由消失之前永遠不會選擇它。

為了克服這個問題,可以使用策略路由。這允許系統選擇其他路由表(填充有不同的路由)和路由規則,這些路由規則將使用附加選擇器選擇這些路由表,而不僅僅是使用目的地來尋找路由。這裡有用的是來源位址(在某些情況下,當該介面被強制使用時,還有傳出介面)SO_BINDTODEVICE)。

因此,目標是根據主路由表中的條目建立具有部分路由視圖的多個備用路由表:每個路由表將認為僅存在一條通往 Internet 的路徑,並將擁有自己的預設路由。然後,基於來源位址的路由規則將為傳出封包選擇適當的路由表。在 OP 的情況下,傳入資料包不需要任何特殊的操作,因為本地路由表已經處理了這種情況。

執行

首先interfaces應該透過添加不同的設定來調整設定公制在每個中,否則sbtb-ipv6設定可能會失敗,因為不能有兩個具有相同度量的預設路由。

然後手動執行以下操作。新增兩個路由表,HE 值為(任意)2000,SBTB 值為 2001,並僅將相關路由複製到每個路由表。公制在這裡並不重要,因為不存在可能的衝突。

ip -6 route add 2001:xxx:xxx:xxxx::/64 dev he-ipv6             table 2000
ip -6 route add default via 2001:xxx:xxx:xxxx::1 dev he-ipv6   table 2000

ip -6 route add 2a09:xxx:xxx:xxxx::/64 dev sbtb-ipv6           table 2001
ip -6 route add default via 2a09:xxx:xxx:xxxx::1 dev sbtb-ipv6 table 2001

並根據來源位址和路由規則選擇適當的路由(明確地說,聲明一個固定優先權並聲明它是本地發起的封包iif lo):

ip -6 rule add pref 20000 from 2001:xxx:xxx:xxxx::2 iif lo lookup 2000
ip -6 rule add pref 20010 from 2a09:xxx:xxx:xxxx::2 iif lo lookup 2001

對於綁定到介面(例如ping -I sbtb-ipv6 ...)而不是「簡單」到介面位址(ping -I 2a09:xxx:xxx:xxxx::2)的情況,也可以使用它來獲得正確的結果(對於主路由表中不存在第二條預設路由的第2 層情況非常有用,實際上並非如此)在 OP 具​​有第 3 層介面的情況下需要):

ip -6 rule add pref 20001 oif he-ipv6 lookup 2000
ip -6 rule add pref 20011 oif sbtb-ipv6 lookup 2001

當新增位址時,相反方向(傳入流量,又稱為入口)已在local路由表中正確處理,因​​此入口無需執行任何特殊操作。

最終配置

應先手動嘗試上述操作,並使用備份遠端控制台存取(儘管 IPv4 不受影響,但 IPv4 存取應該足夠了)。然後可以將其整合到設定檔中,在不支援該功能的地方(即:所有策略路由)interfaces使用up/down命令。ifupdown請務必刪除先前的手動測試,否則介面設定中的一些命令將與諸如此類的錯誤發生衝突,RTNETLINK answers: File exists並且介面配置將失敗。

更新:這還包括向 SBTB 隧道的遠端發出三個 ping,因為從評論來看,該隧道必須先看到來自伺服器的流量,然後才能接受到伺服器的流量。如果 SBTB(隧道)對等位址不足以觸發接受到伺服器的流量,請將其替換為一些「眾所周知的」IPv6 位址。可以在 HE 介面上添加相同的內容,但這似乎不需要。

auto he-ipv6
iface he-ipv6 inet6 v4tunnel
        address 2001:xxx:xxx:xxxx::2
        netmask 64
        endpoint xx.xx.xx.xx
        local yy.yy.yyy.yy
        ttl 255
        gateway 2001:xxx:xxx:xxxx::1
        metric 1000
        up   ip -6 route add 2001:xxx:xxx:xxxx::/64 dev he-ipv6 table 2000
        up   ip -6 route add default via 2001:xxx:xxx:xxxx::1 dev he-ipv6 table 2000
        up   ip -6 rule add pref 20000 from 2001:xxx:xxx:xxxx::2 iif lo lookup 2000
        up   ip -6 rule add pref 20001 oif he-ipv6 lookup 2000
        down ip -6 rule del pref 20001
        down ip -6 rule del pref 20000

auto sbtb-ipv6
iface sbtb-ipv6 inet6 v4tunnel
        address 2a09:xxx:xxx:xxxx::2
        netmask 64
        endpoint zz.zz.zz.zz
        local yy.yy.yyy.yy
        ttl 255
        gateway 2a09:xxx:xxx:xxxx::1
        metric 1001
        up   ip -6 route add 2a09:xxx:xxx:xxxx::/64 dev sbtb-ipv6 table 2001
        up   ip -6 route add default via 2a09:xxx:xxx:xxxx::1 dev sbtb-ipv6 table 2001
        up   ip -6 rule add pref 20010 from 2a09:xxx:xxx:xxxx::2 iif lo lookup 2001
        up   ip -6 rule add pref 20011 oif sbtb-ipv6 lookup 2001
        up ping -q -c3 -I sbtb-ipv6 2a09:xxx:xxx:xxxx::1
        down ip -6 rule del pref 20011
        down ip -6 rule del pref 20010

如何使用?

現在可以啟動一個或兩個接口,它將始終正常工作,並he-ipv6在兩個接口都啟動時優先考慮。要在兩者都啟動時使用該sbtb-ipv6接口,應綁定到其地址或綁定到接口本身。以下是顯示核心預期使用的路由的範例:

# ip route get to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from :: via 2001:xxx:xxx:xxxx::1 dev he-ipv6 src 2001:xxx:xxx:xxxx::2 metric 1000 pref medium

# ip route get from 2001:xxx:xxx:xxxx::2 to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from 2001:xxx:xxx:xxxx::2 via 2001:xxx:xxx:xxxx::1 dev he-ipv6 table 2000 src 2001:xxx:xxx:xxxx::2 metric 1024 pref medium

# ip route get oif he-ipv6 to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from :: via 2001:xxx:xxx:xxxx::1 dev he-ipv6 table 2000 src 2001:xxx:xxx:xxxx::2 metric 1024 pref medium

# ip route get from 2a09:xxx:xxx:xxxx::2 to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from 2a09:xxx:xxx:xxxx::2 via 2a09:xxx:xxx:xxxx::1 dev sbtb-ipv6 table 2001 src 2a09:xxx:xxx:xxxx::2 metric 1024 pref medium

# ip route get oif sbtb-ipv6 to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from :: via 2a09:xxx:xxx:xxxx::1 dev sbtb-ipv6 table 2001 src 2a09:xxx:xxx:xxxx::2 metric 1024 pref medium

各種命令、守護程式或工具需要各種選項來綁定到其他來源位址或裝置。例如:ping -Itraceroute -icurl --interfacessh -b/ssh -B等。

可以透過比較以下命令之一的結果來檢查:

curl -6 https://ifconfig.co
curl -6 --interface 2001:xxx:xxx:xxxx::2 https://ifconfig.co
curl -6 --interface he-ipv6 https://ifconfig.co

與其中之一的結果相比:

curl -6 --interface 2a09:xxx:xxx:xxxx::2 https://ifconfig.co
curl -6 --interface sbtb-ipv6 https://ifconfig.co

相關內容