Membangun Server DNS-over-HTTPS Menggunakan VPS

Membangun Server DNS-over-HTTPS menggunakan VPS. Di tutorial ini saya akan sharing sedikit mengenai bagaimana cara membangun server DoH. Yang kita butuhkan disini adalah satu VPS dengan spek yang sekiranya mampu menjalankan docker.

Namun sebelum memulai tutorial ini, saya tegaskan bahwa yang akan saya tulis adalah langkah-langkah atau arahan dasarnya saja. Jadi pastikan kalian sudah paham tentang Nginx ataupun Docker. Dan saya yakin kalian yang membaca tutorial ini pasti memang sudah bergelut dengan docker dan Nginx sebelumnya.

Kenapa docker? Karena saya lebih suka menjalankan service DoH nya di docker. Selain lebih simple juga lebih aman.

Jadi pastikan kalian sudah menginstall dan mengkonfigurasi docker di VPS yang akan dipasang DoH.
Selanjutnya, install Nginx di VPS. Nginx diinstall di sistem, bukan nginx docker.
sudo apt update && sudo apt install nginx
Selanjutnya jalankan perintah berikut untuk memasang DoH docker.
docker run -itd --restart=always --name doh-server -p 127.0.0.1:8053:8053 -e UPSTREAM_DNS_SERVER="udp:1.1.1.1:53" -e DOH_HTTP_PREFIX="/dns-query" -e DOH_SERVER_LISTEN=":8053" -e DOH_SERVER_TIMEOUT="10" -e DOH_SERVER_TRIES="3" -e DOH_SERVER_VERBOSE="false" satishweb/doh-server
Value DOH_SERVER_VERBOSE saya atur ke false karena nantinya doh server ini memang ingin saya jadikan public server yang bisa digunakan semua orang. Jadi memang sengaja log nya saya matikan biar saya juga tidak tau web apa yang dikunjungi oleh pemakai DoH server saya (masalah privasi). Namun jika kalian berencana menggunakan doh server ini untuk pribadi, ada baiknya value nya diubah menjadi true agar kalian bisa memeriksa seluruh query dns yang ada disana.

Yang kita gunakan disini adalah docker images dari satishweb.

Nah, untuk serverblock Nginx nya, berikut konfigurasi dasar yang saya gunakan.
server {
  listen       443 ssl http2;
  listen       [::]:443 ssl http2;
  server_name  doh.zafkiel.net;
  server_tokens off;

  ssl_protocols TLSv1.2 TLSv1.3;          # TLS 1.3 requires nginx >= 1.13.0
  ssl_prefer_server_ciphers on;
  ssl_dhparam /etc/ssl/certs/dhparam.pem; # openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
  ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
  ssl_ecdh_curve secp384r1;               # Requires nginx >= 1.1.0
  ssl_session_timeout  10m;
  ssl_session_cache shared:SSL:10m;
  ssl_session_tickets off;                # Requires nginx >= 1.5.9
  ssl_stapling on;                        # Requires nginx >= 1.3.7
  ssl_stapling_verify on;                 # Requires nginx => 1.3.7
  ssl_early_data off;                     # 0-RTT, enable if desired - Requires nginx >= 1.15.4
  resolver 1.1.1.1 valid=300s;            # Replace with your local resolver
  resolver_timeout 5s;

  # HTTP Security Headers
  add_header X-Frame-Options DENY;
  add_header X-Content-Type-Options nosniff;
  add_header X-XSS-Protection "1; mode=block";
  add_header Strict-Transport-Security "max-age=63072000";
  ssl_certificate /etc/nginx/ssl/zafkiel.net/cert.pem;
  ssl_certificate_key /etc/nginx/ssl/zafkiel.net/cert.key;
  location /dns-query {
    proxy_pass       http://localhost:8053/dns-query;
    proxy_set_header Host      $host;
    proxy_set_header X-Real-IP $remote_addr;
  }
}
Sesuaikan sendiri apa yang perlu disesuaikan. Selanjutnya, restart Nginx untuk melihat perubahan. Untuk SSL nya kalian bisa gunakan Let's Encrypt.

Contoh server DoH yang sukses terinstall:

Untuk client DoH, kalian bisa gunakan Cloudflared atau DoH Client. Atau di smartphone, kalian bisa gunakan DNSCloak.