Takip et

DigitalOcean ve AWS VPC’leri Arasında IPSec VPN Bağlantısı Kurma (Terraform ile)

DigitalOcean ve AWS VPC’leri Arasında IPSec VPN Bağlantısı Kurma (Terraform ile) Giriş Günümüzün hızla gelişen bulut bilişim dünyasında

DigitalOcean ve AWS VPC’leri Arasında IPSec VPN Bağlantısı Kurma (Terraform ile)

Giriş

Günümüzün hızla gelişen bulut bilişim dünyasında, şirketler genellikle tek bir bulut sağlayıcısına bağlı kalmak yerine, iş yüklerini farklı platformlara dağıtarak esneklik, maliyet optimizasyonu ve felaket kurtarma yeteneklerini artırmayı hedefler. Bu “multi-cloud” stratejisi, farklı bulut ortamları arasında güvenli ve kesintisiz iletişim kurma ihtiyacını doğurur. Özellikle, sanal özel bulutlar (VPC’ler) arasında veri aktarımı ve hizmet erişimi gerektiğinde, IPSec VPN tünelleri en yaygın ve güvenilir çözümlerden biri olarak öne çıkar. Bu makale, Amazon Web Services (AWS) ve DigitalOcean VPC’leri arasında IPSec VPN bağlantısını Terraform kullanarak nasıl kuracağınızı adım adım açıklamaktadır. Terraform’un altyapıyı kod olarak (Infrastructure as Code – IaC) yönetme yeteneği sayesinde, bu karmaşık yapılandırma süreci otomatikleştirilecek, tekrarlanabilir ve hataya daha az açık hale getirilecektir.

Temel Kavramlar

Bu makalede ele alınan çözümün temelini oluşturan bazı önemli kavramları anlamak, yapılandırma sürecini kavramak için hayati öneme sahiptir.

IPSec VPN Nedir?

IPSec (Internet Protocol Security), IP iletişimleri için bir güvenlik protokolleri paketidir. Temel olarak, IP paketlerinin bütünlüğünü, kimlik doğrulamasını ve gizliliğini sağlamak amacıyla kullanılır. Bir IPSec VPN tüneli, iki ağ arasında şifrelenmiş ve kimliği doğrulanmış bir bağlantı kurarak, genel internet üzerinden özel ve güvenli bir iletişim kanalı oluşturur. IPSec, iki ana protokolden oluşur:
* Authentication Header (AH): Veri bütünlüğü ve kimlik doğrulama sağlar.
* Encapsulating Security Payload (ESP): Gizlilik (şifreleme), veri bütünlüğü ve kimlik doğrulama sağlar. Genellikle VPN tünellerinde ESP kullanılır.

IPSec VPN’ler, IKE (Internet Key Exchange) protokolü üzerinden iki aşamalı bir el sıkışma süreciyle kurulur:
* Faz 1 (Main Mode veya Aggressive Mode): Güvenli bir kanal oluşturulur ve anahtarlar değiş tokuş edilir. Bu aşamada kimlik doğrulama (önceden paylaşılan anahtar – PSK veya sertifikalar) gerçekleşir.
* Faz 2 (Quick Mode): Faz 1’de kurulan güvenli kanal üzerinden, gerçek veri trafiği için IPSec güvenlik ilişkileri (Security Associations – SA’lar) oluşturulur. Bu SA’lar, kullanılacak şifreleme algoritmalarını, karma algoritmalarını ve anahtarları tanımlar.

VPC (Virtual Private Cloud)

VPC, bulut sağlayıcısı içinde size özel, mantıksal olarak izole edilmiş bir ağ bölümüdür. Kendi IP adres aralığınızı, alt ağlarınızı, yönlendirme tablolarınızı ve ağ geçitlerinizi tanımlayabilirsiniz.
* AWS VPC: Amazon’un sunduğu sanal ağ hizmetidir. EC2 instance’ları, veritabanları ve diğer AWS kaynakları bu VPC içinde barındırılır.
* DigitalOcean VPC: DigitalOcean’ın sağladığı benzer bir hizmettir. Droplet’ler, veritabanları ve diğer DigitalOcean kaynakları bu VPC içinde konumlandırılır.

Terraform

Terraform, HashiCorp tarafından geliştirilen, altyapıyı kod olarak (Infrastructure as Code – IaC) tanımlamak ve sağlamak için kullanılan açık kaynaklı bir araçtır. Terraform ile, bulut kaynaklarınızı (VPC’ler, sanal makineler, veritabanları vb.) insan tarafından okunabilir yapılandırma dosyaları kullanarak tanımlayabilir, ardından bu tanımları kullanarak altyapınızı otomatik olarak oluşturabilir, değiştirebilir ve silebilirsiniz. Terraform’un temel faydaları şunlardır:
* Otomasyon: Altyapı kurulumunu otomatikleştirir.
* Versiyon Kontrolü: Kod olarak tanımlandığı için altyapı değişiklikleri versiyonlanabilir.
* Tekrarlanabilirlik: Aynı yapılandırma dosyasıyla birden fazla ortamı tutarlı bir şekilde oluşturabilir.
* Multi-Cloud Desteği: AWS, Azure, Google Cloud, DigitalOcean gibi birçok bulut sağlayıcısını destekler.

Mimari Tasarım

Bu bölümde, DigitalOcean ve AWS arasında kuracağımız IPSec VPN bağlantısının genel mimarisini ve kullanılacak bileşenleri açıklayacağız.

Bağlantı Şeması

Temel olarak, iki ayrı bulut sağlayıcısında (AWS ve DigitalOcean) birer VPC’miz olacak. Her iki VPC’nin de kendi özel IP adres aralıkları bulunacak ve bu aralıklar çakışmayacak.
* AWS Tarafı: Bir Virtual Private Gateway (VPG) ve bir Customer Gateway (CGW) kullanacağız. VPG, AWS VPC’mizin VPN bağlantısını sonlandıran taraf olacak. CGW ise DigitalOcean tarafındaki VPN sunucumuzun genel IP adresini temsil edecek. AWS Site-to-Site VPN hizmeti bu iki bileşen arasında bir VPN tüneli kuracak. AWS VPC’mizdeki yönlendirme tabloları, DigitalOcean VPC’sine gitmesi gereken trafiği VPG üzerinden yönlendirecek şekilde yapılandırılacak.
* DigitalOcean Tarafı: Bir Droplet’i (sanal sunucu) VPN sunucusu olarak kullanacağız. Bu Droplet üzerine açık kaynaklı strongSwan yazılımını kuracağız. Droplet’e bir Floating IP (genel statik IP) atayarak, AWS tarafındaki Customer Gateway’in hedefi olmasını sağlayacağız. DigitalOcean VPC’mizdeki yönlendirme tabloları, AWS VPC’sine gitmesi gereken trafiği VPN Droplet’i üzerinden yönlendirecek şekilde ayarlanacak.

Gereksinimler

* Her iki VPC için çakışmayan IP adres aralıkları.
* DigitalOcean VPN Droplet’i için bir Floating IP.
* Güvenlik grupları ve firewall kuralları ile VPN trafiğine (UDP 500 ve UDP 4500) izin verilmesi.
* Yönlendirme tablolarının doğru şekilde yapılandırılması.

Kullanılacak Bileşenler

* AWS:
* VPC: Sanal özel bulut ortamımız.
* Subnet: VPC içindeki IP adres aralığı.
* Internet Gateway (IGW): VPC’nin internete çıkışını sağlar.
* Customer Gateway (CGW): DigitalOcean VPN sunucusunun genel IP adresini temsil eder.
* Virtual Private Gateway (VPG): AWS VPC’sinin VPN bağlantısını sonlandıran taraf.
* VPN Connection: CGW ile VPG arasında IPSec tünelini kuran ana kaynak.
* Route Tables: Trafiğin nasıl yönlendirileceğini belirler.
* Security Groups: Instance’lara gelen ve giden trafiği kontrol eder.
* DigitalOcean:
* VPC: Sanal özel bulut ortamımız.
* Droplet: VPN sunucusu olarak görev yapacak sanal makine (Ubuntu üzerinde strongSwan).
* Floating IP: Droplet’e atanmış statik genel IP adresi.
* Firewall: Droplet’e gelen ve giden trafiği kontrol eder.
* SSH Key: Droplet’e güvenli erişim için.
* VPN Yazılımı: strongSwan (DigitalOcean Droplet üzerinde).

Ön Koşullar ve Hazırlık

Başlamadan önce aşağıdaki adımları tamamlamanız gerekmektedir:

1. AWS Hesabı ve Kimlik Bilgileri: Bir AWS hesabınız olmalı ve Terraform’un AWS kaynaklarını yönetebilmesi için yeterli izinlere sahip bir IAM kullanıcı (erişim anahtarı ve gizli anahtar) oluşturmuş olmalısınız.
2. DigitalOcean Hesabı ve API Token: Bir DigitalOcean hesabınız olmalı ve Terraform’un DigitalOcean kaynaklarını yönetebilmesi için bir Personal Access Token (API Token) oluşturmuş olmalısınız. Token’a read ve write izinleri verilmelidir.
3. Terraform Kurulumu: Yerel makinenize Terraform CLI’yı kurmuş olmalısınız. Terraform’un resmi web sitesinden kurulum talimatlarına ulaşabilirsiniz.
4. SSH Anahtar Çifti Oluşturma: DigitalOcean Droplet’ine erişmek için bir SSH anahtar çifti oluşturmanız gerekecektir (örneğin, ssh-keygen -t rsa -b 4096 -f ~/.ssh/do_vpn_key). Genel anahtarı (.pub uzantılı olanı) Terraform aracılığıyla DigitalOcean’a yükleyeceğiz.

Terraform ile Altyapı Oluşturma

Terraform yapılandırmamızı düzenli tutmak için genellikle birden fazla .tf dosyası kullanırız. Örnek bir yapılandırma için main.tf, variables.tf, outputs.tf ve providers.tf dosyalarını kullanacağız.

// providers.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
    digitalocean = {
      source  = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

provider "aws" {
  region = var.aws_region
}

provider "digitalocean" {
  token = var.do_token
}
// variables.tf
variable "aws_region" {
  description = "AWS bölgesi"
  type        = string
  default     = "eu-central-1" # Frankfurt
}

variable "do_region" {
  description = "DigitalOcean bölgesi"
  type        = string
  default     = "fra1" # Frankfurt
}

variable "aws_vpc_cidr" {
  description = "AWS VPC CIDR bloğu"
  type        = string
  default     = "10.0.0.0/16"
}

variable "do_vpc_cidr" {
  description = "DigitalOcean VPC CIDR bloğu"
  type        = string
  default     = "10.1.0.0/16"
}

variable "do_token" {
  description = "DigitalOcean API token"
  type        = string
  sensitive   = true
}

variable "ssh_public_key_path" {
  description = "SSH genel anahtarının yolu"
  type        = string
  default     = "~/.ssh/do_vpn_key.pub"
}
// outputs.tf
output "aws_vpc_id" {
  description = "Oluşturulan AWS VPC ID"
  value       = aws_vpc.main.id
}

output "do_vpc_id" {
  description = "Oluşturulan DigitalOcean VPC ID"
  value       = digitalocean_vpc.main.id
}

output "do_vpn_droplet_ip" {
  description = "DigitalOcean VPN Droplet'inin genel IP adresi"
  value       = digitalocean_floating_ip.vpn_ip.ip_address
}

output "aws_vpn_connection_tunnel_info" {
  description = "AWS VPN Bağlantı Tünel Bilgileri"
  value       = aws_vpn_connection.do_vpn_connection.tunnel1_ip_address
}

#### AWS Kaynakları

// main.tf (AWS Bölümü)

AWS VPC

resource "aws_vpc" "main" { cidr_block = var.aws_vpc_cidr enable_dns_hostnames = true tags = { Name = "aws-do-vpn-vpc" } }

AWS Subnet

resource "aws_subnet" "public" { vpc_id = aws_vpc.main.id cidr_block = cidrsubnet(aws_vpc.main.cidr_block, 8, 0) # 10.0.0.0/24 availability_zone = "${var.aws_region}a" map_public_ip_on_launch = true tags = { Name = "aws-do-vpn-public-subnet" } }

AWS Internet Gateway (IGW)

resource "aws_internet_gateway" "main" { vpc_id = aws_vpc.main.id tags = { Name = "aws-do-vpn-igw" } }

AWS Virtual Private Gateway (VPG)

resource "aws_vpn_gateway" "main" { vpc_id = aws_vpc.main.id tags = { Name = "aws-do-vpn-vpg" } }

AWS Customer Gateway (CGW) - DigitalOcean VPN Droplet'inin Floating IP'si

resource "aws_customer_gateway" "do_vpn_cgw" { bgp_asn = 65000 # Örnek ASN ip_address = digitalocean_floating_ip.vpn_ip.ip_address # DigitalOcean Droplet'inin Floating IP'si type = "ipsec.1" tags = { Name = "do-vpn-cgw" } }

AWS VPN Connection

resource "aws_vpn_connection" "do_vpn_connection" { vpn_gateway_id = aws_vpn_gateway.main.id customer_gateway_id = aws_customer_gateway.do_vpn_cgw.id type = "ipsec.1" static_routes_only = true # strongSwan statik yönlendirme kullanacak static_routes { cidr_block = var.do_vpc_cidr } tags = { Name = "aws-to-do-vpn" } }

AWS Route Table güncellemesi

resource "aws_route_table" "main" { vpc_id = aws_vpc.main.id tags = { Name = "aws-do-vpn-route-table" } } resource "aws_route" "do_vpn_route" { route_table_id = aws_route_table.main.id destination_cidr_block = var.do_vpc_cidr vpn_gateway_id = aws_vpn_gateway.main.id } resource "aws_route" "internet_route" { route_table_id = aws_route_table.main.id destination_cidr_block = "0.0.0.0/0" gateway_id = aws_internet_gateway.main.id } resource "aws_route_table_association" "public" { subnet_id = aws_subnet.public.id route_table_id = aws_route_table.main.id }

AWS Security Group (VPN trafiği için)

resource "aws_security_group" "vpn_sg" { vpc_id = aws_vpc.main.id name = "vpn-sg" description = "Allow VPN traffic" ingress { from_port = 500 to_port = 500 protocol = "udp" cidr_blocks = ["0.0.0.0/0"] # Sadece DigitalOcean Droplet IP'si ile kısıtlanabilir } ingress { from_port = 4500 to_port = 4500 protocol = "udp" cidr_blocks = ["0.0.0.0/0"] # Sadece DigitalOcean Droplet IP'si ile kısıtlanabilir } # Test için ICMP izni ingress { from_port = -1 to_port = -1 protocol = "icmp" cidr_blocks = [var.do_vpc_cidr] } # Diğer VPC'den gelen trafiğe izin ingress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = [var.do_vpc_cidr] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } tags = { Name = "aws-do-vpn-sg" } }

Örnek bir EC2 instance'ı (VPN bağlantısını test etmek için)

resource "aws_instance" "test_instance" { ami = "ami-0c55b15934aed3ad8" # Ubuntu 22.04 LTS (örnek AMI, bölgenize göre değişebilir) instance_type = "t2.micro" subnet_id = aws_subnet.public.id security_groups = [aws_security_group.vpn_sg.id] key_name = "your-aws-key-pair" # Kendi AWS anahtar çiftinizi buraya ekleyin associate_public_ip_address = true tags = { Name = "aws-vpn-test-instance" } }

#### DigitalOcean Kaynakları

// main.tf (DigitalOcean Bölümü)

DigitalOcean VPC

resource "digitalocean_vpc" "main" { name = "do-vpn-vpc" region = var.do_region ip_range = var.do_vpc_cidr }

DigitalOcean SSH Key

resource "digitalocean_ssh_key" "vpn_key" { name = "do-vpn-ssh-key" public_key = file(var.ssh_public_key_path) }

DigitalOcean Floating IP

resource "digitalocean_floating_ip" "vpn_ip" { region = var.do_region }

DigitalOcean Droplet (VPN Sunucusu)

resource "digitalocean_droplet" "vpn_server" { name = "do-vpn-server" size = "s-1vcpu-1gb" # Minimum gereksinimler için yeterli image = "ubuntu-22-04-x64" region = var.do_region vpc_uuid = digitalocean_vpc.main.id ssh_keys = [digitalocean_ssh_key.vpn_key.id] private_networking = true # VPC içindeki özel ağ user_data = templatefile("${path.module}/strongswan_setup.sh", { aws_vpc_cidr = var.aws_vpc_cidr do_vpc_cidr = var.do_vpc_cidr aws_vpn_tunnel1_ip = aws_vpn_connection.do_vpn_connection.tunnel1_ip_address aws_vpn_tunnel1_psk = aws_vpn_connection.do_vpn_connection.tunnel1_pre_shared_key do_vpn_floating_ip = digitalocean_floating_ip.vpn_ip.ip_address }) tags = ["vpn-server"] }

Floating IP'yi Droplet'e ata

resource "digitalocean_floating_ip_assignment" "vpn_ip_assignment" { ip_address = digitalocean_floating_ip.vpn_ip.ip_address droplet_id = digitalocean_droplet.vpn_server.id }

DigitalOcean Firewall (VPN trafiği için)

resource "digitalocean_firewall" "vpn_firewall" { name = "do-vpn-firewall" droplet_ids = [digitalocean_droplet.vpn_server.id] inbound_rule { protocol = "udp" port_range = "500" source_addresses = ["0.0.0.0/0"] # Sadece AWS VPN Gateway IP'si ile kısıtlanabilir } inbound_rule { protocol = "udp" port_range = "4500" source_addresses = ["0.0.0.0/0"] # Sadece AWS VPN Gateway IP'si ile kısıtlanabilir } # Test için SSH ve ICMP inbound_rule { protocol = "tcp" port_range = "22" source_addresses = ["0.0.0.0/0"] # Kendi IP adresinizle kısıtlayın } inbound_rule { protocol = "icmp" source_addresses = [var.aws_vpc_cidr] } inbound_rule { # AWS VPC'den gelen tüm trafiğe izin (özel ağ) protocol = "tcp" port_range = "1-65535" source_addresses = [var.aws_vpc_cidr] } inbound_rule { protocol = "udp" port_range = "1-65535" source_addresses = [var.aws_vpc_cidr] } outbound_rule { protocol = "any" port_range = "all" destination_addresses = ["0.0.0.0/0"] } }

### strongSwan Kurulumu ve Yapılandırması

DigitalOcean Droplet’inin user_data betiği, strongSwan’ı kuracak ve yapılandıracaktır. Bu betik, AWS VPN bağlantısından alınan tünel bilgilerini (uzak IP, PSK) kullanarak ipsec.conf ve ipsec.secrets dosyalarını oluşturacaktır.

# strongswan_setup.sh (ayrı bir dosya olarak kaydedin)
#!/bin/bash
set -eux

Kernel IP yönlendirmeyi etkinleştir

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf echo "net.ipv4.conf.all.accept_redirects = 0" >> /etc/sysctl.conf echo "net.ipv4.conf.all.send_redirects = 0" >> /etc/sysctl.conf sysctl -p

strongSwan ve gerekli paketleri kur

apt update -y apt install -y strongswan strongswan-pki iptables-persistent

AWS VPN bağlantı bilgilerini al

AWS_VPN_TUNNEL1_IP="${aws_vpn_tunnel1_ip}" AWS_VPN_TUNNEL1_PSK="${aws_vpn_tunnel1_psk}" DO_VPN_FLOATING_IP="${do_vpn_floating_ip}"

CIDR blokları

AWS_VPC_CIDR="${aws_vpc_cidr}" DO_VPC_CIDR="${do_vpc_cidr}"

ipsec.conf dosyasını oluştur

cat < /etc/ipsec.conf config setup charondebug="ike 2, knl 2, cfg 2" strictcrlpolicy=no uniqueids=no conn aws-do-vpn authby=secret left=%any leftid=${DO_VPN_FLOATING_IP} leftsubnet=${DO_VPC_CIDR} right=${AWS_VPN_TUNNEL1_IP} rightsubnet=${AWS_VPC_CIDR} ike=aes256-sha2-modp2048! esp=aes256-sha2-modp2048! keyexchange=ikev2 ikelifetime=28800s keylife=3600s rekeymargin=540s compress=no type=tunnel dpddelay=10s dpdtimeout=30s dpdaction=restart auto=start EOF

ipsec.secrets dosyasını oluştur

echo "${DO_VPN_FLOATING_IP} ${AWS_VPN_TUNNEL1_IP} : PSK \"${AWS_VPN_TUNNEL1_PSK}\"" > /etc/ipsec.secrets

NAT ve VPN trafiği için iptables kuralları

VPN trafiği için MASQUERADE

iptables -t nat -A POSTROUTING -s ${DO_VPC_CIDR} -d ${AWS_VPC_CIDR} -j MASQUERADE iptables -t nat -A POSTROUTING -s ${AWS_VPC_CIDR} -d ${DO_VPC_CIDR} -j MASQUERADE # Gerekirse

İki VPC arasındaki trafiğe izin ver

iptables -A FORWARD -s ${DO_VPC_CIDR} -d ${AWS_VPC_CIDR} -j ACCEPT iptables -A FORWARD -d ${DO_VPC_CIDR} -s ${AWS_VPC_CIDR} -j ACCEPT

VPN trafiği için INPUT kuralları

iptables -A INPUT -p udp --dport 500 -j ACCEPT iptables -A INPUT -p udp --dport 4500 -j ACCEPT

Mevcut iptables kurallarını kalıcı hale getir

netfilter-persistent save

strongSwan servisini yeniden başlat

systemctl restart strongswan systemctl enable strongswan

Önemli Notlar:
* ipsec.conf dosyasındaki ike ve esp parametreleri, AWS VPN bağlantısının tünel detaylarından alınmalıdır. AWS genellikle IKEv2 kullanır ve belirli şifreleme/karma/DH grubu kombinasyonları önerir. Bu örnekte genel bir kombinasyon verilmiştir. AWS konsolundan VPN bağlantınızın “Tunnel Details” kısmını kontrol ederek doğru değerleri almalısınız.
* left=%any yerine Droplet’in özel IP adresi de kullanılabilir, ancak Floating IP ile leftid kullanımı daha yaygındır.
* iptables kuralları, Droplet’in VPN trafiğini doğru şekilde yönlendirmesini ve NAT yapmasını sağlar. Özellikle MASQUERADE kuralı, Droplet’in kendi özel IP’si üzerinden çıkan trafiğin Floating IP’si üzerinden AWS’ye ulaşmasını sağlar.

### Bağlantının Doğrulanması ve Test Edilmesi

Terraform apply işlemi tamamlandıktan sonra, VPN tünelinin başarılı bir şekilde kurulup kurulmadığını ve iki VPC arasında iletişimin çalışıp çalışmadığını doğrulamamız gerekir.

1. strongSwan Durumunu Kontrol Etme:
DigitalOcean Droplet’inize SSH ile bağlanın ve aşağıdaki komutu çalıştırın:

sudo ipsec status

Çıktıda aws-do-vpn bağlantısının ESTABLISHED durumunda olduğunu görmelisiniz. Bu, IPSec tünelinin başarılı bir şekilde kurulduğunu gösterir. Eğer CONNECTING veya başka bir durum görüyorsanız, sudo journalctl -u strongswan komutuyla logları kontrol edin.

2. Ping ile İletişim Testi:
* AWS Tarafından DigitalOcean’a: AWS VPC’nizdeki bir EC2 instance’ına bağlanın (örneğin, aws_instance.test_instance) ve DigitalOcean VPC’nizdeki VPN Droplet’inin özel IP adresine veya Droplet’in arkasındaki başka bir kaynağın özel IP’sine ping atın.

ping 

* DigitalOcean Tarafından AWS’ye: DigitalOcean VPN Droplet’ine bağlanın ve AWS VPC’nizdeki bir EC2 instance’ının özel IP adresine ping atın.

ping 

Ping başarılı olursa, temel IP bağlantısı kurulmuş demektir.

3. Yönlendirme Tablolarını Kontrol Etme:
* AWS Konsolu: AWS VPC’nizin yönlendirme tablolarını kontrol edin. DigitalOcean VPC CIDR bloğuna (10.1.0.0/16) giden trafiğin Virtual Private Gateway (vpg-xxxx) üzerinden yönlendirildiğinden emin olun.
* DigitalOcean Droplet: Droplet’te ip route komutunu çalıştırarak yönlendirme tablosunu kontrol edin. AWS VPC CIDR bloğuna (10.0.0.0/16) giden trafiğin VPN tüneli üzerinden yönlendirildiğinden emin olun. strongSwan genellikle tünel kurulduğunda bu yönlendirmeleri otomatik olarak ekler.

4. Güvenlik Grupları ve Firewall Kontrolü:
Her iki taraftaki güvenlik grupları ve firewall kurallarının, ilgili IP adres aralıklarından (karşı VPC CIDR bloğu) gelen ve giden trafiğe izin verdiğinden emin olun. Özellikle ICMP (ping) ve diğer servisler için kuralların doğru ayarlandığını kontrol edin.

Sık Karşılaşılan Sorunlar ve Çözümleri

1. VPN Tüneli Kurulmuyor (strongSwan ESTABLISHED değil):
* Logları Kontrol Edin: DigitalOcean Droplet’inde sudo journalctl -u strongswan veya /var/log/syslog dosyalarını kontrol edin. Hata mesajları, genellikle sorunun kökenini gösterir (örneğin, kimlik doğrulama hatası, şifreleme uyuşmazlığı).
* PSK Uyuşmazlığı: ipsec.secrets dosyasındaki önceden paylaşılan anahtarın (PSK) AWS VPN Connection tünel detaylarındaki ile tamamen aynı olduğundan emin olun.
* Şifreleme/Karma Algoritması Uyuşmazlığı: ipsec.conf dosyasındaki ike ve esp parametrelerinin (şifreleme, karma, DH grubu) AWS VPN Connection tünel detaylarındaki ile eşleştiğinden emin olun. AWS konsolunda bu bilgileri bulabilirsiniz.
* IP Adresi Yanlışlığı: AWS Customer Gateway’deki IP adresinin DigitalOcean Floating IP’si ile, strongSwan yapılandırmasındaki uzak IP’nin ise AWS VPN Gateway tünel IP’si ile doğru olduğundan emin olun.
* Firewall/Güvenlik Grubu Engeli: UDP 500 (IKE) ve UDP 4500 (NAT Traversal) portlarının her iki tarafta da açık olduğundan emin olun.

2. Trafik Akışı Yok (Ping çalışmıyor):
* Yönlendirme Tabloları: Her iki VPC’deki yönlendirme tablolarının, karşı VPC’nin CIDR bloğuna giden trafiği VPN tüneli üzerinden yönlendirdiğinden emin olun.
* Güvenlik Grupları/Firewall: Her iki taraftaki güvenlik kurallarının, karşı VPC’nin CIDR bloğundan gelen ve giden tüm trafiğe izin verdiğinden emin olun. ICMP trafiği için özel bir kural gerekebilir.
* iptables Kuralları (DigitalOcean): strongSwan Droplet’indeki iptables kurallarının doğru olduğundan emin olun. Özellikle ip_forward‘ın etkinleştirildiğinden ve MASQUERADE kuralının VPN trafiği için geçerli olduğundan emin olun.
* CIDR Çakışmaları: Her iki VPC’nin CIDR bloklarının kesinlikle çakışmadığından emin olun.

3. DigitalOcean Droplet’ine SSH Erişimi Yok:
* Firewall’da SSH (TCP 22) portunun açık olduğundan ve kaynak IP adresinin doğru olduğundan emin olun.
* SSH anahtarının doğru yüklendiğinden ve ssh -i ~/.ssh/do_vpn_key root@ komutuyla doğru anahtarı kullandığınızdan emin olun.

Maliyet ve Güvenlik Hususları

Maliyet

* DigitalOcean Droplet: VPN sunucusu olarak kullanılan Droplet’in maliyeti (boyuta ve çalışma süresine göre).
* DigitalOcean Floating IP: Genellikle küçük bir aylık ücreti vardır.
* AWS VPN Connection: AWS Site-to-Site VPN hizmetinin saatlik ücreti vardır.
* Veri Transferi: Bulut sağlayıcıları arasında veri transferi genellikle maliyetlidir. Bu, iki VPC arasında aktarılan veri miktarına göre değişecektir.

Güvenlik

* strongSwan Güncellemeleri: DigitalOcean Droplet’indeki strongSwan yazılımını düzenli olarak güncel tutmak, bilinen güvenlik açıklarını kapatmak için kritiktir.
* Güvenlik Grupları/Firewall Kuralları: En az ayrıcalık prensibiyle çalışın. Sadece VPN tüneli için gerekli olan portları (UDP 500, UDP 4500) ve kaynak IP adreslerini (karşı tarafın VPN Gateway/Floating IP’si) açık tutun. Test için geniş bırakılan 0.0.0.0/0 kurallarını üretim ortamında kısıtlayın.
* IAM İzinleri: Terraform’un AWS ve DigitalOcean kaynaklarını yönetmek için kullandığı kimlik bilgilerinin (IAM kullanıcısı, API token) en az ayrıcalık ilkesine uygun olarak sadece gerekli izinlere sahip olduğundan emin olun.
* Anahtar Yönetimi: PSK’ları güvenli bir şekilde saklayın ve yönetin. Terraform’da sensitive = true kullanmak, çıktıların konsolda görünmesini engeller ancak .tfstate dosyasında yine de bulunur. Daha hassas senaryolar için Terraform Cloud, Vault veya diğer sır yönetim çözümleri kullanılabilir.
* Ağ Segmentasyonu: İki VPC arasındaki trafiği daha da izole etmek için alt ağları ve güvenlik gruplarını dikkatli bir şekilde yapılandırın.

Alternatif Yaklaşımlar

Bu makalede manuel bir strongSwan kurulumu ile AWS Site-to-Site VPN bağlantısı kurulmuştur. Ancak başka alternatifler de mevcuttur:

* Yönetilen VPN Hizmetleri: DigitalOcean’da doğrudan yönetilen bir VPN Gateway hizmeti olmasa da, AWS Site-to-Site VPN’e benzer şekilde, birçok bulut sağlayıcısı kendi yönetilen VPN çözümlerini sunar (örneğin, Google Cloud VPN, Azure VPN Gateway). DigitalOcean tarafında, üçüncü parti bir sanal güvenlik duvarı/VPN cihazı (örneğin, pfSense, OpenVPN Access Server) kullanmak ve bunu yönetmek de bir seçenektir.
* Direct Connect/Interconnect: Yüksek bant genişliği ve düşük gecikme süresi gerektiren durumlarda, doğrudan fiziksel bağlantılar (AWS Direct Connect, Google Cloud Interconnect) tercih edilebilir. Ancak bu çözümler daha maliyetli ve karmaşıktır.
* SD-WAN Çözümleri: Çoklu bulut ortamlarında karmaşık ağ topolojilerini yönetmek için yazılım tanımlı geniş alan ağı (SD-WAN) çözümleri kullanılabilir.
* Terraform Modülleri: Daha karmaşık senaryolar veya daha hızlı dağıtım için topluluk tarafından geliştirilmiş veya resmi Terraform modülleri kullanılabilir.

Sonuç

Bu makale, DigitalOcean ve AWS VPC’leri arasında güvenli bir IPSec VPN tüneli oluşturmak için Terraform’un nasıl kullanılacağını ayrıntılı olarak açıklamıştır. strongSwan’ın DigitalOcean tarafında VPN sunucusu olarak görev yapması ve AWS Site-to-Site VPN hizmeti ile entegrasyonu sayesinde, iki farklı bulut ortamı arasında güvenli ve özel bir iletişim kanalı kurulmuştur. Terraform, bu karmaşık altyapının kod olarak tanımlanmasını ve otomatik olarak dağıtılmasını sağlayarak, süreçleri basitleştirmiş ve tekrarlanabilir hale getirmiştir.

Multi-cloud stratejileri benimseyen kuruluşlar için bu tür VPN bağlantıları hayati öneme sahiptir. Felaket kurtarma senaryolarından, dağıtık uygulamaların performansını artırmaya kadar birçok kullanım durumu için bu yöntem uygulanabilir. Unutulmamalıdır ki, bu tür bir altyapının kurulumu sadece başlangıçtır; düzenli bakım, güvenlik güncellemeleri ve performans izleme, bağlantının sürekli ve güvenli kalması için kritik öneme sahiptir. Bu makaledeki adımları takip ederek, kendi multi-cloud VPN altyapınızı güvenle kurabilir ve yönetebilirsiniz.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Exit mobile version