Monday, 3 February 2020

Cài Unbound làm caching DNS resolver trên máy ảo OpenBSD 6.6

 DNS Server (recursive name server)


Người dùng máy tính đặc biệt ở Việt Nam đã từng biết đổi DNS để vào Facebook những ngày mạng còn "chậm".

Những con số như 8.8.8.8 (Google DNS), 208.67.222.222 (OpenDNS) hay 1.1.1.1 (Cloudflare DNS) không còn lạ gì.
Những địa chỉ IP này có chạy 1 DNS server làm nhiệm vụ trả lời IP tương ứng của các domain được hỏi.

Ví dụ facebook.com có (những) IP là gì?
$ nslookup facebook.com 8.8.8.8
Server:        8.8.8.8
Address:    8.8.8.8#53

Non-authoritative answer:
Name:    facebook.com
Address: 31.13.95.36
Name:    facebook.com
Address: 2a03:2880:f102:83:face:b00c:0:25de

authoritative name server vs recursive resolver

Chương trình chạy ở 8.8.8.8 sẽ tìm địa chỉ IP tương ứng với domain facebook.com như bạn đã yêu cầu. Đây là một dịch vụ "trung gian", nó sẽ đi hỏi các "root nameservers" (.com, .org...) để tìm câu trả lời, bản thân nó không có câu trả lời.
Việc đi hỏi chỗ khác để lấy câu trả lời gọi là "recursive query", bởi chỗ khác cũng có thể không có câu trả lời và phải đi hỏi tiếp cấp cao hơn. Chương trình thực hiện tính năng tìm kiếm "hộ" này gọi là Recursive resolver. Khác với chương trình có câu trả lời TRỰC TIẾP cho 1 domain cụ thể - gọi là authoritative name server.

Ưu điểm của các dịch vụ này

- Tính sẵn sàng cao, ít khi bị sập (đều do những "ông lớn" internet vận hành)
- Có thể nhanh hơn, ví dụ với Google DNS 8.8.8.8, khi được truy cập, một server của Google nằm gần bạn nhất sẽ trả lời. (Phía dưới số 8.8.8.8 không phải là 1 máy ở đâu đó, mà là rất nhiều máy, và nó chọn cái nào gần bạn nhất)

NHƯỢC ĐIỂM

- Privacy (sự riêng tư): mọi câu hỏi của bạn, dịch vụ DNS đều biết. Tức là bạn vào website nào, thì Google (cho 8.8.8.8), hay Cloudflare (1.1.1.1), ... đều biết cả. Nghe có vẻ không to tát, nhưng hãy nghĩ xem, chỉ cần biết các trang web bạn vào ngày hôm nay, cũng phần LỚN biết bạn đang làm gì (youtube, facebook, hay các trang web top truy cập của Việt Nam)

Unbound

1 cách đơn giản để giải quyết vấn đề này là tự chạy DNS server để dùng trong mạng nhà mình (cho cả điện thoại), hay thậm chí, trên máy tính của mình.
Unbound là giải pháp dễ dàng, xịn nhất ở đây.

Unbound vs BIND

Unbound ra đời sau, có kiến trúc hiện đại hơn, cấu hình đơn giản hơn, và được cho là bảo mật hơn.

Cài đặt Unbound
Trên Ubuntu 18.04:

sudo apt-get update && sudo apt-get install -y unbound
Phần còn lại hướng dẫn cấu hình unbound trên máy ảo OpenBSD sử dụng Vagrant.

 $ whatis unbound
unbound (8)          - Unbound DNS validating resolver 

Unbound trên OpenDNS

(hoàn toàn tương tự có thể cài Unbound trên Ubuntu, Debian...)

Unbound là DNS server mặc định trên OpenBSD, hệ điều hành bảo mật nhất trái đất (theo ai đánh giá thì tùy người đó).
 Tạo OpenBSD box dùng Vagrant
mkdir openbsdvm
cd openbsdvm/
vagrant init
sed -i 's:base:generic/openbsd6:' Vagrantfile
vagrant up
#Chờ Vagrant tải OpenBSD box về máy
vagrant ssh

SSH vào máy ảo, bật unbound và hỏi unbound xem IP của pymi.vn là bao nhiêu
-bash-5.0$ uname -a
OpenBSD bazinga.localdomain 6.6 GENERIC.MP#372 amd64
-bash-5.0$ sudo -sH
bash-5.0# rcctl enable unbound
bash-5.0# rcctl start unbound
bash-5.0# ps xau | grep unbound
_unbound 32604  0.0  0.5 11408 11372 ??  I       3:36PM    0:00.04 unbound -c /var/unbound/etc/unbound.conf
root      3181  0.0  0.0   132   300 p0  R+/1    4:04PM    0:00.00 grep unbound
-bash-5.0$ nslookup tuoitre.vn 8.8.8.8
Server:        8.8.8.8
Address:    8.8.8.8#53

Non-authoritative answer:
Name:    tuoitre.vn
Address: 222.255.239.80

-bash-5.0$ nslookup tuoitre.vn 127.0.0.1
Server:        127.0.0.1
Address:    127.0.0.1#53

Non-authoritative answer:
Name:    tuoitre.vn
Address: 222.255.239.80
Kết quả unbound trả về giống hệt 8.8.8.8 của Google.

Là một máy ảo vagrant, ta có thể truy cập máy này từ máy host (máy thật), tìm địa chỉ IP của máy ảo vagrant (chú ý, có thể set IP cố định trong Vagrantfile):
bash-5.0# ifconfig | grep inet
    inet 127.0.0.1 netmask 0xff000000
    inet 192.168.121.82 netmask 0xffffff00 broadcast 192.168.121.255
Thay đổi file /var/unbound/etc/unbound.conf  (đường dẫn xuất hiện trong output lệnh ps xau)
server:
        interface: 0.0.0.0
        #...
        access-control: 0.0.0.0/0 refuse
        access-control: 127.0.0.0/8 allow
        access-control: 192.168.121.0/24 allow
# ...

Thay interface từ 127.0.0.1 thành 0.0.0.0 để bên ngoài có thể truy cập (bên ngoài thực ra cũng chỉ là máy host, muốn các thiết bị trong LAN - các thiết bị dùng cùng mạng truy cập được, cần config network bridge cho máy ảo này )

Restart rồi truy cập từ máy host:
bash-5.0# rcctl restart unbound
unbound(ok)
unbound(ok)
Từ máy host
$ nslookup pymi.vn 192.168.121.82
Server:        192.168.121.82
Address:    192.168.121.82#53

Non-authoritative answer:
Name:    pymi.vn
Address: 104.27.128.55
Name:    pymi.vn
Address: 104.27.129.55
Name:    pymi.vn
Address: 2606:4700:3034::681b:8137
Name:    pymi.vn
Address: 2606:4700:3036::681b:8037

Giờ có thể đổi DNS của máy host tới địa chỉ này như từng đổi thành 8.8.8.8 , rồi enjoy.

Chú ý: sẽ cần bật máy ảo mỗi khi bật máy, điều này có thể config trên backend của Vagrant (Tức Virtualbox hay KVM hay VMWare). HOẶC cài trực tiếp Unbound lên máy của bạn thay vì máy ảo, rồi set DNS server tới 127.0.0.1.

Chú ý: Unbound có sẵn tính năng caching, tức lần đầu truy cập thì chậm, nhưng từ lần 2 trở đi sẽ là ngay lập tức (chú ý query time của lần 2).

 $ dig familug.org @192.168.121.82

; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> familug.org @192.168.121.82
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5067
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;familug.org.            IN    A

;; ANSWER SECTION:
familug.org.        300    IN    A    216.239.32.21

;; Query time: 251 msec
;; SERVER: 192.168.121.82#53(192.168.121.82)
;; WHEN: Mon Feb 03 23:39:20 +07 2020
;; MSG SIZE  rcvd: 56

 $ dig familug.org @192.168.121.82

; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> familug.org @192.168.121.82
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54850
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;familug.org.            IN    A

;; ANSWER SECTION:
familug.org.        298    IN    A    216.239.32.21

;; Query time: 0 msec
;; SERVER: 192.168.121.82#53(192.168.121.82)
;; WHEN: Mon Feb 03 23:39:22 +07 2020
;; MSG SIZE  rcvd: 56

Hết.
Bài viết thực hiện trên:
 $ lsb_release -d; dpkg -l vagrant | grep vagrant
Description:    Ubuntu 18.04.4 LTS
ii  vagrant        2.0.2+dfsg-2ubuntu8 all          Tool for building and distributing virtualized development environments


HVN at https://pymi.vn and https://www.familug.org

No comments:

Post a Comment