Calico Network поддерживает шифрование WireGuard

Calico поддерживает шифрование WireGuard как для IPv4, так и для IPv6 трафика, которое можно независимо включать с помощью параметров в ресурсе FelixConfiguration.

Содержание

Статус установки

Установка по умолчанию

Операционная системаВерсия ядра
Linux5.6 и выше установлены по умолчанию
Ubuntu 20.045.4.0-135-generic
Kylin Linux Advanced Server V10 - SP34.19.90-52.22.v2207.ky10.x86_64

Не установлено по умолчанию

Операционная системаВерсия ядра
openEuler4.18.0-147.5.2.13.h996.eulerosv2r10.x86_64
CentOS 73.10.0-1160.el7.x86_64
Redhat 8.74.18.0-425.3.1.el8.x86_64
Kylin Linux Advanced Server V10 - SP24.19.90-24.4.v2101.ky10.x86_64
Kylin Linux Advanced Server V10 - SP14.19.90-23.8.v2101.ky10.x86_64
Kylin Linux Advanced Server V104.19.90-11.ky10.x86_64

Терминология

ТерминОбъяснение
wireguardEnabledВключить шифрование для IPv4 трафика поверх IPv4 Underlay сети.
wireguardEnabledV6Включить шифрование для IPv6 трафика поверх IPv6 Underlay сети.

Примечания

  1. При использовании сетевого плагина Calico убедитесь, что параметр natOutgoing установлен в true для поддержки шифрования WireGuard. По умолчанию этот параметр корректно настроен для подсети Calico при создании кластера и не требует дополнительной настройки.

  2. WireGuard поддерживает шифрование как для IPv4, так и для IPv6 трафика; если необходимо шифровать оба типа трафика, настройка должна выполняться отдельно. Для подробной настройки параметров обратитесь к Felix Configuration Documentation, настраивая параметры wireguardEnabled и wireguardEnabledV6.

  3. Если WireGuard не установлен по умолчанию, обратитесь к WireGuard Installation Guide для ручной установки, хотя возможны случаи, когда ручная установка модуля WireGuard не удаётся.

  4. Трафик между контейнерами на разных узлах будет зашифрован, включая сетевой трафик с одного хоста на другой; однако связь между Pod на одном узле и трафик между Pod и его хост-узлом не будет зашифрована.

Требования

  • WireGuard должен быть установлен на всех узлах кластера заранее. Для подробностей обратитесь к WireGuard Installation Documentation. Узлы без установленного WireGuard не поддерживают шифрование.

Процедура

  1. Включите или отключите шифрование для IPv4 и IPv6.

    Примечание: Следующие команды необходимо выполнять в CLI-инструменте на Master-узле, где находится узел.

    • Включить шифрование только для IPv4

      kubectl patch felixconfiguration default --type='merge' -p '{"spec":{"wireguardEnabled":true}}'
    • Включить шифрование только для IPv6

      kubectl patch felixconfiguration default --type='merge' -p '{"spec":{"wireguardEnabledV6":true}}'
    • Включить шифрование для IPv4 и IPv6

      kubectl patch felixconfiguration default --type='merge' -p '{"spec":{"wireguardEnabled":true,"wireguardEnabledV6":true}}'
    • Отключить шифрование для IPv4 и IPv6

      • Способ 1: Выполнить команду в CLI для отключения шифрования.

        kubectl patch felixconfiguration default --type='merge' -p '{"spec":{"wireguardEnabled":false,"wireguardEnabledV6":false}}'
      • Способ 2: Изменить конфигурационный файл felixconfiguration для отключения шифрования.

        1. Выполните команду для открытия конфигурационного файла felixconfiguration.

          kubectl get felixconfiguration -o yaml default
        2. Установите параметры wireguardEnabled и wireguardEnabledV6 в false для отключения шифрования WireGuard.

          apiVersion: crd.projectcalico.org/v1
          kind: FelixConfiguration
          metadata:
            annotations:
              projectcalico.org/metadata: '{"uid":"f5facabd-8304-46d6-81c1-f1816235b487","creationTimestamp":"2024-08-06T03:46:51Z"}'
            generation: 2
            name: default
            resourceVersion: "890216"
          spec:
            bpfLogLevel: ""
            floatingIPs: Disabled
            logSeverityScreen: Info
            reportingInterval: 0s
            wireguardEnabled: false # Измените на true для включения шифрования IPv4
            wireguardEnabledV6: false # Измените на true для включения шифрования IPv6
  2. После завершения настройки шифрования Calico WireGuard выполните следующую команду для подтверждения статуса шифрования WireGuard. Если включено шифрование IPv4 и IPv6, наличие wireguardPublicKey или wireguardPublicKeyV6 в поле Status указывает на успешное включение; если шифрование IPv4 и IPv6 отключено, эти поля не будут содержать wireguardPublicKey или wireguardPublicKeyV6, что означает успешное отключение.

    calicoctl get node <NODE-NAME> -o yaml # Замените <NODE-NAME> на имя узла.

    Вывод:

    Status:
        wireguardPublicKey: L/MUP9+Yxx/xxxxxxxxxxxx/xxxxxxxxxx =

Проверка результата

В этом документе приведён пример проверки трафика IPv4; проверка трафика IPv6 аналогична IPv4 и не повторяется.

Проверка трафика IPv4

  1. После настройки шифрования WireGuard проверьте информацию о маршрутизации, где трафик между узлами преимущественно использует интерфейс wireguard.cali для пересылки сообщений.

    root@test:~# ip rule   # Просмотр текущих правил маршрутизации
         0: from all lookup local
         99:  not from all fwmark 0x100000/0x100000 lookup 1    # Для всех пакетов без метки 0x100000 используется таблица маршрутизации 1
         32766:  from all lookup main
         32767 :  from all lookup default
    
    root@test:~# ip route show table 1    # Отобразить записи маршрутизации для таблицы 1.
        10.3.138.0 dev wireguard.cali scope link
        10.3.138.0/26 dev wireguard.cali scope link
        throw 10.3.231.192
        10.3.236.128 dev wireguard.cali scope link     # Трафик к IP 10.3.236.128 будет отправляться через интерфейс wireguard.cali
        10.3.236.128/26 dev wireguard.cali scope link
        throw 10.10.10.124/30
        10.10.10.200/30 dev wireguard.cali scope link
        throw 10.10.20.124/30
        10.10.20.200/30 dev wireguard.cali scope link
        throw
        10.13.138.0 dev wireguard.cali scope link
        10.13.138.0/26 dev wireguard.cali scope link
        throw 10.13.231.192/26
        10.13.236.128 dev wireguard.cali scope link
        10.13.236.128/26 dev wireguard.cali scope link
    
    root@test:~# ip r get 10.10.10.202    # Маршрут от текущего узла до IP 10.10.10.202
        10.10.10.202 dev wireguard.cali table 1 src 10.10.10.127 uid 0  cache   # При доступе к IP 10.10.10.202 пакет будет отправлен через интерфейс wireguard.cali, используя таблицу маршрутизации 1, с исходным адресом 10.10.10.127
    
    root@test:~# ip route    # Показать основную таблицу маршрутизации
        default via 192.168.128.1 dev eth0 proto static
        10.3.138.0/26 via 10.3.138.0 dev vxlan.
        blackhole 10.3.231.193
        10.3.231.194
        10.3.231.195
        10.3.231.196
        10.3.231.197
        3.231.192/26 proto 80
        dev cali8dcd31cIdOO scope link
        dev cali3012b5b29b scope link
        dev calibeefea2ff87 scope link
        dev cali2b27d5e4053 scope link
        dev cali1a35dbdd639 scope link
        calico on link
  2. Захват пакетов на узле для наблюдения трафика между узлами.

    root@test:~# ip a s wireguard.cali    # Просмотр подробной информации об интерфейсе wireguard.cali
        30: wireguard.cali: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1440 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 10.10.10.127/32 scope global wireguard.cali   # IP-адрес интерфейса wireguard.cali — 10.10.10.127
        valid_lft forever preferred_lft forever
    
    root@test:~# tcpdump -i wireguard.cali -nnve icmp   # Захват и отображение ICMP пакетов через wireguard.cali
        tcpdump: listening on wireguard.cali, link-type RAW (Raw IP), capture size 262144 bytes
        08:58:36.987559 ip: (tos 0x0, ttl 63, id 29731, offset 0, flags [DF], proto ICMP (1), length 84)
        10.10.10.125 > 10.10.10.202: ICMP echo request, id 1110, seq 0, length 64
        08:58:36.988683 ip: (tos 0x0, ttl 63, id 1800, offset 0, flags [none], proto ICMP (1), length 84)
        10.10.10.202 > 10.10.10.125: ICMP echo reply, id 1110, seq 0, length 64
        2 packets captured
        2 packets received by filter
        0 packets dropped by kernel
  3. Тестирование показывает, что трафик типа IPv4 пересылается через интерфейс wireguard.cali.