AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1053636
Accepted
Volodymyr Melnyk
Volodymyr Melnyk
Asked: 2021-02-15 10:22:00 +0800 CST2021-02-15 10:22:00 +0800 CST 2021-02-15 10:22:00 +0800 CST

VPN para um cluster Kubernetes de uma rede remota

  • 772

Preciso criar uma conexão VPN entre uma rede e um cluster Kubernetes, para que os aplicativos hospedados nessa rede possam se dirigir aos serviços K8S por meio de um túnel seguro.

Então, eu tenho um monte de nós K8S em um ambiente auto-hospedado. Eu adicionei um servidor separado a este ambiente, este servidor funciona como um gateway VPN, está conectado à mesma VLAN à qual os nós do cluster estão conectados. Os nós têm os seguintes endereços IP: 10.13.17.1/22, 10.13.17.2/22e 10.13.17.3/22assim por diante. O gateway VPN tem 10.13.16.253/22.

O CIDR de IP do cluster é 10.233.0.0/18, o CIDR de IP do pod é 10.233.64.0/18.

O servidor VPN oferece suporte a uma conexão IPSec site a site com uma rede remota, 10.103.103.0/24. Eu uso o Calico como gerenciador de rede, então configurei meu servidor VPN para manter sessões BGP com todos os nós K8S. A tabela de rotas do servidor VPN está cheia de prefixos anunciados pelos nós Calico ( 10.233.0.0/18também está presente, é claro), os nós do cluster 10.103.103.0/24e algumas outras redes em suas tabelas de rotas, então o BGP parece estar funcionando bem. Até agora tudo bem...

Quando estabeleço uma conexão com um serviço dentro do cluster do servidor VPN, tudo fica bem também. O cliente ( 10.13.16.253) envia um pacote SYN para o serviço ( 10.233.10.101:1337), o trabalhador recebe este pacote, altera seu endereço IP de destino para o endereço IP do pod ( 10.233.103.49:1337) e altera seu endereço IP de origem para algum endereço IP ( 10.233.110.0) que ajudará o trabalhador a receber a resposta e devolvê-la ao iniciador da conexão. Aqui está o que acontece no trabalhador que recebe este pacote SYN. O pacote SYN chega a um trabalhador:

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

O SYN-packed está sendo SNATed e DNATed e, em seguida, está sendo enviado para o trabalhador onde o pod está sendo executado:

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

A resposta veio:

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

A resposta está sendo deSNATed e deDNATed para ser enviada ao iniciador de conexão:

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

Assim, a conexão é estabelecida e todos ficam felizes.

Mas quando eu tento conectar ao mesmo serviço da rede externa ( 10.103.103.0/24) o trabalhador que recebe o pacote SYN NÃO altera o endereço IP de origem, ele altera apenas o endereço IP de destino, então o endereço IP de origem do pacote é inalterado. O pacote SYN chega a um trabalhador

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

O pacote SYN está sendo DNAT e reenviado para o trabalhador onde o pod está sendo executado

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

E nada vem em resposta. :-(

Então, vejo que o endereço IP de destino foi alterado, então posso ver esses pacotes no trabalhador em que o pod está sendo executado, mas não há respostas para eles:

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

A rede externa ( 10.103.103.0/24) está sendo anunciada pelo servidor VPN via BGP, então todos os trabalhadores sabem que esta rede é acessível via 10.13.16.253. Quando executo o teste de ping de um host na rede externa ( 10.103.103.1) para o endereço IP do serviço ( 10.233.10.101), o teste passa, a VPN funciona bem e as tabelas de roteamento parecem estar corretas.

Então, por que a rede "confia" 10.13.16.253e não confia em 10.103.103.1? E por que o trabalhador executa SNAT e DNAT para os pacotes de 10.13.16.253e não executa SNAT para os pacotes de 10.103.103.1? Devo adicionar algumas políticas para permitir esse tráfego?

Desde já agradeço qualquer pista!

kubernetes calico
  • 1 1 respostas
  • 1434 Views

1 respostas

  • Voted
  1. Best Answer
    Volodymyr Melnyk
    2021-02-19T04:16:18+08:002021-02-19T04:16:18+08:00

    Porra!

    O pfSense estava quebrando a soma de verificação do pacote SYN:

    13:53:32.286601 IP (tos 0x0, ttl 62, id 33830, offset 0, flags [DF], proto TCP (6), length 60)
        10.103.103.1.47390 > 10.233.10.101.1337: Flags [S], cksum 0x86e4 (incorrect -> 0x99db), seq 4230752647, win 29200, options [mss 1460,sackOK,TS val 598846881 ecr 0,nop,wscale 7], length 0
            0x0000:  4500 003c 8426 4000 3e06 31e0 0a67 6701  E..<.&@.>.1..gg.
            0x0010:  0ae9 0a65 b91e 0539 fc2c 2987 0000 0000  ...e...9.,).....
            0x0020:  a002 7210 86e4 0000 0204 05b4 0402 080a  ..r.............
            0x0030:  23b1 ada1 0000 0000 0103 0307            #...........
    

    Desativei o recurso de descarregamento de soma de verificação de hardware e agora tudo funciona sem problemas.

    Muito obrigado a vocês pelo seu tempo e atenção!

    • 2

relate perguntas

  • Não é possível executar o Hyperkube (kubernetes) localmente via Docker

  • Distribuindo a carga de trabalho pelo Kubernetes

  • Tipo de máquina revertida da atualização do Kubernetes

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve