dns.bibica.net v3 – Mosdns-x Native

Trên dns.bibica.net, ở phiên bản v1 tôi dùng AdGuard Home (Caddy), v2 đổi sang dùng Mosdns-x (Caddy + Redis), hiệu năng tốt cả, vì DNS yêu cầu phần cứng rất nhẹ, có điều cảm giác cấu hình dài dòng, phức tạp quá mức cần thiết, vì Mosdns-x tác giả đã tích hợp mọi thứ sẵn có cả rồi

Ở phiên bản v3, dùng duy nhất Mosdns-x, cài thêm 1 công cụ hỗ trợ tạo SSL, chọn lego vì có sẵn dự án hỗ trợ, về mặt lý thuyết, lego chỉ gọi khi tạo mới hoặc gia hạn SSL, không chạy ngầm, nên không tốn RAM

Reinstall OS

  • Trên 1 VPS mới reinstall bản mặc định, tránh mọi lỗi linh tinh phát sinh, phiên bản của bin456789 có sẵn chọn port, cài vào là coi như VPS đã tự đổi port SSH, đỡ 1 số thao tác thủ công
sudo -s
cd ~
curl -O https://raw.githubusercontent.com/bin456789/reinstall/main/reinstall.sh
bash reinstall.sh debian 13
# root with a default password 123@@@

Basic Optimization

  • Cài đặt một số ứng dụng nhỏ, tinh chỉnh 1 số thứ cơ bản ban đầu, chú ý là bản script này xóa khá sạch các ứng dụng còn sót trên Debian 13, mặc định tắt logs hệ thống
apt install -y curl sudo && curl -fsSL go.bibica.net/vps | sudo bash -s -- -no-log -no-docker
  • Xong xuôi reboot lại VPS cho sạch sẽ

Cài đặt Mosdns-x Native và lego

Cá nhân duy trì cài đặt tất cả mọi thứ vào thư mục /home/, nên làm bash script cài đặt Mosdns-x Native và lego tự động vào /home/

  • Nhập domain muốn dùng và thông tin Cloudflare API Token
wget -qO /home/setup-mosdns-x-native.sh https://go.bibica.net/mosdns-x && sudo bash /home/setup-mosdns-x-native.sh

Mặc định SSL tự động gia hạn mỗi ngày, không cần quan tâm tới nó, cập nhập các danh sách bộ lọc quảng cáo cũng đã chạy tự động, thường cũng hiếm khi nào cần quan tâm

Bash script có xử lý cơ bản các lỗi nếu có khi tạo SSL, lưu key Cloudflare API Token, cài đặt lại hoặc đổi domain khác chỉ cần chạy lại setup-mosdns-x-native.sh là được

  • v3 tạo sẵn 1 số command, khi dùng gỡ phải gõ nhiều, nhớ duy nhất dns -h là đủ
MosDNS-X Management Commands:
  dns start         - Start MosDNS-X service
  dns stop          - Stop MosDNS-X service
  dns restart       - Restart MosDNS-X service
  dns status        - Show MosDNS-X service status
  dns log           - View MosDNS-X logs
  dns update        - Update MosDNS-X and Lego to latest version
  dns no-ip-log     - Switch to MosDNS-X (Disable IP logging version)
  dns -v            - Show MosDNS-X version

Cá nhân hay dùng dns restart khi cập nhập cấu hình, thi thoảng chạy dns update để cập nhập mosdns-x và lego lên bản mới nhất

  • dns no-ip-log là tùy chọn cài đặt trên dns.bibica.net, nó dùng 1 bản build riêng, tắt tính năng ghi lại IP người dùng trong logs, trong trường hợp domain có nhiều IP quá, chỉ trả về tối đa 2 IP

Tùy chỉnh firewall

Với các dịch vụ DNS public, nên cài firewall, hạn chế các kết nối rác từ các tool, bot khác

nano /home/setup-geo-firewall.sh

Mặc định cho phép user IP VN truy cập vào VPS qua TCP port 22 443 853, UDP port 443 853

ALLOW_COUNTRIES=("VN")
ALLOW_TCP_PORTS=("22" "443" "853")
ALLOW_UDP_PORTS=("443" "853")

Cần mở thêm port nào, thêm vào ALLOW_TCP_PORTS, ALLOW_UDP_PORTS, các giá trị khác, dùng như mặc định là được

  • Điều chỉnh xong chạy cài đặt firewall
/home/setup-geo-firewall.sh

DoH DoT DoQ DoH3 firewwall đã cấu hình mặc định mở port, nếu VPS chạy qua các dịch vụ cloud như Amazon, Google, Oralce, Tencent …. cần vào quản trị mở các port TCP 443 853 – UDP 443 853

Kiểm tra tỷ lệ cache và tốc độ các giao thức

Giai đoạn đầu sử dụng, có thể bật ghi log

  • Sửa log level thành info, bỏ comment ở dòng - _query_summary trong /home/mosdns-x/config/config.yaml
log:
  level: info # Options: debug, info, error, warn
  file: "log/mosdns.log"

Chạy ít ngày, khi lượng log đủ nhiều, có thể kiểm tra tỷ lệ cache, tốc độ các giao thức bằng đoạn code bên dưới

awk '
/"protocol": "(h2|h3|tls|quic)"/ {
    match($0, /"protocol": "([^"]+)"/); proto = substr($0, RSTART+13, RLENGTH-14)
    match($0, /"elapsed": "([0-9.]+)(µs|ms)"/); 
    e = substr($0, RSTART, RLENGTH)
    gsub(/"elapsed": "|"/, "", e)
    match(e, /[0-9.]+/); time = substr(e, RSTART, RLENGTH)
    match($0, /"qname": "([^"]+)"/); domain = substr($0, RSTART+10, RLENGTH-11)
    
    if (index(e, "ms")) { 
        time *= 1000
        nc[proto]++; nct[proto] += time
        total_nc++; total_nct += time
    } else { 
        c[proto]++; ct[proto] += time
        total_c++; total_ct += time
    }
    tot[proto] += time; cnt[proto]++
    
    print time "\t" proto "\t" domain > "/tmp/mosdns_slow.txt"
}
function fmt(us) { return us >= 1000 ? sprintf("%.2fms", us/1000) : sprintf("%.2fµs", us) }
END {
    total = total_c + total_nc
    print "=== TOTAL ==="
    printf "Cache: %s (%d, %.1f%%) | Non-cache: %s (%d, %.1f%%) | Total: %d\n\n", 
        fmt(total_ct/total_c), total_c, total_c*100/total, 
        fmt(total_nct/total_nc), total_nc, total_nc*100/total, total
    
    print "=== PER PROTOCOL ==="
    for (p in tot) {
        ca = c[p] ? ct[p]/c[p] : 0; nca = nc[p] ? nct[p]/nc[p] : 0; t = c[p]+nc[p]
        printf "%s: Cache=%s (%d, %.1f%%) | Non-cache=%s (%d, %.1f%%) | Total=%d\n", 
            p, fmt(ca), c[p], c[p]*100/t, fmt(nca), nc[p], nc[p]*100/t, t
        cache[p] = ca; noncache[p] = nca
    }
    
    print "\n=== SUMMARY ==="
    
    n1=0; for (p in cache) { cl[n1]=p; cv[n1]=cache[p]; n1++ }
    for (i=0; i<n1; i++) for (j=i+1; j<n1; j++) 
        if (cv[i] > cv[j]) { t=cv[i]; cv[i]=cv[j]; cv[j]=t; t=cl[i]; cl[i]=cl[j]; cl[j]=t }
    
    n2=0; for (p in noncache) { ncl[n2]=p; ncv[n2]=noncache[p]; n2++ }
    for (i=0; i<n2; i++) for (j=i+1; j<n2; j++) 
        if (ncv[i] > ncv[j]) { t=ncv[i]; ncv[i]=ncv[j]; ncv[j]=t; t=ncl[i]; ncl[i]=ncl[j]; ncl[j]=t }
    
    printf "Cache: "; for (i=0; i<n1; i++) printf "%s%s (%s)", i?" > ":"", cl[i], fmt(cv[i]); print ""
    printf "Non-cache: "; for (i=0; i<n2; i++) printf "%s%s (%s)", i?" > ":"", ncl[i], fmt(ncv[i]); print ""
    
    close("/tmp/mosdns_slow.txt")
    print "\n=== TOP 10 SLOWEST ==="
    system("sort -rn /tmp/mosdns_slow.txt | head -10 | awk '\''function fmt(us) { return us >= 1000 ? sprintf(\"%.2fms\", us/1000) : sprintf(\"%.2fµs\", us) } {printf \"%2d. %s - %s - %s\\n\", NR, fmt($1), $2, $3}'\''")
    system("rm -f /tmp/mosdns_slow.txt")
}' /home/mosdns-x/log/mosdns.log

Lượng log lưu lại càng nhiều, kết quả sẽ ít sai số, lý thuyết, khi DNS server của bạn, lượng cache sử dụng > 90% thì không cần quan tâm tới dùng giao thức gì nữa, vì load từ cache, thường < 100µs, tức là < 0.1ms, mà 1000ms mới bằng …. 1 giây 😀

Kiểm tra các log lỗi

awk '/"resp_rcode": [1-9]/ || /"resp_rcode": [0-9][0-9]+/' /home/mosdns-x/log/mosdns.log > /home/mosdns-x/log/error.txt

Nó sẽ tạo ra file /home/mosdns-x/log/error.txt, ghi lại các resp_rcode khác 0, kiểm tra xem các domain này gặp vấn đề gì để có hướng sử lý

Hiệu năng

Không có khác biệt nhiều về hiệu năng, khi chạy mỗi Mosdns-x, hay kết hợp với Caddy, Redis, CPU dùng đa phần <2% CPU, cao nhất ~ 5% :]]

Ở bản v1 và v2 là chạy trên nhiều ứng dụng quá, nên khi restart, nó cần khởi động lại 2-3 ứng dụng, tạo ra các downtime ngắn, v3 chỉ chạy duy nhất 1 ứng dụng Mosdns-x, sẽ hạn chế vấn đề này

Giao thức Trung bình (ms) Nhanh nhất (ms) Chậm nhất (ms) Số lần test
DoQ 94.00 86.9 119.9 10
DoH3 100.09 85.6 126.4 10
DoH 216.36 209.5 252.5 10
DoT 219.49 206.4 233.3 10

Về tốc độ, DoH, DoT sẽ không nhanh bằng DoH3 hay DoQ, nhưng với cách cấu hình dùng cache trong bài, sự chênh lệch tốc độ giữa các giao thức, chỉ xảy ra ở lần đầu tiên truy cập 1 domain, tác dụng sẽ không rõ rệt

DoH3 và DoQ thực tế trên Mosdns-x chạy ổn định, nhưng 2 giao thức này chạy ở UDP và dùng nhiều công nghệ mới quá, đôi lúc có nhiều vấn đề mà đúng là chỉ có dùng mới thấy, nếu hệ thống bạn chạy ổn định, sẽ không bao giờ thấy các vấn đề này, thậm chí có thấy, cũng không thể gọi đây là lỗi, vì đó là “tính năng”

Cụ thể, trên DoH3/DoQ, khi hệ thống reboot hoặc dịch vụ DNS được restart, toàn bộ kết nối H3/QUIC hiện tại sẽ bị ngắt hoàn toàn, cần kết nối lại, dẫn đến tình trạng gián đoạn (downtime) khoảng 3–5 giây

-> Dùng DoH/DoT hiệu quả hơn, vẫn đáp ứng được chuyện nhanh, vì thực tế 99% các request được cache, độ ổn định tốt hơn khi server hoặc mạng người dùng chập chờn, đúng nghĩa đen là ổn định như cẩu :]]

Kết luận

Cá nhân vẫn thích dùng Caddy và chạy mọi thứ qua Docker, quản lý quen thuộc hơn, còn dùng trần như bản v3 thì được cái đơn giản, mosdns-x sập hay lỗi, kết luận ngay do mosdns-x, đỡ phải tìm hiểu nguyên nhân do ứng dụng nào

Hiệu năng thì thú thực DNS server nào cũng tốt, sử dụng gần như không ai cảm nhận được nếu không chạy benchmark, DoQ tổng thời gian kết nối, nhanh gấp đôi so với DoH là ít, mà dùng cũng rất khó phân biệt, chỉ trên các ứng dụng cần độ nhạy rất cao mới thấy khác

Đề xuất mọi người chạy trên DoH/DoT, các tool script đều chạy tốt, ổn định, DoQ, DoH3 …. vài ứng dụng chạy công nghệ cũ quá, phân giải DNS không được, kết nối lỗi be bét còn phiền hơn


Related Posts

Chính sách bình luận: Chúng tôi rất trân trọng các bình luận của bạn và cảm ơn thời gian bạn dành để chia sẻ ý tưởng và phản hồi.
Ghi chú: Những bình luận được xác định là spam hoặc chỉ mang tính quảng cáo sẽ bị xóa.

• Để cải thiện trải nghiệm bình luận, chúng tôi khuyến khích bạn tạo một tài khoản Gravatar. Thêm avatar vào tài khoản Gravatar sẽ giúp bình luận của bạn dễ nhận diện hơn đối với các thành viên khác.

✂️ Sao chép và 📋 Dán Emoji 💪 giúp bình luận thêm sinh động và thú vị!