Bu Küçük Websayfası Benim Sunucumda Nasıl Çalışıyor? CG-NAT? WireGuard? Cloudflare? NGINX? Docker?

Merhaba,

Basitçe anlatmam gerekirse bu websitesi benim evimdeki CG-NAT arkasında bulunan proxmox ile sanallaştırılmış bir Ubuntu Server VM’inde docker üzerinde host ediliyor. Websiteme istek yaptığınızda bu istek önce cloudflare üzerinden geçiyor, saldırı olarak nitelendirilebilecek ise bloklanıyor, daha sonra Almanya’da VULTR üzerinde barınan bir sanal makinede nginx tarafından karşılanıyor daha sonrasında ise bu istek benim evdeki sunucuma wireguard üzerinden stream ediliyor. Evdeki sunucum bu streamı yine nginx ile karşılıyor, eğer HTTP bir istek ise bunu HTTPS isteğine yönlendirip docker imajının 81 portuna proxy şeklinde gönderiyor. İsteğiniz, HTTPS olarak size bu tüm yolu geri dönerek ulaşıyor. Kişisel kullanım için host ettiğim docker konteynırları(vaultwarden, nextcloud) da aynı şekilde işliyor. Tek bir fark var, CF üzerinde bu istekleri proxy etmek(yani sunucumun ipsini gizlemek) yerine direkt olarak A kaydı ile yönlendiriyorum.

Detaylara girmemiz gerekirse, başlayalım.
Öncelikle Cloudflare ile başlayalım;
Cloudflare üzerinde direk domain adresimi, VULTR üzerinde barınan sanal makineme proxy aktif olarak(yani sunucumun ip adresini gizleyerek) yönlendiriyorum. İstek sunucuma ulaşıyor.

Bu istek VULTR’daki NGINX sunucusu tarafından karşılanıyor. 80 ve 443 portundan gelen istekler direkt olarak evdeki VM’in 80 ve 443 portlarına yönlendiriliyor. Bunu detaylı aşağıda açıklayacağım.  Daha fazla port yönlendirmem var fakat ekran görüntüsüne eklemedim. Bu yüzden stream öbeğini de kapatmanız gerekiyor. Yani kodun sonuna bir daha } eklemelisiniz. Bu ayarları /etc/nginx/nginx.conf dosyasında events kısmından önceye ekliyoruz.

Gelelim WireGuard ayarlarına. Can alıcı nokta.
Sunucu ve client tarafında çalıştıracağımız komutlar;
sudo apt-get update
sudo apt-get install -y wireguard

Kurulum tamamlandıktan sonra hem client hem sunucu tarafında;

sudo -i
cd /etc/wireguard/
umask 077; wg genkey | tee privatekey | wg pubkey > publickey

Komutları ile private ve public keylerimizi oluşturuyoruz.

cat privatekey
cat publickey

Komutları ile private ve public keylerimizi çıkartıp, sunucu ve client başlığıyla ayrı ayrı not alıyoruz.

Sunucumuz üzerinde wg0.conf dosyası oluşturup wireguard sunucumuzu başlatmamız gerekiyor.

sudo nano /etc/wireguard/wg0.conf

Komutu ile wg0.conf dosyamızı açıyoruz. İçerisine altta verdiğim ayarları yapıştıracağız. Burada değiştirmemiz gereken yer PrivateKey olan kısım. Buraya bir önceki adımda çıkardığımız privatekey’i yazmamız gerekiyor.

[Interface]
## Sunucunun IP Adresi ##
Address = 192.168.10.1/24
 
## My VPN server port ##
ListenPort = 51194
 
## Sunucunun PrivateKeyi ##
PrivateKey = Buraya PrivateKey yapıştırılacak.
 
## Save and update this config file when a new peer (vpn client) added ##
SaveConfig = true

UFW yani güvenlik duvarında 51194 portuna izin vermemiz gerekiyor.

sudo ufw allow 51194/udp

Artık WireGuard sunucumuzu devreye alabilir ve başlatabiliriz.

sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

WireGuard sunucumuzun durumunu kontrol etmek için ise;

sudo wg
sudo ip a show wg0

Sizde peer kısmı çıkmayacaktır. Çünkü daha client kısmını kurmadınız.
Gelelim client kısmına. Zaten wireguardı kurmuş, public ve private keyleri çıkarmıştınız.  wg0.conf dosyamızı client üzerinde de oluşturmalıyız.

sudo nano /etc/wireguard/wg0.conf

İçine yapıştırmamız gereken kod ise aşağıda. Burada istemcinin PrivateKeyini, Sunucunun PublicKeyini ve sunucunun ip adresini girmemiz gerekiyor.

[Interface]
## Client makinenin private keyi ##
PrivateKey = Client PrivateKey
 
## Client ip address ##
Address = 192.168.10.2/24
 
[Peer]
## Sunucunun public keyi ##
PublicKey = Sunucu public key
 
## set ACL ##
AllowedIPs = 192.168.10.0/24
 
## Sunucunun ip adresi ve portu ##
Endpoint = IPAdres:51194
 
##  Key connection alive ##
PersistentKeepalive = 20

Kaydedip çıkıyoruz. Artık client tarafında da WireGuardı etkinleştirmemiz ve başlatmamız gerek.

sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

Sunucu tarafına geri dönüp, cliente izin vermemiz gerekiyor. Bunun için ise;

sudo systemctl stop wg-quick@wg0
sudo nano /etc/wireguard/wg0.conf

İçerisine ise alttaki kodu yapıştırıp PublicKey kısmını değiştirmemiz gerekiyor.

[Peer]
## Clientin public keyi ##
PublicKey = ClientPublicKey
 
## client VPN IP address (note  the /32 subnet) ##
AllowedIPs = 192.168.10.2/32

Artık sunucumuzu yeniden başlatabiliriz.

sudo systemctl start wg-quick@wg0

Sunucudan clienti pingleyebiliyor olmalıyız artık.

ping -c 4 192.168.10.2

Ve evet, artık sunucumuz dışarıdan gelen 80 ve 443 portlarını NGINX ile karşılayıp client makinemize yönlendiriyor.
Peki bu evimdeki makinede nasıl işleniyor sorusuna gelirsek, ilk başta da bahsettiğim gibi bu istek yine NGINX ile karşılanıyor. Tüm NGINX ayarlarımı paylaşmayacağım ama websitesini nasıl yönlendirdiğime bakabiliriz.

server {

        index index.html index.htm index.nginx-debian.html;
        server_name www.umutcanacar.me umutcanacar.me; # managed by Certbot


        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:81;
        proxy_redirect off;
        }




    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/umutcanacar.me/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/umutcanacar.me/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = umutcanacar.me) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


        listen 80 ;
        listen [::]:80 ;
    server_name umutcanacar.me;
    return 404; # managed by Certbot
}

Basitçe anlatmam gerekirse “managed by Certbot” eklentili olan satırlar Certbot ve letsencrypt tarafından kontrol ediliyor. SSL sertifikalarım, 80 portunu 443e yönlendirme gibi işlemler python3 certbot eklentisi ile otomatik olarak ekleniyor.
Proxy kısmına gelirsek, proxy_pass kısmından görebileceğiniz üzere gelen istek localhostun 81 portuna yönlendiriliyor. Bu 81 portunda ise benim websitemin docker konteynırı(Ocak 2023 güncellemesi; Artık docker konteynırı yerine bir cPanel üzerinde barındırıyorum) bulunuyor.

Ve sonunda sizin benim siteme erişme serüveniniz sona erdi. Ve artık istediğiniz kadar port yönlendirmesi de yapabilirsiniz. Artık docker konteynırımdan gerekli bilgiler ekranınızda. Hatta buraya kadar benim küçük docker konteynırım getirdi sizleri. Teşekkürler Docker…

Yorum yapın