Enkripsi Lalu Lintas DNS Rumah Anda Secara Penuh Dengan CoreDNS | UNIX LINUX EXPLORE
Edit

Enkripsi Lalu Lintas DNS Rumah Anda Secara Penuh Dengan CoreDNS

Secara tradisional, permintaan dan balasan DNS dilakukan melalui teks biasa. Permintaan dan balasan tersebut dikirim melalui Internet tanpa enkripsi atau perlindungan apa pun, bahkan saat Anda mengakses situs web yang aman. Hal ini berdampak besar pada keamanan dan privasi, karena permintaan tersebut dapat menjadi sasaran pengawasan, spoofing, dan pelacakan oleh pelaku kejahatan, pengiklan, ISP, dan lain-lain.

Server DNS Anda mengetahui banyak hal tentang Anda - bahkan server tersebut mengetahui setiap situs web yang Anda kunjungi. Antara ISP yang menyadap domain yang valid dan tidak valid, dan kemungkinan menjual riwayat penelusuran Anda kepada pengiklan, sangatlah bijaksana dan sangat mudah untuk mengenkripsi semua DNS Anda guna mencegah hal ini dan yang lebih penting, mengenkripsi data yang biasanya berupa teks biasa ini guna mencegah mata-mata.



1. SOFTWARE & HARDWARE

Untuk mengamankan DNS Anda sepenuhnya, Anda memerlukan dua perangkat lunak CoreDNS dan DNSProxy, yang keduanya merupakan program DNS berbasis GoLang berperforma tinggi yang dapat Anda unduh dari setiap halaman Rilis Github mereka.

Dengan kedua program ini, kita akan menyiapkan server DNS, DNS melalui TLS, dan DNS melalui HTTPS.

Karena CoreDNS dan DNSProxy sangat ringan dan tidak membutuhkan banyak sumber daya, kita dapat dengan mudah menjalankan server DNS lokal yang sepenuhnya aman pada sesuatu yang sekecil Raspberry Pi (saya sarankan Pi 4 2GB hanya untuk koneksi ethernet), atau sebagai sesuatu yang lebih tangguh seperti VM lokal, LXD, atau bahkan Docker Container!.


2. KONFIGURASI

Mengonfigurasi CoreDNS dan DNSProxy cukup mudah, namun untuk DoH dan DoT, Anda memerlukan sertifikat TLS yang valid. Anda dapat menggunakan panduan saya untuk membuat CA dan menandatangani sertifikat, atau jika Anda berencana menggunakan domain yang sudah ada dengan plugin parsial saya, Anda dapat menandatangani sertifikat Anda dengan certbot.

a. COREDNS

Setelah Anda memperoleh sertifikat yang valid, kita dapat mengunduh CoreDNS dari halaman Rilis di Github untuk platform Anda https://github.com/coredns/coredns/releases. Salin biner ini ke /usr/bin, dan tandai sebagai dapat dieksekusi.


$ wget https://github.com/coredns/coredns/releases/download/v1.8.4/coredns_1.8.4_linux_amd64.tgz
$ tar -xf coredns_1.8.4_linux_amd64.tgz
$ chmod +x coredns
$ mv coredns /usr/binSet
Demi alasan keamanan, kami akan menjalankan CoreDNS dengan penggunanya sendiri. Di Ubuntu, kami dapat dengan mudah membuat pengguna baru ini sebagai berikut:


$ useradd -Umrs /bin/false coredns
Buat direktori untuk menyimpan konfigurasi CoreDNS Anda, dan tetapkan kepemilikannya ke CoreDNS.


$ mkdir -p /etc/coredns
$ chown root:coredns
Selanjutnya, buat /etc/coredns/Corefile, dan tempatkan yang berikut ini. Perhatikan bahwa dalam contoh ini kami menggunakan sertifikat LetsEncrypt - pastikan Anda menyesuaikan jalur sebagaimana diperlukan.


.:1054 {
	reload
    errors

    forward . tls://1.1.1.1 tls://1.0.0.1 {
            tls_servername cloudflare-dns.com
            health_check 5s
            expire 3600s
    }

	cache 30
}

tls://.:853 {
	reload
	errors
	
	tls /opt/letsencrypt/live/coredns.example.com/fullchain.pem /opt/letsencrypt/live/coredns.example.com/privkey.pem {
		client_auth verify_if_given
	}

    forward . 127.0.0.1:1054 {
            health_check 5s
            expire 3600s
            policy sequential
    }
}

.:53 {
	reload
	errors
    forward . 127.0.0.1:1054 {
            health_check 5s
            expire 3600s
            policy sequential
    }
}
Sebelum melanjutkan, mari kita uraikan apa saja yang dilakukannya dari bawah ke atas:

b. DNS Resolver

Di sini kita memiliki DNS resolver standar yang meneruskan semua yang diterimanya ke port internal 1054. Karena sebagian besar permintaan tidak dienkripsi, ini akan memastikan bahwa semua permintaan ke server DNS Anda diteruskan ke server hulu yang akan memastikan bahwa permintaan tersebut dienkripsi sebelum meninggalkan jaringan Anda.


.:53 {
	reload
	errors
    forward . 127.0.0.1:1054 {
            health_check 5s
            expire 3600s
            policy sequential
    }
}

c. DoT Resolver

Aplikasi yang mendukungnya dapat menggunakan resolver DNS over TLS (DoT), yang melakukan hal yang sama persis dengan resolver DNS standar - meneruskan semua lalu lintas ke server hulu kami di port 1054 yang akan mengenkripsi semua yang ada di luarnya.


tls://.:853 {
	reload
	errors
	
	tls /opt/letsencrypt/live/coredns.example.com/fullchain.pem /opt/letsencrypt/live/coredns.example.com/privkey.pem {
		client_auth verify_if_given
	}

    forward . 127.0.0.1:1054 {
            health_check 5s
            expire 3600s
            policy sequential
    }
}

d. Server Penerusan Internal (Internal Forwarding Server)

Dan akhirnya, kami menjalankan server penerusan internal pada port 1054. Ini hanya digunakan secara internal, dan memastikan bahwa semua permintaan diteruskan ke server DNS tepercaya melalui TLS. Dalam contoh ini, saya menggunakan Cloudflare, tetapi Anda dapat menggunakan penyedia hulu mana pun yang Anda inginkan.

Selain itu, jika Anda ingin menambahkan aturan khusus atau mengaktifkan plugin apa pun, tambahkan aturan tersebut sebelum bagian penerusan.


.:1054 {
	reload
    errors

    forward . tls://1.1.1.1 tls://1.0.0.1 {
            tls_servername cloudflare-dns.com
            health_check 5s
            expire 3600s
    }

	cache 30
}
Selanjutnya, kita perlu membuat file systemd untuk memulai dan mengelola CoreDNS. Anda dapat menempatkannya di /etc/systemd/system/coredns.service


[Unit]
Description=CoreDNS DNS server
Documentation=https://coredns.io
After=network.target

[Service]
PermissionsStartOnly=true
LimitNOFILE=1048576
LimitNPROC=512
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
User=coredns
WorkingDirectory=/tmp
ExecStart=/usr/bin/coredns -conf=/etc/coredns/Corefile
ExecReload=/bin/kill -SIGUSR1 $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target
Terakhir, buka firewall pada komputer Anda untuk 53 dan 853, dan mulai layanannya.


$ ufw allow 53
$ ufw allow 853

$ systemctl daemon-reload
$ systemctl enable coredns
$ systemctl start coredns
Validasi CoreDNS yang sedang berjalan dengan vial journalctl, systemd status, atau dengan memeriksa apakah proses sedang berjalan (ps aux | grep coredns), lalu Anda dapat memvalidasinya agar berfungsi menggunakan dig dan kdig.

e. DNSPROXY

Meskipun CoreDNS menyediakan DNS dan DoT resolver, tetapi tidak menyediakan DNS over HTTPS atau DoH resolver, yang digunakan oleh Firefox dan Chrome sebagai bagian dari opsi "secure DNS" mereka. Untungnya, ini cukup mudah untuk disiapkan dan diaktifkan.

Pertama, unduh dan instal DNSProxy dari halaman Github ke /usr/local/bin


$ wget https://github.com/AdguardTeam/dnsproxy/releases/download/v0.38.1/dnsproxy-linux-amd64-v0.38.1.tar.gz
$ mv path/to/dnsproxy /usr/local/bin
$ chmod +x /usr/local/bin/dnsproxySetda
DNSProxy cukup mudah diatur, yang berarti kita dapat memasukkan semua konfigurasi kita ke dalam berkas systemd di /etc/systemd/system/dnsproxy.service. Secara umum, ini menciptakan resolver DoH pada port 443 dan 8443 untuk QUIC, yang meneruskan semuanya ke CoreDNS, memastikan bahwa semuanya dienkripsi sepenuhnya.


[Unit]
Description=DNSProxy - DoH and DoQ Proxy for CoreDNS
Documentation=https://github.com/AdguardTeam/dnsproxy
After=network.target

[Service]
PermissionsStartOnly=true
LimitNOFILE=1048576
LimitNPROC=512
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
User=coredns
WorkingDirectory=/tmp
ExecStart=/usr/local/bin/dnsproxy -l 0.0.0.0 --tls-min-version=1.2 --quic-port=8853 --https-port=443 --tls-crt=/opt/letsencrypt/live/coredns.example.com/fullchain.pem --tls-key=/opt/letsencrypt/live/coredns.example.com/privkey.pem -u 127.0.0.1:53 -p 0
Restart=on-failure

[Install]
WantedBy=multi-user.target
Terakhir, buka port dan mulai layanan dan Anda memiliki DNS lokal yang sepenuhnya terenkripsi.


$ ufw allow 443
$ ufw allow 8443
$ systemctl enable dnsproxy
$ systemctl start dnsproxy
Jangan lupa untuk memperbarui berkas resolve.conf Anda agar mengarah ke server DNS baru Anda, atau untuk menerapkan konfigurasi Anda di seluruh jaringan, perbarui konfigurasi router Anda untuk mengiklankan IP server DNS Anda yang menjalankan CoreDNS.

f. Validasi

Kita dapat memvalidasi konfigurasi kita menggunakan dig, kdig, dan curl untuk DNS, DoT, dan DoH.

Validasi DNS normal cukup mudah:


dig www.google.com @127.0.0.1SeSe
Validasi DoT memerlukan knot-dns, tetapi setelah diinstal dapat diperiksa dengan menjalankan perintah berikut.


kdig www.google.com @coredns.example.com +tls
Validasi DoH sama mudahnya, tetapi saya pribadi lebih suka menggunakan tool dog untuk memvalidasinya.


dog example.com --https @https://coredns.example.com/dns-query
Tentu saja, Anda dapat menggunakan sesuatu seperti dog untuk memvalidasi titik akhir TLS dan UDP serta TCP.

g. Modzilla Firefox dan Google Chrome

Firefox dan Chrome menyediakan sedikit panduan tentang cara mengonfigurasinya dengan penyedia DoH khusus.

Untuk Google Chrome, buka pengaturan keamanan, dan ubah DoH menjadi Kustom, menggunakan URL yang disesuaikan berikut: https://coredns.example.com/dns-query. Untuk Firefox, perubahannya identik.

Cara termudah untuk memverifikasi Firefox berfungsi dengan benar adalah jika Anda mengunjungi about:networking#dns, dan melihat apakah TRR (Trusted Recursive Resolver) mengembalikan true untuk domain mana pun.

Menggunakan lalu lintas DNS terenkripsi adalah cara yang bagus untuk meningkatkan privasi dan keamanan Anda saat menjelajah internet. Ingatlah bahwa, apa pun jenis enkripsi DNS yang Anda pilih, enkripsi tersebut lebih aman daripada tidak menggunakan enkripsi sama sekali. Sistem penyaringan lalu lintas DNS yang tepat dapat selalu menjaga Anda dan organisasi Anda aman dari serangan DNS dan membantu Anda menghemat sumber daya yang berharga.