Client VPN suteikia klientui adresą, rankos paspaudimas baigiasi, o ryšys vis tiek niekur nedingsta. Prieš liesdami sertifikatus ar kliento versijas, pažiūrėkite į paties galutinio taško maršrutų lentelę. AWS Client VPN galutinis taškas persiunčia paketą tik tada, kai vienas iš jo maršrutų apima paskirties prefiksą; jei niekas nesutampa, paketas atmetamas galutiniame taške ir tikslinis mazgas niekada nepamato SYN.

Tai persiuntimo sprendimas, o ne autentifikavimo. Jis priimamas po to, kai tunelis pakyla ir kai įvertinamos autorizacijos taisyklės, todėl galiojantis sertifikatas ir galiojanti grupė vis tiek gali duoti negyvą ryšį.

Galutinis taškas persiunčia tik tai, ką apima jo maršrutų lentelė

Kiekvienas maršrutas yra paskirties CIDR ir potinklis, kuris turėtų gauti srautą. Galutinis taškas lygina kliento paskirties vietą su tuo sąrašu, parenka atitinkamą įrašą ir siunčia paketą į susietą potinklį. Nėra įrašo reiškia nėra kito šuolio.

Atkreipkite dėmesį, kuo maršrutas nėra. Tai ne VPC maršrutų lentelės įrašas ir jis nieko neautorizuoja. Autorizacijos taisyklės sprendžia, ar grupė gali pasiekti paskirties vietą; maršrutai sprendžia, ar galutinis taškas turi kur siųsti paketą. Abu turi sutapti, ir jie klysta su skirtingais simptomais, todėl spėliojimas, kuris sugedęs, kainuoja popietę.

Klasikinis neatitikimas yra suporuotas VPC. Kažkas prideda maršrutą 10.20.0.0/24, nors mazgas gyvena 10.20.4.0/24, todėl adresas patenka už kiekvieno įrašo. Kliento pusės įrašas rodo pasikartojančius SYN be atsakymo, o tikslo žurnalai nerodo visiškai nieko.

Perskaitykite maršrutų sąrašą prieš sertifikatą

Galutinio taško maršrutai yra atskiras objektas, todėl klauskite jų tiesiogiai, o ne skaitykite VPC lentelę:

aws ec2 describe-client-vpn-routes --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdef0 --query 'Routes[].{Dest:DestinationCidr,Target:TargetSubnet,Origin:Origin}'

Paimkite tikslų adresą ir prefikso ilgį iš nepavykstančio kliento, tada patikrinkite aprėptį po ženklą. Taikomas ilgiausio prefikso atitikimas, todėl platesnis maršrutas neišgelbės, kai siauresnis rodo į kitą vietą.

Vienas išteklius vienai paskirties vietai su for_each

Rankraštiniai maršrutų blokai pasislenka tą akimirką, kai kas nors konsolėje prideda prefiksą. Laikykite paskirties vietas žemėlapyje ir kurkite po vieną išteklių vienam raktui, kad kiekvienas papildymas ar pašalinimas liktų izoliuotas.

variable "client_vpn_routes" {
  type = map(string)
  default = {
    "10.20.0.0/16"  = "subnet-0aa11bb22cc33dd44"
    "172.31.0.0/20" = "subnet-0aa11bb22cc33dd44"
  }
}

resource "aws_ec2_client_vpn_route" "this" {
  for_each               = var.client_vpn_routes
  client_vpn_endpoint_id = var.client_vpn_endpoint_id
  destination_cidr_block = each.key
  target_vpc_subnet_id   = each.value
  depends_on             = [aws_ec2_client_vpn_network_association.this]
}

Išsaugokite priklausomybę nuo tinklo asociacijos. Maršrutui reikia susieto potinklio, todėl apply, kuris sukuria abu, turi pirmiausia išdėstyti asociaciją, o be šios nuorodos Terraform gali laisvai pirmiau išbandyti maršrutą. Tada perskaitykite planą: maršrutų papildymų skaičius turi atitikti jūsų pridėtus prefiksus. Jei planas taip pat pakeičia galutinį tašką, galutinio taško išteklius parašytas neteisingai, o jo taikymas atjungia kiekvieną prisijungusį klientą.

Galutinio taško, kurio nesukūrėte, perėmimas

Dauguma komandų paveldi konsolėje sukurtą galutinį tašką, todėl maršrutų kodo nėra. Nekurkkite antro galutinio taško vien tam, kad maršrutai patektų į Terraform.

Vietoj to importuokite arba perduokite id kaip kintamuosius ir palikite paveldėtus objektus nevaldomus. Importui reikia identifikatoriaus formato, kurį tiekėjas dokumentuoja kiekvienam išteklių tipui; jis užkoduoja galutinį tašką, paskirties prefiksą ir tikslinį potinklį. Nukopijuokite tą eilutę iš ištekliaus dokumentacijos, o ne sudarykite iš atminties, paleiskite planą ir tikėkitės jokių pakeitimų, kol nepridėsite ko nors naujo.

Sekite paketą ta tvarka, kuria jis keliauja

Kai maršrutas yra, o ryšys vis tiek nepavyksta, praeikite kelią iš eilės, o ne spėliokite viršutiniame sluoksnyje.

  1. Maršrutas: prefiksas apima paskirties vietą ir rodo į potinklį, susietą su galutiniu tašku.
  2. Autorizacija: autorizacijos taisyklė leidžia tą paskirties vietą vartotojo grupei. Vien maršrutas niekada nesuteikia prieigos.
  3. Grįžimo kelias: tikslinio potinklio maršrutų lentelė siunčia atsakymus atgal link galutinio taško, o saugos grupė leidžia prievadą iš kliento adresų telkinio.
  4. Programa: atidarykite tikrą TCP ryšį iš kliento, tada patvirtinkite, kad tikslo žurnalai rodo laukiamą šaltinio adresą iš telkinio.

Keiskite po vieną prefiksą kiekvienam apply, po to dar kartą perskaitykite maršrutų sąrašą ir kartu užrašykite paskirties vietą, autorizuojančią taisyklę ir grįžimo kelią. Kitas žmogus, derinantis atmestą ryšį, turėtų pradėti nuo šio sąrašo, o ne nuo sertifikatų teorijos.

Susiję straipsniai