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 -hlà đủ
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-loglà 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_summarytrong/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
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ị!