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에는 여러 네트워크 인터페이스가 있습니다. 첫 번째는 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의 스피커 데몬 중 하나가 이를 처리합니다.

하지만 응답을 다시 보낼 수는 없습니다.- 정말 방법을 모르기 때문이죠. 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

관련 정보