VPN к Kubernetes-кластеру из удаленной сети
Мне нужно построить VPN-соединение между сетью и Kubernetes-кластером, чтобы приложения, размещенные в этой сети, могли обращаться к K8S-сервисам через защищенный туннель.
Итак, у меня есть несколько узлов K8S в автономной среде. Я добавил в эту среду отдельный сервер, этот сервер работает как VPN-шлюз, он подключен к той же VLAN, к которой подключены узлы кластера. Узлы имеют следующие IP-адреса:10.13.17.1/22
,10.13.17.2/22
,10.13.17.3/22
и так далее. VPN-шлюз имеет10.13.16.253/22
.
IP CIDR кластера — , IP CIDR модуля —10.233.64.0/18
.
VPN-сервер поддерживает межсайтовое соединение IPSec с удаленной сетью. Я использую Calico в качестве сетевого менеджера, поэтому настроил свой VPN-сервер для поддержания сеансов BGP со всеми узлами K8S. Таблица маршрутов VPN-сервера полна префиксов, объявленных узлами Calico (10.233.0.0/18
конечно, тоже присутствует), узлы кластера имеют и некоторые другие сети в своих таблицах маршрутизации, поэтому BGP, похоже, работает нормально. Все идет нормально...
Когда я устанавливаю соединение с сервисом внутри кластера с VPN-сервера, тоже все хорошо. Клиент() отправляет SYN-пакет сервису (10.233.10.101:1337
), воркер получает этот пакет, меняет его IP-адрес назначения на IP-адрес пода (10.233.103.49:1337
) и меняет исходный IP-адрес на некоторый IP-адрес (10.233.110.0
), который поможет работнику получить ответ и вернуть его инициатору соединения. Вот что происходит с работником, получившим этот SYN-пакет. SYN-пакет приходит работнику:
22:04:25.866546 IP 10.13.16.253.56297 > 10.233.10.101.1337: Flags [S], seq 3575679444, win 65228, options [mss 1460,nop,wscale 7,sackOK,TS val 1385938010 ecr 0], length 0
Упакованный в SYN файл подвергается SNAT и DNAT, а затем отправляется рабочему процессу, где работает модуль:
22:04:25.866656 IP 10.233.110.0.54430 > 10.233.103.49.1337: Flags [S], seq 3575679444, win 65228, options [mss 1460,nop,wscale 7,sackOK,TS val 1385938010 ecr 0], length 0
Пришёл ответ:
22:04:25.867313 IP 10.233.103.49.1337 > 10.233.110.0.54430: Flags [S.], seq 2017844946, ack 3575679445, win 28960, options [mss 1460,sackOK,TS val 1201488363 ecr 1385938010,nop,wscale 7], length 0
Ответ деСНАТируется и деДНАТируется для отправки инициатору соединения:
22:04:25.867533 IP 10.233.10.101.1337 > 10.13.16.253.56297: Flags [S.], seq 2017844946, ack 3575679445, win 28960, options [mss 1460,sackOK,TS val 1201488363 ecr 1385938010,nop,wscale 7], length 0
Итак, связь установлена и все довольны.
Но когда я пытаюсь подключиться к тому же сервису из внешней сети (), работник, получающий SYN-пакет, НЕ меняет IP-адрес источника, он меняет только IP-адрес назначения, поэтому IP-адрес источника пакета без изменений. Пакет SYN приходит к работнику
21:56:05.794171 IP 10.103.103.1.52132 > 10.233.10.101.1337: Flags [S], seq 3759345254, win 29200, options [mss 1460,sackOK,TS val 195801472 ecr 0,nop,wscale 7], length 0
Пакет SYN подвергается ДНК-тестированию и повторно отправляется работнику, на котором работает модуль.
21:56:05.794242 IP 10.103.103.1.52132 > 10.233.103.49.1337: Flags [S], seq 3759345254, win 29200, options [mss 1460,sackOK,TS val 195801472 ecr 0,nop,wscale 7], length 0
И ничего не приходит в ответ. :-(
Итак, я вижу, что IP-адрес назначения изменен, поэтому я вижу эти пакеты на воркере, где работает под, но ответов на них нет:
21:56:05.794602 IP 10.103.103.1.52132 > 10.233.103.49.1337: Flags [S], seq 3759345254, win 29200, options [mss 1460,sackOK,TS val 195801472 ecr 0,nop,wscale 7], length 0
Внешняя сеть (10.103.103.0/24
) объявляется VPN-сервером через BGP, поэтому все рабочие знают, что эта сеть доступна через . Когда я запускаю пинг-тест с хоста во внешней сети() на IP-адрес сервиса(10.233.10.101
), тест пройден, VPN работает нормально, и таблицы маршрутизации кажутся правильными.
Итак, почему сеть «доверяет» и не доверяет ? И почему воркер выполняет SNAT и DNAT для пакетов из10.13.16.253
и не выполняет SNAT для пакетов из10.103.103.1
? Должен ли я добавить какие-либо политики, чтобы разрешить этот трафик?
Заранее спасибо за любые подсказки!