Dizüstü bilgisayarım bağlı gösteriyordu. AWS Client VPN istemcisi yeşil durumunu gösterdi, endpoint bir oturum kaydetti ve yine de özel bir alt ağdaki EC2 örneğinde MongoDB portunu açamadım. Görünürde hiçbir şey bozuk değildi: sertifika geçerliydi, profil konsoldan geliyordu ve tünel trafik taşıyordu. Hata bendeydi, çünkü bağlı kelimesini yetkili olarak okuyordum.

Oturum açma tam olarak tek bir soruyu yanıtlar: bu kimlik bir oturum kurabilir mi? Sonrasındaki her şeye, sertifikanızı asla görmeyen ayrı kurallar karar verir. Kimlik doğrulamasından geçen oturum ile varan paket iki farklı başarıdır ve aralarındaki boşluk, VPN açık ama ana makineye ulaşılamıyor türünden bildirimlerin çoğunun yaşadığı yerdir.

Aşağıdaki kontroller şu anda kullandığım sıradır.

Bağlı bir oturum gerçekte neyi kanıtlar

El sıkışma sırasında endpoint, istemci sertifikasını kendi trust store'una karşı doğrular veya SAML yapılandırıldığında tarayıcıyı kimlik sağlayıcınıza yönlendirir. Bu geçerse istemci, endpoint'in istemci CIDR'ından bir adres alır ve konsol etkin bir bağlantı gösterir. O alışverişin hiçbir noktasında 10.0.4.17'ye 27017 portundan ulaşıp ulaşamayacağınız sorulmaz.

Bir hedef için izin, endpoint üzerinde ayrı bir nesnedir. Her akış yetkilendirme kurallarıyla karşılaştırılır ve her kural bir hedef CIDR'ını, kuralın verildiği grupla eşleştirir. Hiçbir kural hedefi kapsamıyorsa endpoint oturumu kabul eder ve trafiği düşürür. Banner yok, yeniden bağlanma döngüsü yok ve istemci arayüzünde reddedildi diyen hiçbir şey yok.

Yetkilendirme kuralını VPC ile değil, kaynakla karşılaştırın

Kuralları listeleyin ve örneğin gerçekte sahip olduğu adresin yanına koyun:

aws ec2 describe-client-vpn-authorization-rules \
  --client-vpn-endpoint-id cvpn-endpoint-0a1b2c3d4e5f6a7b8

Çıktı, her kural için bir hedef CIDR ve bir grup kimliği gösterir. İçinde iki arıza saklıdır. Kural 10.0.0.0/16'yı yetkilendiriyor olabilir, oysa örnek 10.1.0.0/16 üzerindeki eşlenmiş bir VPC'de durur; eşleme yolu vardır ama kimse ikinci aralık için yetkilendirme kuralı yazmamıştır. Ya da kural, kullanıcının dizinde üye olduğu ama endpoint'in değerlendirdiği grupta olmadığı bir dizin grubunu işaret eder.

Hedefi kapsayan en dar kuralı yazın ve ikinci bir CIDR gerçekten gerektiğinde ikinci kuralı ekleyin. Hızlı başlangıçtan gelen geniş 0.0.0.0/0 kuralı çalışır ve bu yüzden üretime kadar yaşar ve modeli gizler.

Paketin hareket edip etmeyeceğine iki yönlendirme tablosu karar verir

Bir endpoint yolu, hedef CIDR'ını endpoint'in ilişkili olduğu alt ağlardan birine eşler. Bu, yolun yarısıdır. Alt ağın kendi yönlendirme tablosu paketi nasıl ileteceğini hâlâ bilmelidir ve bu, hedef bir eşleme bağlantısının, bir transit gateway'in veya şube arası tünelle ulaşılabilen yerel bir aralığın arkasında olduğu anda önem kazanır.

aws ec2 describe-client-vpn-routes \
  --client-vpn-endpoint-id cvpn-endpoint-0a1b2c3d4e5f6a7b8

Hedefi kaynağın CIDR'ıyla eşleşen ve hedefi ilişkili bir alt ağ olan bir yol arayın. Yol yoksa ekleyin. Varsa ve ana makine hâlâ sessizse, boşluk VPC tarafındadır, bu yüzden ilişkilendirme alt ağının yönlendirme tablosuyla karşılaştırın.

İstemci tarafındaki bir ayar tüneli bozmadan yönlendirmeyi bozar: route-nopull içeren bir profil. Bu yönerge, OpenVPN tabanlı istemciye sunucunun ittiği yolları yok saymasını söyler, böylece arayüz yalnızca endpoint'in kendi adresiyle açılır ve hedefin hiç yolu olmaz. Linux'ta ip route show veya macOS'ta netstat -rn ile tun arayüzünden bir yol olup olmadığını kontrol edin. Yoksa, dışa aktarılan profilden route-nopull'u kaldırın ve itilen yolların uygulanması için yeniden bağlanın.

Güvenlik grupları istemci adresinizi görmez

Bir öğleden sonra yanlış bildiğim kısım bu. Bir alt ağa bağlı IPv4 endpoint için hizmet, istemcinin kaynak adresini o alt ağdaki endpoint'in ağ arayüzü adresine çevirir. Örneğe varan paket, istemcinizin gösterdiği adresi taşımaz, bu yüzden istemci havuzuna, diyelim 172.16.0.0/22'ye izin veren bir güvenlik grubu kuralı hiçbir şeyle eşleşmez.

Porta istemci CIDR'ından değil, ilişkilendirmenin arayüzüne bağlı endpoint güvenlik grubundan izin verin. Gruba başvurmak, adresi sabit kodlamaktan daha kalıcıdır, çünkü arayüz adresi sizin denetiminizde değildir. Ağ ACL'leri durumsuzdur, bu yüzden özel girdilerin olduğu yerde hem gelen hem giden yön akışa izin vermelidir.

Örneğin özel adresine de bağlanın. Genel bir IP paketi VPC'den çıkarır ve başka kurallarla başka bir yoldan geri sokar, bu yüzden genel adres üzerinden yapılan test özel yol hakkında hiçbir şey söylemez.

İlk arızada duran bir yalıtım sırası

Bunları sırayla yapın ve biri başarısız olduğu yerde durun. Her adım tüm katmanları değil, bir katmanı dışlar.

  1. Oturumun hangi kimliği kullandığını ve endpoint'in hangi grubu değerlendirdiğini doğrulayın. Bir trust store'dan gelen sertifika, dizinden gelen SAML iddiasıyla aynı asıl değildir.
  2. Yetkilendirme kuralının o grup için kaynağın CIDR'ını kapsadığını doğrulayın.
  3. Bir endpoint yolunun var olduğunu ve ilişkili bir alt ağı hedeflediğini, ardından alt ağın yönlendirme tablosunun ileri iletebildiğini doğrulayın.
  4. Güvenlik grubunun porta istemci havuzundan değil, endpoint arayüzünden izin verdiğini doğrulayın.
  5. Uygulama sorununu istemci yolu sorunundan ayırmak için VPC'nin içinden, aynı alt ağdaki başka bir örnekte SSM oturumuyla test edin.

Adımlar belirleyici olmadığında dayandığım tablo budur:

SymptomLayer to inspect
Client shows connected, host times out, no byte growth on the interfaceAuthorization rule, then security group
Ping fails but a TCP connect to the port succeedsICMP is blocked; not an access failure
Tunnel reconnects every few minutesTwo machines sharing one client certificate
Works on one laptop, fails on anotherLocal profile has route-nopull or stale pushed routes

İki hesap ayrıntısı, izin hatasına benzeyen belirtiler üretir. Her kullanıcının ayrı bir istemci sertifikasına ihtiyacı vardır; birini iki makine arasında paylaşmak oturumların birbirini itmesine yol açar ve sonuç ret değil, yeniden bağlanma döngüsüdür. Yeni bir endpoint oluşturulduğunda konsol, bazı istemci sürümlerinin yalnızca endpoint sayfasında gösterilen rastgele önekle kabul ettiği bir DNS adı gösterir, bu yüzden adı yeniden kurmak yerine tamamını kopyalayın.

Beşinci adım sizi tıkarsa, bir şeyi değiştirmeden önce endpoint'in bağlantı günlüğünü alın ve yetkilendirme kayıtlarını okuyun. Günlük, denetlenen hedefi ve eşleşen ya da eşleşmeyen kuralı adlandırır ve bu, dört katmanlı soruyu tek bir yanıta indirger.

İlgili makaleler