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.
