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.