Amazon EC2 OpenVPN

Photo by Clint Adair / Unsplash

Bu makale tümden teknik bir döküman ve doğrudan uygulayıcılar için hazırlandı. Amacı ise Amazon t3.micro bir instance ile mobil ya da sabit bir cloud kapasitesini hibrit yapıda internete açmak için gereken temel yapılandırmanın nasıl yapıldığını etraflıca anlatmak. Buradaki anlatılanlar hakkında bilgi ve deneyim, her türden VPN erişimi için OpenVPN yapılandırması yapabilecek bir yetkinlik anlamına geliyor.

Devam etmeden önce bir seri dökümandan oluşan bu makale serisinin neresinde olduğumuza bir bakalım;

  • İçindekiler
    • .....
    • Proxmox
    • Amazon t3.micro Server

      • OpenVPN Kurulumu

    • Docker Kurumu
    • ......

Daha önce Proxmox kurulumunun nasıl yapılacağını öğrenmiştik. Bu döküman ise özel olarak bu çalışmanın internet ve cross cloud iletişimi, genel olarak da OpenVPN ile ilgili iyi bir kaynak oldu diye düşünüyorum.

AMAZON EC2 Instance

Amazon DNS adreslerini, ilgili instance içinde;

$ resolvectl status
Global
       Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: stub

Link 2 (eth0)
    Current Scopes: DNS
         Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 172.31.0.2
       DNS Servers: 172.31.0.2
        DNS Domain: ec2.internal

Link 5 (tun0)
Current Scopes: none
     Protocols: -DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported

komutu ile öğrenebiliriz. Eğer client LAN tümüyle izole olacaksa o LAN için DNS bu adresleri kullanmak iyi bir pratik olacaktır.

Instance->Security->Security Group bölümündeki kurallardan inbound alana 1194 UDP portunu açmak gerek. Ayrıca HTTP ve HTTPS de içerden servis edilecek hizmetlere erişim için gerekli olacak diğer portlar.

UFW

Ufw, EC2 instance için kullanacağımı firewall olacak. Kurulum ve yapılandırması oldukça kolay.

Kurulum

$ sudo apt-get install ufw
$ sudo ufw allow ssh
$ sudo ufw allow openvpn
$ sudo ufw enable
$ sudo sysctl -w net.ipv4.ip_forward=1

Forwarding için ön tanımlı olarak bir tanımlama gerekecek;

/etc/default/ufw;

DEFAULT_FORWARD_POLICY="ACCEPT"

Yapılandırma

İki temel fonksiyon sağlaması gerekiyor. İlki eth0 (instance internet bacağı) a gelen trafikleri port yönlendirmesi ile tun0 arkasındaki ağa aktarmak, eth0 dan çıkan forward trafikleri ise nat ile internete çıkarmak. Bu işlem için /etc/ufw/before.rules dosyasının baş tarafına;

# nat Table rules
*nat
:POSTROUTING ACCEPT [0:0]
:PREROUTING ACCEPT [0:0]

# Port Forwardings
-A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.202.1
-A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to-destination 192.168.202.1

# Forward traffic from eth1 through eth0.
-A POSTROUTING -s 0.0.0.0/0 -o eth0 -j MASQUERADE

# don't delete the 'COMMIT' line or these nat table rules won't be processed
COMMIT

bölümünü eklemek yeterli olacaktır. Cluster reverse proxy hangi adreste servis veriyorsa port forwarding için o adres verilmelidir (bu örnekte 192.168.202.1)

VPN Server

Kurulum

apt-get install openvpn

Yapılandırma

Gerekli olan kriptografik dosyaları oluşturmak için doğru zamandayız;

$ cd /usr/share/easy-rsa
$ sudo ./easyrsa init-pki
$ sudo ./easyrsa build-ca
$ sudo ./easyrsa build-server-full server1 nopass
$ sudo ./easyrsa build-client-full client1 nopass
$ sudo ./easyrsa gen-dh
$ sudo openvpn --genkey secret ./pki/ta.key
$ sudo cp -pR /usr/share/easy-rsa/pki/{issued,private,ca.crt,dh.pem,ta.key} /etc/openvpn/server/

Eğer birden fazla istemci oluşturulacaksa build-client-full işlemi her bir istemci için oluşturulmalıdır. Bu aşamada openvpn yapılandırmasını barındıran dizin aşağıdaki şekilde görünecektir;

├── client
├── server
│   ├── ca.crt
│   ├── ccd
│   │   └── client1
│   ├── dh.pem
│   ├── issued
│   │   ├── client1.crt
│   │   └── server1.crt
│   ├── private
│   │   ├── ca.key
│   │   ├── client1.key
│   │   └── server1.key
│   ├── server.conf
│   └── ta.key
└── update-resolv-conf

Sunucu üzerinde istemcilerle ilgili tanımları aşağıdaki dosya içinde yapıyoruz. /etc/openvpn/server/ccd/clientXX;

iroute 192.168.202.0 255.255.255.0

Bu bölümde bu istemcinin arkasında yer alan ağları tanımlıyoruz. Bu örnekte bu VPN istemcisinin arkasında 192.168.202.0/24 ağı olduğunu belirtiyoruz. Bir çeşit BGP gibi düşünebilirsiniz. Bu nedenle hangi client arkasında hangi ağ olduğunu bu şekilde belirtiyoruz. Zira tek bir tunel üzerinde birden fazla istemci söz konusu olduğunda ilgili ağların tüneli kullanabilmesinin önünü bu şekilde açmış oluyoruz. Bu dosyada belirtilmez ise istemciye VPN sunucu bir ip tahsis edecektir.

Sadece bir bilgi olarak eğer istemciye ip tahsis edilecekse;

/30 network kullanılıyorsa:

ifconfig-push 192.168.100.5 192.168.100.6

subnet kullanılıyorsa

ifconfig-push 192.168.100.5

şeklinde tanım yapılır. Bu çalışmada buna ihtiyacımız yok.

Server yapılandırması için ise /etc/openvpn/server/server.conf dosyası içinde ayarları yapıyoruz;

# Kullanilacak port

port 1194

# Kullanilacak protokol

proto udp

# Route edilmis L3 tunel kullanilsin

dev tun

# Kok sertifika

ca ca.crt

# Sunucu sertifikasi

cert issued/server1.crt

# Sunucu ozel anahtari 

key private/server1.key

# Diffie Hellman anahtari
 
dh dh.pem

# Sonraki baslikta verilen tum agi kullanacak sekilde yapilandir. Belirtilmezse sonraki agda /30 bolumler olusturulup her istemciye ayri bir ag tanimlanir.

topology subnet

# VPN Server ve istemcileri icin verilecek IP ler icin havuz

server 192.168.100.0 255.255.255.0

# Eger client dosyalarinda istemci icin ip tahsis edilmemisse bu dosyada son verilen ip leri restart sonrasi kullanabilmek icin sklasin

ifconfig-pool-persist /var/log/openvpn/ipp.txt

# Istemciler icin tanimler bu dizinden istemci adi ile olusturulan dosyadan alinsin

client-config-dir ccd

# Server route tablosuna bu bilgiyi ekle. Gateway ise bir ustte belirtilen dizindeki istemci dosyasindaki iroute tanimindan alinir

route 192.168.202.0 255.255.255.0

# Istemci tarafinda default gateway VPN server yapilsin
 
push "redirect-gateway autolocal"

# Istemciler aralarinda haberlesebilsin

client-to-client

# 120 saniye boyunca 10 saniyede bir karsi tarafa bak. Cevap vermez ise linki dusur

keepalive 10 120

# TLS dogrulamada auth kullan ve bu islem icin de ta.key dosyasini kullan. Hem sunucuda hem de istemcide bulunur bu dosya. Sondaki "0" sunucuda calistigini, "1" ise istemcide calistigini belirtir

tls-auth ta.key 0

# Sifreleme tipi

cipher AES-256-CBC

# Eğer openvpn root olarak calismiyorsa, restart sirasinda tuneli kapatma ve anahtari yenileme. OpenVPN servisinin hangi hakla calistigina gore islevi olur ya da olmaz

persist-key
persist-tun

# Log nereye yazilsin ?

status /var/log/openvpn/openvpn-status.log

# Log dosyasına yazilacak verinin detayi ne olsun 
# 0 sadece olumcul hatalar
# 4 genel bilgiler
# 5 hata ayiklama bilgisi
# 9 yazilabilecek hersey

verb 3

# Server restart edilecegi zaman otomatik olarak istemcilere bilgi gecilsin

explicit-exit-notify 1

Özellikle detaylıca yazdım ki ne nedir biraz akılda kalıcı olsun.

Sunucumuz hazır artık çalıştırma zamanı;

$ sudo systemctl enable --now openvpn-server@server
$ systemctl status openvpn-server@server

VPN Client

Kurulum

$ sudo apt-get install ufw
$ sudo ufw allow ssh
$ sudo ufw enable
$ sudo sysctl -w net.ipv4.ip_forward=1

Forwarding için ön tanımlı olarak bir tanımlama gerekecek;

/etc/default/ufw;

DEFAULT_FORWARD_POLICY="ACCEPT"

VPN istemci için gerekli olan sadece yapılandırma dosyası ve iletişim güvenliği için gerekli kriptografik bilgilerin olduğu dosyalardır. Istemci uzerinde OpenVPN kurulumu;

$ sudo apt-get install openvpn

komutu ile sağlanabilir. Bu aşamada hem server hem de istemci kurulur. Eğer turnkey openvpn lcx image kullanılırsa kurulu gelecektir. Biz sadece istemciyi etkinlestireceğiz. İstemci makinede bu aşamada dizin yapısı;

|-- client
|   |-- ca.crt
|   |-- client.conf
|   |-- issued
|   |   `-- client1.crt
|   |-- private
|   |   `-- client1.key
|   `-- ta.key
|-- client.conf
|-- easy-rsa
|   |-- easyrsa
|   |-- openssl-easyrsa.cnf
|   |-- vars.example
|   `-- x509-types
|       |-- COMMON
|       |-- ca
|       |-- client
|       |-- code-signing
|       |-- server
|       `-- serverClient
|-- server
`-- update-resolv-conf

şeklinde olacaktır. İki durum var. Eğer turnkey openvpn kullandı isek, client.conf dosyasını /etc/openvpn içinde arayacaktır. Elle normal kurulumda ise /etc/openvpn/client içinde client.conf arayacaktır. Yapılandırma içinde üç tane dosyanın yolu bu iki duruma göre değişecektir. Sunucu üzerinden dört adet dosyanın istemciye aktarılması gerekecektir;

client/ca.crt - Güvenilir kök sertifika
client/issued/client1.crt - İstemci sertifikası
client/private/client1.key - İstemci özel anahtarı
client/ta.key - TLS Auth için kullanılacak anahtar

Yapılandırma içinde client.conf dosyasının yerine göre göreceli olarak bu dosya konumları client.conf içinde düzenlenmelidir.

/etc/openvpn/client/client.conf;

# Bu oturum bir istemci oturumu

client

# Route edilebilir L3 interface kullanacagiz

dev tun

# UDP protokolu kullaniclacak

proto udp

# VPN sunucumuzun adresi ve portu

remote <aws ec2 instance adresi> 1194

# Server IP yerine isim verilmisse ve isim cozulemiyorsa cozmek icin surekli dene

resolv-retry infinite

# yerel port icin dinamik bir tane kullan

nobind

# Eğer openvpn root olarak calismiyorsa, restart sirasinda tuneli kapatma ve anahtari yenileme. OpenVPN servisinin hangi hakla calistigina gore islevi olur ya da olmaz

persist-key
persist-tun

# Guvenilir kok sertifika dosyasi

ca ca.crt

# istemci sertifikasi

cert issued/client1.crt

# istemci gizki anahtari

key private/client1.key

# TLS Web Client Authentication extended bilgisi ile imzalanmis bir server sertifikasi gerekli olsun. Man-in-middle ataklarina karsi bir guvenlik. Sertifikalari olustururken bu sekilde olusturmustuk.

remote-cert-tls server

# TLS Authentication icin kullanilacak anahtar

tls-auth client/ta.key 1

# Sifreleme icin kullanilacak yontem

cipher AES-256-CBC

# Log dosyasına yazilacak verinin detayi ne olsun 
# 0 sadece olumcul hatalar
# 4 genel bilgiler
# 5 hata ayiklama bilgisi
# 9 yazilabilecek hersey

verb 3

istemci tarafında da işimiz bitti. Artık istemciyi de çalıştırabiliriz;

$ sudo systemctl enable openvpn-client@client
$ sudo systemctl start openvpn-client@client

Hata Giderme

İşlemler bittiğinde her iki makineyi de restart etmek yararlı olacaktır.

Dogan ZORLU

Dogan ZORLU