Membangun sistem DNS dinamis nirserver dengan AWS

Bagaimana konten ini?

Postingan ini awalnya diterbitkan pada bulan Desember 2015. Diperbarui pada bulan Juli 2023 untuk menjadikan solusi lebih hemat biaya dan efisien. Postingan ini telah diperbarui untuk menggantikan Amazon API Gateway dengan URL fungsi AWS Lambda dan Amazon Simple Storage Service (Amazon S3) dengan Amazon DynamoDB. Penggunaan URL fungsi Lambda mengurangi keseluruhan biaya solusi. Fitur ini hadir tanpa biaya tambahan saat menggunakan layanan Lambda, dan menyediakan titik akhir HTTP RESTful yang berinteraksi dengan klien kami. Mengganti Amazon S3 dengan DynamoDB akan meningkatkan efisiensi solusi dan mengurangi latensi keseluruhan saat membuat kueri data.

Startup tahap awal, usaha kecil, dan jaringan rumah sering kali memiliki alamat IP publik dinamis yang dapat berubah tanpa pemberitahuan. Karena perubahan alamat ini, Anda tidak dapat mengakses sistem di jaringan ini dari luar dengan pasti. Bagi startup yang masih berada pada tahap awal perkembangan mereka, penting untuk menyediakan layanan yang andal dan tersedia dengan baik untuk mendapatkan kepercayaan dari pelanggan pertama Anda.

Sistem DNS Dinamis mengatasi masalah ini dengan menjalankan agen perangkat lunak di dalam jaringan Anda untuk terus memperbarui data DNS dengan alamat IP publik terbaru. Selama catatan DNS terbaru, Anda dapat menemukan jaringan Anda dan pelanggan dapat mengakses layanan Anda dengan andal.

Dalam postingan ini, kami menjelaskan cara membangun sistem DNS dinamis Anda sendiri dengan menggunakan layanan AWS nirserver. Membangun sistem nirserver hanya menggunakan layanan Amazon Web Services (AWS) dan beberapa baris kode adalah hal yang sederhana, hemat biaya, dan dapat diskalakan, serta memungkinkan Anda fokus pada logika bisnis inti startup Anda, daripada mengkhawatirkan penskalaan dan memelihara infrastruktur yang mendasarinya.

Layanan AWS yang kami gunakan dalam sistem DNS dinamis kami

Di bagian selanjutnya, kami menunjukkan cara menggunakan layanan AWS berikut untuk membangun solusi DNS dinamis:

  • Layanan AWS Lambda memungkinkan Anda menjalankan kode tanpa harus mengelola server yang mendasarinya. Kode Anda selalu siap dijalankan, tetapi Anda hanya dikenakan biaya per invokasi fungsi, dengan kelipatan 1 milidetik. Layanan Lambda dapat berinteraksi dengan layanan AWS lainnya melalui AWS SDK.
  • URL fungsi Lambda menyediakan titik akhir HTTPS khusus untuk fungsi Lambda Anda. Hal ini memungkinkan Anda langsung menginvokasi fungsi dari aplikasi klien Anda tanpa perlu menggunakan AWS SDK atau menginvokasi fungsi melalui layanan proksi tambahan. Fitur ini hadir tanpa biaya tambahan untuk layanan Lambda.
  • Amazon Route 53 adalah layanan DNS terkelola yang memungkinkan Anda mendaftarkan dan meng-hosting domain serta zona DNS dari jaringan global server DNS. Seperti semua layanan AWS, Route 53 dapat dikelola melalui API.
  • DynamoDB adalah basis data NoSQL yang dikelola sepenuhnya, nirserver, dan bernilai kunci, yang dirancang untuk menjalankan aplikasi beperforma tinggi pada skala apa pun. DynamoDB menawarkan keamanan bawaan, pencadangan berkelanjutan, replikasi multi-Wilayah otomatis, cache dalam memori, serta alat impor dan ekspor data.

Aliran logis dari sistem DNS dinamis

Gambar 1 menunjukkan bagaimana klien menemukan alamat IP-nya sendiri dengan membuat permintaan API ke layanan yang dibangun menggunakan fungsi Lambda dan URL fungsi terikatnya.

Seperti yang ditunjukkan pada Gambar 2, setelah klien mengetahui IP publiknya, klien membuat permintaan lain ke layanan kami untuk mengatur data DNS. Fungsi Lambda pertama-tama memeriksa catatan yang disimpan di tabel DynamoDB kami untuk memvalidasi permintaan. Jika pemeriksaan berhasil, fungsi Lambda kemudian mengatur entri DNS di Route 53 melalui panggilan API. Sekarang IP jaringan saat ini berada dalam DNS publik dan dapat ditemukan dengan kueri DNS standar.

Manfaat DNS dinamis dengan Lambda dan Route 53

Berikut beberapa keuntungan yang akan Anda peroleh dengan menjalankan sistem DNS dinamis nirserver:

  • Lebih mudah diatur. Ada klien sampel beserta semua kode, konfigurasi, dan instruksi untuk menyiapkannya di akun AWS Anda sendiri.
  • Sedikit hingga tanpa klien. Dibutuhkan tiga perintah untuk memperbarui API. Anda dapat menulis klien Anda sendiri dalam sebagian besar bahasa dan menjalankannya di berbagai platform, termasuk Windows, Linux, macOS, Raspberry Pi, Chrome OS, dan firmware ruter DD-WRT/Tomato USB 
  • Dukungan untuk jumlah klien, nama host, dan domain yang berubah-ubah. Batasan dan kuota layanan Route 53 dapat ditemukan di bagian “Kuota” pada Panduan Developer Route 53.
  • Hemat biaya–1 USD hingga 2 USD per bulan. Zona Route 53 masing-masing berharga 0,50 USD per bulan, 1.000.000 kueri DNS berharga 0,40 USD, dan 10.000 permintaan fungsi Lambda untuk memperbarui DNS di bawah 0,01 USD.
  • Arsitektur nirserver. Teknologi nirserver menghadirkan penskalaan otomatis, ketersediaan tinggi bawaan, dan model penagihan bayar sesuai penggunaan untuk meningkatkan ketangkasan dan mengoptimalkan biaya.
  • Izin terperinci hanya mengizinkan klien yang berwenang untuk memperbarui nama host mereka sendiri. Klien dapat memperbarui sistem hanya dari alamat yang ditambahkan ke DNS.
  • Perubahan kecil yang diperlukan untuk pengaturan DNS Anda saat ini. Anda dapat meninggalkan zona .com utama Anda dengan penyedia DNS saat ini dan menggunakan zona dynamic.example.com sekunder di AWS. Lihat “Membuat zona yang di-hosting publik di Panduan Developer Route 53 untuk informasi selengkapnya tentang membuat zona yang di-hosting di Route 53.

Prasyarat

Anda memerlukan dua hal untuk membangun solusi ini:

  1. Akun AWS. Akun baru memenuhi syarat untuk AWS Tingkat Gratis.
  2. Domain yang Anda miliki, yang di-hosting di Route 53 atau penyedia lain. Anda dapat mendaftarkan domain melalui Route 53 jika diperlukan mulai dari 3,00 USD. Lihat Harga Amazon Route 53 untuk Pendaftaran Domain untuk kisaran harga penuh.

Cara membangun sistem DNS dinamis di akun Anda

Pada titik ini, Anda memiliki cukup informasi untuk mulai membangun salinan sistem Anda sendiri. Lanjutkan baca jika Anda ingin mempelajari selengkapnya tentang cara kerjanya.

Jika Anda ingin mulai membangun, DNS dinamis Route 53 dengan Lambda tersedia di GitHub. DNS ini memberikan instruksi bergambar serta semua kode dan konfigurasi yang diperlukan.

Cara kerja sistem baru

Pertama, klien perlu menemukan IP publik yang ditetapkan untuk jaringannya. Jika Anda membuat permintaan dari jaringan Anda ke layanan di internet, layanan tersebut akan melihat permintaan tersebut berasal dari alamat IP eksternal Anda.

Selanjutnya, klien membuat permintaanHTTP POSTke URL fungsi Lambda dengan isi permintaan{"execution_mode":"get"}, dan mendapat respons yang berisi alamat IP publik saat ini:

HTTP POST
> https://.....lambda-url.eu-west-1.on.aws

{“return_message”:
“176.32.100.36”, “return_status”: “success”}

Selama proses ini, URL fungsi Lambda mengonversi permintaanHTTPke JSON, termasuk semua parameter permintaan, dan meneruskan alamat IP sumber pemohon ke fungsi Lambda Python. Fungsi Lambda kemudian mengirimkan respons JSON dengan IP kembali ke klien.

Gambar 3 menunjukkan permintaan untuk mendapatkan IP publik.

Klien sekarang membuat token permintaan dengan menautkan alamat IP publik yang dikembalikan dari permintaan HTTP POST , nama host DNS, dan rahasia bersama. Misalnya, jika alamat IP Anda adalah 176.32.100.36, nama host Anda adalah host1.dyn.example.com, dan rahasia bersama Anda adalah shared_secret_1, string yang ditautkan adalah sebagai berikut:

176.32.100.36host1.dyn.example.comshared_secret_1

Selanjutnya, klien menghasilkanfungsi hash SHA-256  dari string:

echo -n 176.32.100.36host1.dyn.example.comshared_secret_1 | shasum -a 256

Hash: 96772404892f24ada64bbc4b92a0949b25ccc703270b1f6a51602a1059815535

Klien kemudian meminta pembaruan DNS dengan membuat permintaan HTTP POST kedua. Permintaan ini meneruskan nama host teks biasa sebagai kunci dan fungsi hash sebagai token autentikasi dalam isi permintaan:

HTTP POST > https://....lambda-url.eu-west-1.on.aws

{“execution_mode”:”set”, “ddns_hostname”:”host1.dyn.example.com”, “validation_hash”:”96772404892f24ada64bbc4b92a0949b25ccc703270b1f6a51602a1059815535”}

URL fungsi Lambda kemudian meneruskan parameter permintaan kembali ke fungsi Lambda.

Setelah itu, fungsi Lambda membuat kueri catatan konfigurasi JSON-nya dari DynamoDB menggunakan AWS SDK for Python (Boto3). Dalam sistem ini, interaksi antara layanan Lambda, DynamoDB, dan Route 53 menggunakan Boto3, yang telah dibangun sebelumnya ke dalam lingkungan runtime layanan Lambda.

Setelah fungsi Lambda membuat kueri catatan konfigurasi dari DynamoDB, fungsi ini menggunakan nama host sebagai kunci untuk menemukan rahasia bersama, dan konfigurasi lain yang terkait dengan catatan tersebut, mirip dengan contoh catatan berikut:

{
"host1.dyn.example.com.": {
"aws_region": "us-west-2",
"route_53_zone_id": "MY_ZONE_ID",
"route_53_record_ttl": 60,
"route_53_record_type": "A",
"shared_secret": "SHARED_SECRET_1"
},
"host2.dyn.example.com.": {.....

Klien meneruskan host1.dyn.example.com sebagai kunci, sehingga fungsi Lambda membaca SHARED_SECRET_1 dari konfigurasi, dan membuat kembali token fungsi hash menggunakan nama host, alamat IP pemohon, dan rahasia bersama. Jika fungsi hash yang dihitung oleh fungsi Lambda dan fungsi hash yang diterima dari klien cocok, permintaan tersebut dianggap valid.

Setelah permintaan divalidasi, fungsi Lambda menggunakan informasi dari konfigurasi tersebut untuk membuat panggilan API ke Route 53 guna melihat apakah nama host DNS sudah ditetapkan dengan IP klien. Jika tidak ada perubahan yang diperlukan, fungsi Lambda akan merespons klien dan mengeluarkan:

{“return_message”: “Your IP address matches the current Route53 DNS record.”,
 “return_status”: “success”}

Jika tidak ada catatan, atau jika catatan saat ini dan IP klien tidak cocok, fungsi Lambda membuat panggilan API ke Route 53 untuk menetapkan catatan, merespons klien, dan mengeluarkan:

{“return_message”: “Your hostname record host1.dyn.example.com. has been set to 176.32.100.36”,
 “return_status”: “success”}

Gambar 4 menunjukkan permintaan untuk menetapkan nama host.

Bagaimana sistem ini diamankan?

  • Semua komunikasi yang menggunakan URL fungsi Lambda dienkripsi.
  • Rahasia bersama tidak pernah disebarkan melalui internet.
  • Tingkat permintaan klien dapat dibatasi menggunakan fitur konkurensi terpesan dari layanan Lambda.
  • Mekanisme autentikasi bersifat multi-faktor karena klien menyajikan rahasia bersama (“sesuatu yang dimilikinya”) dan alamat IP publiknya sendiri (“sesuatu yang ada”).
  • File konfigurasi dapat dienkripsi saat diam melalui enkripsi sisi server DynamoDB.
  • Kredensial AWS Anda tidak digunakan, sehingga tidak dapat dibocorkan.

Penutup

Sistem DNS dinamis yang kami jelaskan dalam postingan ini menunjukkan cara membuat solusi nirserver Anda sendiri di AWS untuk memecahkan masalah dunia nyata—DNS rentan terhadap perubahan dan Anda mungkin tidak menyadarinya!

Gunakan solusi ini untuk menjalankan DNS dinamis Anda sendiri di AWS. Atau, gunakan ini sebagai contoh untuk mempelajari penggunaan Anda atas layanan AWS untuk membuat solusi nirserver Anda sendiri pada skala apa pun.

Kunjungi repositori DNS dinamis Route 53 dengan Lambda di GitHub untuk kumpulan kode lengkap, konfigurasi, dan instruksi tentang cara melakukan deployment.

Bagaimana konten ini?