IPなしのインターフェイスを介したMetalLB外部IP - 特定のゲートウェイを持つルートを追加することはできません。

IPなしのインターフェイスを介したMetalLB外部IP - 特定のゲートウェイを持つルートを追加することはできません。

私の住宅プロバイダが同じ/ 24サブネット上で複数のパブリックIPv4アドレスをルーティングするスイッチに物理的に接続された専用サーバークラスタがあります。ただし、そのサブネットの外部では、約14個のパブリックIPv4アドレスしか使用できません。 IPv4

私の目標は、複数のワーカーノードにわたって特定のIP(たとえば207.120.238.23(実際には私のIPではない)、ゲートウェイが207.120.238.1)のパブリックIPトラフィックを処理できるようにkubernetesクラスタにMetalLBを設定することです。 。したがって、WAN NIC がそれぞれ存在する多くの VM があり、すべて単一のパブリック IP にトラフィック負荷を分散します。

私のk8sクラスタVMには複数のネットワークインターフェイスがあります。 1つ目はLAN通信用のenX0で、次にISPインターネットアップリンクが接続されている各ハイパーバイザーの物理インターフェースにマップされたWANインターフェース(enX2)があります。

これを行う理由は、高価なパブリックIPv4アドレスを節約するためです。各k8sワーカーノードに静的パブリックIPv4アドレスを割り当てる必要がなくなり、そのIPv4にロードバランシングされたMetalLBトラフィックを提供するだけです。

これを達成するために、意図的にenX2にIPを割り当てることなく単にインポートしました。ここに私の/etc/network/interfacesスニペットがあります。

auto enX2
iface enX2 inet manual
  up ip link set dev $IFACE up
  down ip link set dev $IFACE down

次に、対応する 207.120.238.23 の着信トラフィックを処理するように MetalLB を設定しました。

これで動作しますが、着信トラフィックにのみ適用されます。 MetalLBがインターネットでトラフィックを処理するポート80または443に接続しようとすると、パケットはパブリックネットワークインターフェイスに到達し、このパブリックWANインターフェイスを使用するk8s-workersのスピーカーデーモンの1つがそれを処理します。

しかし、応答を再送信することはできません。-本当に方法がわからないからです。 LAN インターフェイス enX0 とまったく異なる発信パブリック IPv4 を使用するデフォルトのデフォルトゲートウェイを使用してパケットを再送信しようとします。

私は簡単だと思いました。ソースルーティングを使用し、207.120.238.1 enX2を介してデフォルトパスを使用するように指示するカスタムルートテーブルを使用して、207.120.238.23に送信されたすべてのパケットを処理するカスタムルールを設定します。

しかし、これも動作しません。インターフェイスに IP がない場合、カーネルはルート生成を許可しないようです。

# ip route add default via 207.120.238.1 dev enX2 table wan-route
Error: Nexthop has invalid gateway.

解決策はありますか?できますか?同じサブネット内のすべての k8s ワーカーノードに静的パブリック IPv4 を追加することは機能しますが、コストがかかり、IPv4 は、これらのルーティングが実際に可能であることをカーネルに確信させる以外に、他の目的には使用されません。

更新:「onlink」を使用するとうまくいくようです。これで、正しいゲートウェイを含むルートテーブルwan-routeにデフォルトルートが正常に作成されましたが、tcpdumpを使用するとenX2に到着したパケットを表示できますが、応答はenX0を介して送信されます。

私が設定したルールは次のとおりです。

# ip rule
0:  from all lookup local
32763:  from all fwmark 0x1 lookup wan-route
32764:  from 207.120.238.23 lookup wan-route
32765:  from 207.120.238.23/24 lookup wan-route
32766:  from all lookup main
32767:  from all lookup default

また、以下を使用してファイアウォールタグを作成しました。

iptables -t mangle -A PREROUTING -i enX2 -j MARK --set-mark 1

enX2を使用してenX2からのパケットに応答を送信する必要がありますが、それらの何も機能せず、enX0を介して応答を送信します。

答え1

私のクラスタでも同じことをしたので、net.ipv4.conf.eth220.rp_filter=0これらのインターフェイスを設定し、sysctl次にnetplan戻りパスのアドレスを指定する必要がありました。

     eth220:
        match:
            macaddress: 52:54:00:5d:29:01
        routes:
        -   on-link: false
            scope: link
            to: 172.20.0.0/16
        set-name: eth220

関連情報