
sumber gambar
DNS (Bahasa Inggris. Sistem Nama Domain) adalah sistem komputer terdistribusi untuk memperoleh informasi tentang domain.
TLS ( Transport Layer Security Protocol) - menyediakan transfer data yang aman antara node Internet.
Setelah beritanya, "Google Public DNS diam-diam menyalakan dukungan DNS over TLS," saya memutuskan untuk mencobanya. Saya memiliki Stunnel yang akan membuat terowongan TCP terenkripsi. Tetapi program biasanya berkomunikasi dengan DNS menggunakan protokol UDP . Oleh karena itu, kita memerlukan proxy yang akan meneruskan paket UDP ke dan dari aliran TCP. Kami akan menulisnya di Lua .
Seluruh perbedaan antara paket DNS dan UDP DNS:
4.2.2. Penggunaan TCP
Pesan yang dikirim melalui koneksi TCP menggunakan port server 53 (desimal). Pesan diawali dengan bidang panjang dua byte yang memberikan panjang pesan, tidak termasuk bidang panjang dua byte. Bidang panjang ini memungkinkan pemrosesan tingkat rendah untuk mengumpulkan pesan lengkap sebelum mulai menguraikannya.
RFC1035: NAMA DOMAIN - IMPLEMENTASI DAN SPESIFIKASI
Yaitu, kita lakukan di sana:
- kami mengambil paket dari UDP
- tambahkan padanya di awal beberapa byte di mana ukuran paket ini ditunjukkan
- kirim ke saluran TCP
Dan di arah yang berlawanan:
- kami membaca beberapa byte dari TCP, kami mendapatkan ukuran paket
- kami membaca paket dari TCP
- kirimkan ke penerima melalui UDP
Sesuaikan Stunnel
- Unduh sertifikat root Root-R2.crt di direktori dengan konfigurasi Stunnel
- Ubah sertifikat menjadi PEM
openssl x509 -inform DER -in Root-R2.crt -out Root-R2.pem -text
Kami menulis di stunnel.conf:
[dns] client = yes accept = 127.0.0.1:53 connect = 8.8.8.8:853 CAfile = Root-R2.pem verifyChain = yes checkIP = 8.8.8.8
Yaitu, Stunnel:
- akan menerima TCP yang tidak terenkripsi pada 127.0.0.1:53
- akan membuka terowongan TLS terenkripsi ke alamat 8.8.8.8:853 (Google DNS)
- akan mentransfer data bolak-balik
Luncurkan Stunnel
Pengoperasian terowongan dapat diperiksa dengan perintah:
nslookup -vc ya.ru 127.0.0.1
Opsi -vc memaksa nslookup untuk menggunakan koneksi TCP ke server DNS, bukan UDP.
Hasil:
*** Can't find server name for address 127.0.0.1: Non-existent domain Server: UnKnown Address: 127.0.0.1 Non-authoritative answer: Name: ya.ru Address: ( IP )
Menulis naskah
Saya menulis di Lua 5.3 . Operasi biner dengan angka sudah tersedia di dalamnya. Nah, kita akan membutuhkan modul Lua Socket .
Nama File: simple-udp-to-tcp-dns-proxy.lua
local socket = require "socket"
--[[--
Mari kita menulis fungsi sederhana yang akan memungkinkan Anda mengirim paket dump ke konsol. Saya ingin melihat apa yang dilakukan proxy.
--]]--
function serialize(data)
--[[--
UDP ke TCP dan kembali
Kami menulis dua fungsi yang akan beroperasi dengan dua saluran transmisi data.
--]]--
--[[--
Kedua fungsi menjalankan coroutine.yield () segera setelah diluncurkan. Ini memungkinkan Anda untuk melewatkan parameter fungsi ke panggilan pertama dan kemudian melakukan coroutine.resume (co) tanpa parameter tambahan.
utama
Dan sekarang fungsi utama yang akan mempersiapkan dan memulai loop utama.
--]]--
function main() local tcp_dns_socket = socket.tcp()
--[[--
Kami meluncurkan fungsi utama. Jika koneksi tiba-tiba ditutup, setelah sedetik kami akan membangun kembali dengan memanggil utama.
--]]--
repeat local ok, err = coroutine.resume(coroutine.create(main)) -- main if not ok then print(err) end socket.sleep(1) -- until false
periksa
Jalankan stunnel
Jalankan skrip kami
lua5.3 simple-udp-to-tcp-dns-proxy.lua
Periksa operasi skrip dengan perintah
nslookup ya.ru 127.0.0.1
Kali ini, tanpa '-vc', ini adalah bagaimana kami menulis dan memulai proksi, yang membungkus permintaan DNS UDP ke dalam terowongan TCP.
Hasil:
*** Can't find server name for address 127.0.0.1: Non-existent domain Server: UnKnown Address: 127.0.0.1 Non-authoritative answer: Name: ya.ru Address: ( IP )
Jika semuanya baik-baik saja, Anda dapat menentukan dalam pengaturan koneksi sebagai server DNS "127.0.0.1"
kesimpulan
Sekarang permintaan DNS kami dilindungi oleh TLS .
Tepat setelah koneksi, Windows mencoba mendaftarkan kami di server DNS Google melalui terowongan kami. Ini dinonaktifkan di pengaturan DNS tingkat lanjut dengan menghapus centang.

Masih ada permintaan untuk time.windows.com. Dia tidak begitu pribadi lagi, tetapi saya tidak pernah menemukan cara mematikannya. Sinkronisasi waktu otomatis dinonaktifkan.
tautan
- RFC1035: NAMA DOMAIN - IMPLEMENTASI DAN SPESIFIKASI
- DNS melalui TLS
- simple-udp-to-tcp-dns-proxy.lua
- Menulis permintaan DNS secara manual