Bilgi paylaştıkça anlam kazanır, paylaşmayı unutma!

Evinizdeki veya işyerinizdeki cihazlara konum bağımsız herhangi bir yerden erişmek istediğinizi düşünün, bu durumda izlenecek yol aşağı yukarı bellidir;

1) Öncelikle internet servis sağlayıcınızdan alacağınız statik-ip hizmeti veya DDNS servisleri ile lokal ağınıza değişmeyecek bir adres sağlarsınız,

2) Ardından lokal ağınıza VPN sunucu kurup, bu sunucunun kullandığı portu WAN (public-ip) üzerinden dış dünyaya açarsınız, gerekirse port yönlendirmesi yaparsınız,

3) Dışarıdan lokal ağınıza erişmesini istediğiniz cihazları VPN sunucunuzda tanımlar, gerekli bağlantı bilgilerini ve konfigürasyon dosyalarını istemciye sağlarsınız,

detay işlemleri göz ardı edersek süreç böylece tamamlanmış olur.

Peki öyle bir senaryo düşününki ağınıza gelen WAN üzerinde yetki sahibi değilsiniz; bu durumda portları dışarı açamaz, yönlendiremez, DDNS ve statik-ip tanımlamaları yapamazsınız. Ancak yinede lokal ağınızdaki cihazlara dışarıdan erişmeniz gerekiyorsa bu durumda ne yapılmalıdır?

Network uzmanı değilim, ancak işte tamda böyle bir senaryo ile karşılaştım ve bir şekilde çözüme ulaştım, belki birilerine yol gösterir veya uzman isimlerden daha verimli yöntemler için tavsiye alırız diye bu gönderiyi paylaşmak istedim.

Kısaca özetlemek gerekirse bu yaklaşımda, WAN üzerinde yetkim olmadığından lokal ağımda artık VPN sunucu yapılandıramıyorum, bunun yerine ağa dahil olan bir cihazı VPN istemcisi olarak tanımlıyorum ve diğer VPN istemcilerinin, bu istemci üzerinden NAT yaparak lokal ağa erişimini sağlıyorum.

Sistem Diyagramı
Sistem Diyagramı

Gelelim çözüm adımlarına;

1) Uygun fiyatlı ve güvenilir 2Core CPU, 4GB Ram, 1Gbit port sunan Debian VDS hizmeti satın aldım (aylık 200TL civarı bir maliyeti var). IP belli, istersem domain yönlendirmesi yapabilirim vs. ihtiyacım olan tüm yetkilere sahip oluyorum bu şekilde.

2) VPN sunucu olarak bu VDS i kullanacağım ve VPN altyapısı için, hem daha güncel hem hafif ve hızlı olması nedeniyle Wireguard tercih ediyorum. VDS üzerine Wireguard kurulumunu tamamlayıp, varsa firewall kurallarını dikkate alarak Wireguard ın standart 51820/udp portunu dış dünyaya açtım.

(Not: Wireguard ın yapısı gereği aslında klasik sunucu-istemci isimlendirmesi doğru olmuyor, çünkü Wireguard için herkes aslında birer eş (peer) olarak yapılandırılıyor. Sadece daha anlaşılabilir olması açısından, alışıldık sunucu-istemci yaklaşımı ile konuyu anlatmaya çalışıyorum. )

3) Dışarıdan lokal ağıma erişmesini istediğim tüm cihazları Wireguard sunucuma eş(peer) olarak ekledim. İstemci cihazlarımın konfigürasyon dosyalarında [Peer] alanı altında AllowedIPs için istemcimden erişmek istediğim lokal ağın bilgilerini girdim;

[Interface]
PrivateKey = **********
ListenPort = 51820
Address = 10.0.25.3/32

[Peer]
PublicKey = ********
PresharedKey = *******
AllowedIPs = 10.0.25.0/24, 192.168.1.0/24
Endpoint = vpn.example.domain:51820

Burada 10.0.25.0/24 ağı VPN ağım, 192.168.1.0/24 ağı ise erişmek istediğim lokal ağa ait bilgi, (Bu alana 0.0.0.0/0 yazarsanız tüm internet trafiğiniz VPN üzerinden akar, ben bunu istemiyorum, sadece istediğim ağlara erişmek istiyorum derseniz yöntem bu şekilde ve istemcilerin gerçekten VPN sunucu üzerinden internete çıkamadığından emin olmak istiyorsanız, sunucu üzerinde bazı firewall kuralları yazabilirsiniz.)

4) Lokal ağımda VPN istemci olarak çalışacak bir cihaz olarak (hatta sanal makine bile olur) elimdeki Raspberry Pi 4 ü bağladım. Standart olarak lokal ağımdan dhcp üzerinden 192.168.1.7 gibi bir Ip aldı RPi.

5) Wireguard ı RPi ye yükledim ve diğer istemcilerim gibi VPN sunucuma bağlantısını gerçekleştirdim. Yalnız RPi için özel bir yapılandırma söz konusu;

RPi üzerindeki Wireguard konfiğine, [Peer] başlığı altında AllowedIPs=0.0.0.0/0, ::/0 ekliyoruz. Böylece RPi nin tüm internet trafiği VPN üzerinden gerçekleşiyor;

[Interface]
PrivateKey = **********
ListenPort = 51820
Address = 10.0.25.2/32

[Peer]
PublicKey = ********
PresharedKey = *******
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = vpn.example.domain:51820
PersistentKeepalive = 25

Bir diğer önemli nokta, RPi üzerinde yönlendirme işlemlerine sistem düzeyinde müsade etmek için bazı ek yapılandırmalar yapmamız gerekiyor. /etc/sysctl.conf içerisinde yorum satırı olarak bırakılan ipv4 ve (kullanılacaksa )ipv6 için yönlendirme satırlarını etkinleştirmek;

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

Ve bazı iptables kuralları eklememiz gerekiyor (cihazda iptables paketi kurulu olduğunu varsayıyorum);

sudo iptables -A FORWARD -i wg0 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o wg0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Burada wg0 wireguard ın kullandığı arayüz ismi, eth0 ise lan a bağlı olduğunuz arayüz ismi. (Not: Sizde bu bilgiler değişiklik gösterebilir, “ip a” veya net-tools paketi yüklüyse “ifconfig” komutu ile kolayca arayüzleri öğrenebilirsiniz)

iptables kurallarını sistem her yeniden başlatıldığında yeniden girmemek için iptables-persistent paketini yüklüyoruz, yükleme esnasında sistemdeki kuralları kaydedip kaydetmeyeceğimiz soruluyor, Evet(Yes) seçeneğini seçebilirsiniz veya paketi daha önceden yüklediyseniz aşağıdaki komut ile yeni kuralları kaydedebilirsiniz;

sudo netfilter-persistent save

Burada yazılan kurallarla VPN ağından gelen istekler RPi üzerinde NAT lanıp lokal ağa erişimi sağlıyor. NAT sayesinde diğer Wireguard cilentlarından gelen istekler, RPi nin lokale bağlı eth0 arayüzü (192.168.1.7) üzerinden lokal ağa yapılmış oluyor ve RPi bir nevi VPN Gateway olarak çalışmaya başlıyor.

Bu aşamadan sonra RPi de işimiz bitmiş oluyor, sistemi yeniden başlatıp bu cihazı artık unutabilirsiniz 😀

Sıra geldi, VDS üzerindeki Wireguard konfiğinde (/etc/wireguard/wg0.conf) yapacağımız yapılandırmalara. Yönlendirmelerin sorunsuz gerçekleşmesi için [Interface] başlığı altında PostUp ve PostDown olarak bazı iptables kuralları ekliyoruz;

PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth+ -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth+ -j MASQUERADE

Yine VDS üzerindeki Wireguard konfiğinde RPi tanımlarının bulunduğu [Peer] başlığı altında yer alan AllowedIPs=10.0.25.2/32, 192.168.1.0/24 bilgisini giriyoruz. Böylece wg0.conf dosyanız şuna benzeyecektir;

[Interface]
PrivateKey = **********
ListenPort = 51820
Address = 10.0.25.1/24
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth+ -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth+ -j MASQUERADE

# Raspberry Pi 4 Client
[Peer]
PublicKey = ********
PresharedKey = *******
AllowedIPs = 10.0.25.2/32, 192.168.1.0/24

# Client-1
[Peer]
PublicKey = ********
PresharedKey = *******
AllowedIPs = 10.0.25.3/32

10.0.25.2/32 RPi nin VPN Ipsi, anlayacağınız üzere 192.168.1.0/24 ise erişmek istediğimiz lokal ağın bilgisi. Bu bilgiler ile Wireguard sunucu kendisine gelen 192.168.1.x li istekleri hangi peer a yönlendireceğini bilebiliyor, o yüzden kritik öneme sahip.

VDS yapılandırmamızda bu aşamada tamamlanmış oluyor. Yeni konfiğin uygulanması için Wireguard tünelini kapatıp yeniden açmak gerekiyor. Bunun için VDS serverda şu komutları uyguluyoruz;

sudo wg-quick down wg0
sudo wg-quick up wg0

Burada Wireguard ın kullandığı arayüz isminin wg0 olduğundan emin olun. (İlk kurulumda varsayılan olarak bu isimle oluşturuluyor.)

Not: Bu konfiğin her güncellendiği durumda, tüneli bu komutlarla kapatıp açmak gerekecek veya işleri biraz daha otomatik hale getirmek için /etc/wireguard/wg0.conf dosyasını izleyen ve değişim olduğunda tüneli otomatik kapatıp açacak systemd servisi yazılabilir.

Sistemimiz hazır durumdadır; lokal ağınızı artık internet erişimi olan istediğiniz WAN ın arkasına konumlandırın hiç farketmez, istemcilerinizden bu ağa tıpkı o ağa doğrudan bağlıymışsınız gibi erişebilirsiniz. Elbette bağlı olduğunuz ağın ve VDS hizmet hızınızın erişim hızınıza doğrudan etki edeceğini hatırlatmakta fayda var.