DNS Dinamis adalah layanan jaringan untuk memetakan nama domain ke alamat IP dinamis (sementara, sering berubah). Ini digunakan untuk mengakses komputer yang tidak memiliki alamat IP statis, seperti yang ada di jaringan SOHO (Small Office/Home Office), dan sering digunakan dalam kombinasi dengan penerusan port untuk mengakses sistem yang berada di belakang firewall NAT. Artikel ini akan memandu Anda melalui penyiapan lengkap server DNS Dinamis dalam wadah Docker pada sistem Debian 10, termasuk menyiapkan catatan DNS yang diperlukan, menempatkan API manajemen di belakang proxy terbalik Nginx HTTPS, dan mengotomatiskan DNS sisi klien merekam pembaruan.
Persyaratan
- Satu server Debian 10, opsional dengan konektivitas IPv6. (192.0.2.2 dan 2001:0db8::0db9 akan digunakan sebagai placeholder untuk IPv4 dan IPv6 server masing-masing.)
- Akses ke pengguna root, atau pengguna dengan hak sudo.
- Port tcp/53 dan udp/53 harus tersedia di host.
- Nama domain terdaftar dan akses ke server nama/file zonanya. Buat data DNS untuk domain ini seperti yang ditunjukkan di bagian berikutnya.
- $EDITOR variabel lingkungan harus disetel.
- Secara opsional, sistem klien Linux/Unix apa pun untuk menyiapkan pembaruan data DNS otomatis.
Membuat data DNS.
Anda harus membuat setidaknya 2 catatan DNS agar server DNS dinamis Anda berfungsi. Pertama, pilih subdomain seperti ns1.domain_anda yang akan menunjuk ke alamat IPv4 server Anda. Kedua, pilih subdomain seperti ddns.domain_anda yang akan didelegasikan ke ns1.domain_anda.
Server DNS dinamis Anda akan menangani semua catatan di bawah ddns.your_domain. Catatan ketiga, tipe AAAA, adalah opsional. Catatan yang sesuai terlihat seperti berikut:
ns1.your_domain A 192.0.2.2
ddns.your_domain NS ns1.your_domain
ns1.your_domain AAAA 2001:0db8::0db9 (optional)
Anda harus membuat catatan ini di panel kontrol pencatat domain Anda. Harap perhatikan bahwa mungkin diperlukan waktu hingga 24 jam agar catatan ini menyebar dengan baik, tetapi biasanya butuh beberapa menit.
Instalasi
Jika Anda tidak menggunakan pengguna root, kami sarankan Anda memulai shell root sementara, karena sebagian besar perintah yang ditampilkan dalam panduan ini memerlukan hak istimewa yang lebih tinggi. Untuk meluncurkan shell root, gunakan salah satu perintah berikut:
sudo su - root
sudo -s
Langkah 1:Memperbarui dan menginstal dependensi.
Itu selalu merupakan praktik yang baik untuk memperbarui sistem Anda terlebih dahulu:
apt update
apt upgrade -y
reboot
Setelah reboot, instal paket perangkat lunak yang diperlukan untuk pengaturan ini:
- certbot akan digunakan untuk mendapatkan sertifikat SSL/TLS.
- buat diperlukan untuk membangun image buruh pelabuhan di mana server DDNS akan dijalankan.
- apt-transport-https , sertifikat ca , ikal , gnupg2 dan software-properties-common diperlukan untuk menginstal repositori Docker dan kunci GPG yang sesuai.
- dnsutils menyediakan penggalian , yang akan digunakan untuk pengujian.
apt install -y certbot make apt-transport-https curl ca-certificates software-properties-common gnupg2 dnsutils
Langkah 2:Instal Docker CE.
Tambahkan kunci GPG Docker:
curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
Instal repositori buruh pelabuhan:
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian buster stable"
Perbarui cache repositori Debian lalu instal buruh pelabuhan dan dependensinya:
apt update
apt install -y docker-ce docker-ce-cli containerd.io
Setelah instalasi selesai, pastikan layanan buruh pelabuhan diaktifkan dan berjalan sebagai berikut:
systemctl enable --now docker.service
Langkah 3:Unduh dan bangun docker-ddns
Server DNS dinamis kami akan didukung oleh wadah buruh pelabuhan yang menggunakan Bind sebagai server DNS dan API manajemen yang ditulis dalam Go. Pertama, clone repositori Github dan buat image container dengan perintah berikut:
git clone https://github.com/dprandzioch/docker-ddns.git
cd docker-ddns
make image
Tunggu hingga proses selesai, yang mungkin memakan waktu cukup lama, lalu buka file envfile dengan editor teks:
$EDITOR envfile
Dan masukkan berikut ini:
SHARED_SECRET=your_secret
ZONE=ddns.your_domain
RECORD_TTL=60
Rahasia bersama adalah kata sandi yang akan digunakan untuk mengautentikasi dengan API manajemen. ZONE menunjukkan zona DNS mana yang akan menjadi tanggung jawab server Anda, dan TTL catatan menentukan berapa lama catatan DNS dapat di-cache. TTL 60 detik direkomendasikan untuk IP dinamis yang sering berubah.
Jika diperlukan, Anda dapat membuat string 40 karakter acak untuk rahasia menggunakan perintah berikut:
cat /dev/urandom | tr -dc "a-zA-Z0-9" | fold -w 40 | head -1
Sekarang kita dapat membuat wadah:
docker create -it -p 127.0.0.1:8080:8080 -p 53:53 -p 53:53/udp --env-file envfile -v /mnt/ddns-data:/var/cache/bind --name ddns-server davd/docker-ddns
Perintah ini akan membuat container bernama ddns-server dari image yang kita buat sebelumnya, dan akan memetakan port 8080/tcp, 53/tcp dan 53/udp dari host ke container. Itu juga akan me-mount direktori /mnt/ddns-data dari host, di /var/cache/bind di sistem file container. Ini digunakan untuk mempertahankan data DNS di seluruh pembuatan ulang container.
Verifikasi bahwa wadah telah dibuat dengan perintah:
docker container ls -a
Satu entri harus dikeluarkan dengan nama ddns-server.
Langkah 4:Layanan systemd (opsional)
Langkah ini untuk manajemen yang lebih sederhana tetapi tidak sepenuhnya diperlukan. Jika Anda memilih untuk tidak menggunakan layanan systemd, Anda harus mengelola container secara manual atau menggunakan solusi manajemen lain. Harap diperhatikan bahwa untuk penerapan container yang lebih besar dan kompleks, solusi orkestrasi seperti Kubernetes atau Docker Swarm direkomendasikan. Dalam hal ini, layanan systemd sangat cocok, karena kami hanya menjalankan satu wadah.
Untuk dapat mengelola wadah ini sebagai layanan sistem, kami akan membungkusnya dalam unit systemd. Buat file /etc/systemd/system/ddns-server-ct.service dengan editor teks Anda:
$EDITOR /etc/systemd/system/ddns-server-ct.service
Dan tambahkan berikut ini :
[Unit]
Description=DDNS Server Docker Container
After=docker.service
Requires=docker.service
Requires=network.target
[Service]
Type=oneshot
TimeoutStartSec=240
Restart=no
RemainAfterExit=yes
ExecStart=/usr/bin/docker start ddns-server
ExecStop=/usr/bin/docker stop ddns-server
[Install]
WantedBy=multi-user.target
Simpan dan keluar, lalu atur izin yang benar pada file unit ini:
chmod 664 /etc/systemd/system/ddns-server-ct.service
Muat file layanan baru dengan perintah berikut:
systemctl daemon-reload
Anda sekarang dapat memulai dan menghentikan penampung ini menggunakan systemctl seperti layanan sistem lainnya.
Jika Anda ingin server DDNS dimulai secara otomatis saat boot sistem, jalankan perintah berikut:
systemctl enable ddns-server-ct.service
Langkah 5:Menguji server Anda
Sebelum melanjutkan penyiapan, kami akan menguji API manajemen secara lokal. Mulai penampung:
systemctl start ddns-server-ct.service
Kirim permintaan GET ke API untuk membuat catatan baru:
CATATAN: API saat ini hanya dapat diakses secara lokal (yaitu dari localhost).
curl "http://127.0.0.1:8080/update?secret=your_secret&domain=test1&addr=1.1.1.1"
Curl harus mengembalikan respons berikut:
{"Success":true,"Message":"Updated A record for test1 to IP address 1.1.1.1","Domain":"test1","Domains":["test1"],"Address":"1.1.1.1","AddrType":"A"}
CATATAN: Domain test1 mengacu pada test1.ddns.domain_anda. karena server menangani ddns.domain_anda. zona.
Lakukan pencarian DNS untuk memverifikasi bahwa catatan memang dibuat dan untuk menguji resolusi DNS:
dig +short -t A test1.ddns.your_domain @127.0.0.1
Outputnya harus 1.1.1.1.
Langkah 6:Reverse proxy
Karena API bekerja melalui HTTP, rahasia otentikasi Anda berpotensi diendus setiap kali Anda mengirim permintaan melalui jaringan. Penyerang kemudian dapat memanipulasi catatan DNS Anda menggunakan rahasia Anda. Kami akan menyiapkan proxy terbalik menggunakan Nginx dan mengamankannya menggunakan HTTPS. Pertama, dapatkan sertifikat SSL dari Let's Encrypt using certbot:
certbot certonly --standalone --agree-tos -m [email protected] -d ns1.your_domain
Kepemilikan domain Anda akan diverifikasi dan sertifikat akan diterbitkan. Selanjutnya, instal Nginx dan pastikan sudah diaktifkan dan berjalan:
apt install -y nginx systemctl enable --now nginx.service
Kemudian nonaktifkan file blok server default, karena tidak diperlukan:
unlink /etc/nginx/sites-enabled/default
Sekarang kita akan membuat file konfigurasi baru untuk reverse proxy, misalnya:
$EDITOR /etc/nginx/sites-available/ddns-api-proxy.conf
Dan rekatkan yang berikut ini, pastikan Anda mengganti alamat IP dan nama domain dengan milik Anda sendiri:
server {
listen 192.0.2.2:8080;
server_name ns1.your_domain;
ssl on;
ssl_certificate /etc/letsencrypt/live/ns1.your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ns1.your_domain/privkey.pem;
location /update {
proxy_pass http://127.0.0.1:8080;
}
location / {
return 404;
}
access_log /var/log/nginx/ddns-api-access.log;
error_log /var/log/nginx/ddns-api-error.log;
}
Opsional: Jika Anda ingin API dapat diakses melalui IPv6, tambahkan baris berikut setelah direktif mendengarkan yang ada:
listen [2001:0db8::0db9]:8080;
Aktifkan konfigurasi ini dan terapkan perubahan dengan memuat ulang Nginx:
ln -s /etc/nginx/sites-available/ddns-api-proxy.conf /etc/nginx/sites-enabled/
systemctl reload nginx.service
API sekarang harus dapat diakses melalui internet, dan hanya akan menerima koneksi HTTPS. Untuk mengujinya, jalankan perintah:
curl "https://ns1.your_domain:8080/update?secret=your_secret&domain=test2&addr=1.1.1.2"
Ini harus mengembalikan yang berikut:
{"Success":true,"Message":"Updated A record for test2 to IP address 1.1.1.2","Domain":"test2","Domains":["test2"],"Address":"1.1.1.2","AddrType":"A"}
Langkah 7:Konfigurasi klien
Anda dapat mengatur pembaruan rekaman otomatis pada router apa pun yang mendukung penyedia DNS dinamis kustom, seperti Pfsense. Anda juga dapat mengaturnya di sebagian besar perangkat lain di kantor atau jaringan rumah Anda. Untuk memperbarui atau membuat catatan, permintaan GET harus dikirim ke titik akhir berikut:
https://ns1.your_domain:8080/update?secret=your_secret&domain=your_subdomain&addr=your_ip_address
Anda juga dapat memperbarui catatan beberapa subdomain dengan satu permintaan. Misalnya, untuk membuat/memperbarui catatan untuk sub1.ddns.domain_anda dan sub2.ddns.domain_anda dengan alamat IP 198.51.100.100, Anda akan mengirim permintaan GET ke URL ini:
https://ns1.your_domain:8080/update?secret=your_secret&domain=sub1,sub2&addr=198.51.100.100
Parameter addr juga dapat menyimpan alamat IPv6 untuk membuat/memperbarui catatan DNS AAAA, misalnya:
https://ns1.your_domain:8080/update?secret=your_secret&domain=cheese&addr=2001:0db8:aaaa::
Untuk mengotomatiskan pembaruan ini pada klien Linux, simpan skrip bash berikut sebagai /opt/ddns-update.sh:
#!/bin/bash
while [ -z $CURRENTIP ] do
CURRENTIP=`dig -r +short myip.opendns.com @resolver1.opendns.com 2>/dev/null`
sleep 1
done
curl -s "https://ns1.your_domain:8080/update?secret=your_secret&domain=your_subdomain&addr=${CURRENTIP}"
Script ini menggunakan while-loop yang membungkus perintah dig yang memperoleh alamat IP publik klien dan menyimpannya dalam sebuah variabel. Loop memastikan bahwa IP publik diambil dengan benar. Kemudian, cURL digunakan untuk mengirim permintaan API untuk memperbarui catatan DNS dengan IP yang baru diambil ini. Pastikan Anda mengganti nilai untuk your_secret dan your_subdomain.
Selanjutnya, buat skrip ini dapat dieksekusi:
chmod +x /opt/ddns-update.sh
Kemudian luncurkan editor crontab:
crontab -e
Tambahkan baris berikut di akhir crontab Anda:
*/2 * * * * /opt/ddns-update.sh
Simpan dan keluar. Script sekarang akan berjalan setiap dua menit, menjaga catatan DNS dinamis Anda tetap up to date dengan alamat IP publik terbaru klien.
Bacaan Lebih Lanjut
- Artikel Wikipedia DNS Dinamis
- docker-ddns di Github