Friday, August 2, 2013

Fix cứng DNS resolver trên Linux

Hầu hết các  hệ thống GNU/Linux đều được tích hợp và sử dụng DHCP Client. DHCP Client cung cấp phương thức cho việc cấu hình một hay nhiều card mạng sử dụng địa chỉ động (DHCP). Tuy nhiên nó lại làm thay đổi tệp tin /etc/resolv.conf mỗi khi khởi động DHCP Client hay kết nối vào một mạng khác. Trong một số trường hợp như DNS server cục bộ trong mạng LAN của bạn không thể phân giải một địa chỉ trên Internet, bạn cần nhờ một nameserver khác phân giải địa chỉ này (chẳng hạn một public DNS server). Do vậy bạn cần giữ cho tệp tin /etc/resolv.conf không thay đổi mỗi khi kết nối mạng. Trong bài viết này Wikilinux xin giới thiệu một số cách để giúp việc giữ cố định nội dung tệp tin /etc/resolv.conf theo ý của bạn.

Giả sử bạn có tập tin /etc/resolv.conf với nội dung:
nameserver 8.8.8.8
nameserver 8.8.4.4
và mục đích là bạn muốn giữ cố định nội dung này.

Cách 1: Gán thuộc tính Read-Only cho /etc/resolv.conf
Ngoài các quyền đọc, ghi, thực thi bình thường; hệ thống Linux còn cung cấp một số thuộc tính đặc biệt cho các tệp tin như read-only… Như vậy khi gán thuộc tính read-only cho tệp tin thì tệp tin đó sẽ không bị thay đổi bởi các chương trình khác nếu chưa xóa bỏ thuộc tính này đi. Để gán thuộc tính read-only ta làm như sau:
sudo chattr +i /etc/resolv.conf
Lưu ý: Đối với Ubuntu tệp tin /etc/resolv.conf là liên kết mềm tới /run/resolvconf/resolv.conf, vì vậy trước khi thực hiện lệnh trên thì bạn cần bỏ liên kết mềm và tạo lại file /etc/resolv.conf trước:
sudo cp /run/resolvconf/resolv.conf /etc/resolv.conf.orig
sudo unlink /etc/resolv.conf
sudo cp /etc/resolv.conf.orig /etc/resolv.conf
sudo chattr +i /etc/resolv.conf
Kết quả: Sau khi gán thuộc tính này, chúng ta yên tâm là nội dung của file /etc/resolv.conf sẽ không bao giờ thay đổi.
Cách 2: Sử dụng đoạn mã bẫy sự kiện trong DHCP.
DHCP không cung cấp cách thức để chỉnh sửa các cấu hình ban đầu, tuy nhiên nếu việc sửa đổi là bắt buộc cần thiết thì chúng ta có thể sử dụng các bẫy sự kiện để ghi đè lên các cấu hình ban đầu. Ban đầu dhcpclient sẽ sử dụng hàm make_resolv_conf() để tạo tệp /etc/resolv.conf mặc định. Nếu muốn thay đổi chúng ta có thể định nghĩa lại hàm này như sau:
# vim /etc/dhcp/dhclient-enter-hooks.d/nodnsupdate
Rồi thêm vào nội dung sau:
#!/bin/sh
make_resolv_conf(){
 echo "nameserver 8.8.8.8" > /etc/resolv.conf
 echo "nameserver 8.8.4.4" >> /etc/resolv.conf
}
Sau đó cấp quyền thực thi cho đoạn mã đó.
 # chmod +x /etc/dhcp/dhclient-enter-hooks.d/nodnsupdate
Cách 3. Sử dụng tệp tin cấu hình dhclient.conf
Tệp tin /etc/dhclient.conf hoặc /etc/dhcp/dhclient.conf chứa các thông tin cấu hình cho client. Bạn có thể bật tắt các thay đổi DNS và các lựa chọn khác cho một card mạng hoặc tất cả các card mạng thông qua tệp tin này.
Để thêm lựa chọn bạn có thể add nội dung như sau:
option domain-name-servers 8.8.8.8, 8.8.4.4
Các chọn lựa khác bạn có thể xem trong man của DHCLIENT.CONF
Cách 4. Cấu hình trong /etc/network/interfaces
Bạn có thể cấu hình DNS namerserver cho một card mạng cố định thông qua việc chỉnh sửa trong /etc/network/interfaces bằng cách thêm trường DNS như sau (trên Debian/Ubuntu):
auto eth0
iface eth0 inet static
     address 192.168.1.10
     network 192.168.1.0
     netmask 255.255.255.0
     broadcast 192.168.1.255
     gateway 192.168.1.254
     dns-nameservers 8.8.8.8 8.8.4.4
Hi vọng bạn có thể sử dụng bài viết này để áp dụng được vào trường hợp cụ thể của mình.
Chúc các bạn thành công.
Wikilinux.vn