WireGuard VPN ve Pi-hole Kurulumu

Mirkan
6 min readOct 27, 2019
“Compared to horrors that are OpenVPN and IPSec, WireGuard is a work of art” -Linus Torvalds

0. VPN, Wireguard, Pi-hole

VPN

VPN virtual private network’ün kısaltılmışı, yani sanal özel ağ demek. İnternete başka bir ip üzerinden bağlanmanızı sağlıyor. VPN ile bölgesel yasak ve kısıtlamaları aşabilirsiniz ve internette gezinirken kimliğinizi saklamanıza yardımcı olur.

Pi-hole

Pi-hole bir proje. Pi kelimesi Raspberry Pi’den geliyor, hole ise bildiğimiz delik. Raspberry Pi kart boyutunda çok uygun fiyatlı bilgisayar. Monitöre ve TV’nize takıp kullanabilirsiniz. Pi-hole, Raspberry Pi cihazınızı reklamları engelleyen bir DNS sunucusuna dönüştürmenizi sağlıyor. Güzel de bir paneli var, logları ve istatistikleri görüp, siteleri beyaz ve kara listelere eklemenizi sağlıyor.

Wireguard

Wireguard bir VPN protokolü, tıpkı OpenVPN gibi. Yeni sayılır fakat çok başarılı. Birkaç haftadır test ediyorum, telefonumda güç tasarrufunda bile bağlantı düşmedi. 3G’den Wifi’ya veya tam tersi geçişlerde de düşme olmuyor ve şarjımın daha iyi gittiğini söyleyebilirim.

Daha küçük bir kod temeli olduğu için(4000 satır kadar), daha az atak alanı olduğu ve denetlemesinin kolay olduğu söyleniyor. Performans için de benchmarklara bakabilirsiniz.

1. VPS kurulumu

Hosting hizmetini Amazon, DigitalOcean, Linode, Hetzner, GCP, Vultr gibi birçok sağlayıcıdan alabilirsiniz. Ben bu yazımda DigitalOcean kullandım.
DigitalOcean’da sanal makinelere Droplets deniyor. Aşina olduğum işletim sistemi Ubuntu 18.04 ile bir sanal makina açıyorum. Tercih ettiğiniz diğer sağlayıcılarda da aşağı yukarı buna benzer bir ekran göreceksiniz.

Bir tane ssh key yaratıyorum. Daha önce yarattığınız bir key yoksa bu şekilde yaratabilirsiniz. Windows kullanıcıları OpenSSH veya Putty yüklemeli bu komutu kullanabilmek için.

ssh-keygen 

Anahtarı kaydetmek ve isimlendirmek için böyle bir mesaj alacaksınız.

Generating public/private rsa key pair. Enter file in which to save the key (/Users/USER/.ssh/id_rsa):

Sonra parola girmenizi isteyecek, burası opsiyonel fakat bir parola belirlemenizi öneririm.

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

İlk adımda farklı bir isim girmediyseniz, id_rsa ve id_rsa.pub isimli iki dosyanız hazır olacak. id_rsa dosyasının içindekileri böyle terminale bastırabiliriz.

cat ~/.ssh/id_rsa.pub

Bunu sonra sitede ilgili yere kopyalıyoruz.

Sunucuya uzaktan bağlantı kurmak

ssh root@167.71.58.142

Terminalden üstteki komut ile bilgisayarımdan uzak sunucuya bağlanıyorum.

2. Firewall yapılandırması

Sunucumuzu rastgele internet trafiğine açmamak ve daha güvenli hale getirmek için firewall ayarlarını yapıyoruz. UFW ile 53 ve 80 portunu engelliyoruz. Sunucuya SSH ile bağlandıysak, UFW’yi aktif ettiğimizde bağlantımızın kopmaması için port 22'ye izin veriyoruz.

sudo ufw deny 80/any
sudo ufw deny 53/any
sudo ufw allow 22/any

Wireguard istemcilerimizden gelen trafiği açıyoruz

sudo ufw allow from 192.168.2.0/24

UFW’yi aktif ediyoruz.

ufw enable

ipv4 trafiğini iletmeyi açıyoruz ki makinemiz router gibi davransın ve istemcilerimiz internete girebilsin. Bunun için:
sysctl.conf ’i açyoruz nano /etc/sysctl.conf ve net.ipv4.ip_forward = 1, satırını ekliyoruz. Bu kısım bu kadar.

3. Sunucuya Wireguard yükleme

Ubuntu’ya Wireguard yüklemek için yapmanız gerekenler.

sudo add-apt-repository ppa:wireguard/wireguard
sudo apt-get update
sudo apt-get install wireguard

Diğer işletim sistemleri için buraya bakınız.

4. Sunucuda Wireguard yapılandırılması

Wireguard kendisi ve istemcileri için ayrı bir subnete sahip olmalı. Mesela Wireguard’ın subneti 192.168.2.0/24 ise 192.168.2.1–192.168.2.254 arasında her IP uygun. Wireguard server IP adresi 192.168.2.1 olacaktır. Bunu sunucunun public veya dahili IP’si ile karıştırmayın.

Wireguard kimlik doğrulama için public ve private anahtarlar kullanıyor. Hemen bir tane public-private anahtar çifti yaratalım.

wg genkey | tee privatekey | wg pubkey > publickey

Şimdi public ve private key içeren iki tane dosyamız oldu.
Bunları ekrana basalım ve not alalım.

cat publickey
cat privatekey

/etc/wireguard içine wg0.confdiye bir dosya açın.

nano /etc/wireguard/wg0.conf

İçine bunu yapıştırın ve kendi ayarlarınıza göre düzenleyin.

[Interface]
Address = 192.168.2.1
PrivateKey = <Buraya sunucunun private anahtarını girin(az önce oluşturduğumuz)>
ListenPort = 1194
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
# iphone6s (istemcinin ismi, başındaki #'ı kaldırmayın çünkü bu yorum satırı)
PublicKey = <Buraya döneceğiz>
AllowedIPs = 192.168.2.3/32

[Interface] kısmı sunucunun ayarları, [Peer] kısmı ise istemcinin. Birden çok [Peer] kısmı açabilirsiniz alt alta.

Address kısmı Wireguard sunucumuzun adresi.

Port Wireguard serverına bağlanabileceğimiz kısım, buraya başka birşey yazabilirsiniz. Sonrasında firewall’dan açmayı unutmayın.
sudo ufw allow 1194/any

PostUp ve PostDown wireguard interface’i açılıp kapandığında çalışcak komutları tanımlamak için.

PresharedKey bu opsiyonel. İsterseniz PublicKey’in altına koyabilirsiniz.
PresharedKey = <Anahtar>

PresharedKey’i de wg genkey ile yaratabilirsiniz. 32 bit base64 kodlamada olmalı.

Peer kısmında publickey’i istemci için yarattığımızda dönüp bu dosyaya yapıştıracağız. AllowedIPs kısmı bağlantı sırasında istemciye atanacak dahili IP.
192.168.2.1 yazmayın(bu adresi sunucuya atadık) ve 192.168.2.255'in altında kalın.
Örnek: 192.168.2.3'den başlayın ve her bir istemci için son basamağı değiştirin. (192.168.2.XX/32)

Detaylar için subnet’leri araştırabilirsiniz.

5. İstemci tarafında Wireguard yapılandırılması

İstemci tarafında da public ve private anahtarları üstteki komut ile yaratın. /etc/wireguard’ın içine wg0.conf açarak üstte sunucu tarafında yaptığımıza benzer bir config yazacağız. Tek fark interface artık sunucu değil istemci ve peer ise sunucumuz. Aman karıştırmayın.

[Interface]
Address = 192.168.2.<Sunucu tarafında bu istemciye verdiğiniz ip ile aynı olmalı>
PrivateKey = <İstemcide yarattığımız privatekey>
ListenPort = <Herhangi bir port, mesela 21841. Ben burayı boş bırakmıştım>
DNS = 192.168.2.1
[Peer]
PublicKey = <SUNUCU PUBLIC ANAHTARI>
Endpoint = <SUNUCU PUBLIC IP>:1194
AllowedIPs = 192.168.2.1/24, 0.0.0.0/0, ::/0
PersistentKeepalive = 25

DNS sunucusunu Pi-hole kullanımına hazırlamak için 192.168.2.1 olarak verdik.
[Peer] kısmında Endpoint’e public ip vermeniz lazım. Sunucuda curl ifconfig.me yazarak bulabilirsiniz. 192.168.2.1 değil. 1194 ise sunucuda verdiğimiz port, eğer 1194 yerine başka birşey ayarladıysanız, burda da değiştirin.

Mobil cihazlar için

Ayarlar gördüğünüz gibi aynı. Yeni bir anahtar çifti yaratıyoruz. Public olanı sunucumuza ekliyoruz. Sunucunun public olanını cihazımızın peer kısmına ekliyoruz. Endpoint sunucumuzun public IP’si.

6. Wireguard’ı başlatmak

sudo wg-quick up wg0 ile wireguard’ı başlatabilirsiniz. sudo wg0 ile durumunu görebilirsiniz. Hem sunucu da hem istemcide Wireguard’ı başlatalım.
Açılışta başlaması için bunu yazabiliriz:
sudo systemctl enable wg-quick@wg0.service

7. Pi-hole yükleme

Bu kısmı acısız yapmak için Pi-hole’u docker ile yükleyeceğiz. Hazır bir script de buldum. Fakat bunun için de docker yüklememiz gerekiyor. Nerdeyse tüm işletim sistemleri için docker yüklemeyi detaylı anlatan yazılar var.

Docker yükledikten sonra sunucuda:

nano piholeYarat.sh ile dosya açıyoruz ve içine:

#!/bin/bash# https://github.com/pi-hole/docker-pi-hole/blob/master/README.mddocker run -d \
--name pihole \
-p 192.168.2.1:53:53/tcp -p 192.168.2.1:53:53/udp \
-p 192.168.2.1:80:80 \
-p 192.168.2.1:443:443 \
-e TZ="America/Chicago" \
-v "$(pwd)/etc-pihole/:/etc/pihole/" \
-v "$(pwd)/etc-dnsmasq.d/:/etc/dnsmasq.d/" \
--dns=127.0.0.1 --dns=1.1.1.1 \
--restart=unless-stopped \
pihole/pihole:latest
printf 'Starting up pihole container '
for i in $(seq 1 20); do
if [ "$(docker inspect -f "{{.State.Health.Status}}" pihole)" == "healthy" ] ; then
printf ' OK'
echo -e "\n$(docker logs pihole 2> /dev/null | grep 'password:') for your pi-hole: https://${IP}/admin/"
exit 0
else
sleep 3
printf '.'
fi
if [ $i -eq 20 ] ; then
echo -e "\nTimed out waiting for Pi-hole start start, consult check your container logs for more info (\`docker logs pihole\`)"
exit 1
fi
done;

yapıştırıp kaydediyoruz. chmod +x piholeYarat.sh ile bu scripti çalıştırmak için gereken yetkiyi verip, ./piholeYarat.sh ile çalıştırıyoruz. En son bir şifre basacak ekrana, bunu pihole paneline girmek için kullanacaksınız. O yüzden bunu not alın.

VPN’e bağlıyken https://192.168.2.1/admin/index.php adresinden panele girebilirsiniz.

Pi-hole panel

Kaynaklar:
https://www.reddit.com/r/pihole/comments/bl4ka8/guide_pihole_on_the_go_with_wireguard/
https://www.digitalocean.com/community/tutorials/how-to-block-advertisements-at-the-dns-level-using-pi-hole-and-openvpn-on-ubuntu-16-04
https://wiki.archlinux.org/index.php/WireGuard
https://www.linode.com/docs/networking/vpn/set-up-wireguard-vpn-on-ubuntu/

--

--