Làm chủ Network Namespaces: Tự xây ‘phòng Lab’ mạng cô lập trên Linux

Network tutorial - IT technology blog
Network tutorial - IT technology blog

Tại sao bạn nên dùng Network Namespaces thay vì máy ảo?

Bạn đã bao giờ rơi vào cảnh muốn chạy hai dịch vụ cùng chiếm dụng port 80 trên một server duy nhất chưa? Thông thường, bạn sẽ nghĩ đến Docker hoặc tạo một máy ảo (VM) nặng nề tiêu tốn ít nhất 512MB RAM chỉ để chạy một script nhỏ. Network Namespaces (netns) chính là giải pháp thay thế cực nhẹ, tiêu tốn tài nguyên gần như bằng không.

Công nghệ này cho phép bạn chia hệ điều hành Linux thành nhiều không gian mạng riêng biệt. Mỗi không gian sở hữu bảng định tuyến (routing table), danh sách interface và quy tắc firewall (iptables) riêng. Chúng hoạt động hoàn toàn độc lập, giống như bạn đang sở hữu nhiều máy tính vật lý trong một thùng máy duy nhất.

Thực tế, Docker cũng đang dựa trên chính netns để cô lập mạng cho các container. Hiểu rõ cách cấu hình thủ công sẽ giúp bạn xử lý các sự cố mạng phức tạp mà không cần phụ thuộc vào các công cụ tự động.

Ba thành phần cốt lõi bạn cần biết

Đừng vội gõ lệnh khi chưa nắm rõ sơ đồ. Hãy hình dung hệ thống mạng ảo này gồm:

  • Network Namespace: Một cái “lồng” cách ly tuyệt đối. Mọi thứ bên trong không thể nhìn thấy tài nguyên mạng bên ngoài trừ khi bạn cho phép.
  • Veth Pair (Virtual Ethernet): Một sợi dây cáp mạng ảo có hai đầu. Nếu cắm một đầu vào Namespace A và đầu kia vào máy thật (Host), dữ liệu sẽ được thông suốt giữa hai môi trường.
  • Bridge: Đóng vai trò như một chiếc Switch ảo. Nó giúp bạn kết nối 3, 5 hoặc hàng chục Namespace lại với nhau dễ dàng hơn.

Thực hành: Xây dựng môi trường mạng từ con số 0

Chúng ta sẽ tạo một Namespace, nối nó với máy thật và cấp quyền truy cập Internet. Đây là kịch bản chuẩn để bạn test các ứng dụng web hoặc proxy an toàn.

Bước 1: Khởi tạo Namespace

Mình sẽ tạo một không gian tên là lab_network. Mọi lệnh quản lý đều bắt đầu bằng tiền tố ip netns.

# Tạo namespace mới
sudo ip netns add lab_network

# Kiểm tra danh sách
ip netns list

Lúc này, lab_network giống như một chiếc máy tính vừa đập hộp. Nó chưa có card mạng và cũng chưa có cấu hình IP nào.

Bước 2: Kết nối bằng Veth Pair

Chúng ta cần một sợi dây cáp ảo để nối thông hai thế giới.

# Tạo cặp veth: đầu v-host và đầu v-ns
sudo ip link add v-host type veth peer name v-ns

# Đưa đầu v-ns vào trong namespace lab_network
sudo ip link set v-ns netns lab_network

Sau lệnh này, đầu v-ns sẽ biến mất khỏi máy thật và xuất hiện bên trong namespace.

Bước 3: Cấu hình IP và kích hoạt kết nối

Mặc định, các interface mới sẽ ở trạng thái DOWN (tắt). Bạn cần gán IP và bật chúng lên.

# Cấu hình phía máy thật (Host)
sudo ip addr add 10.1.1.1/24 dev v-host
sudo ip link set v-host up

# Cấu hình phía trong Namespace
sudo ip netns exec lab_network ip addr add 10.1.1.2/24 dev v-ns
sudo ip netns exec lab_network ip link set v-ns up

# Bật interface loopback (rất quan trọng để ứng dụng nội bộ giao tiếp)
sudo ip netns exec lab_network ip link set lo up

Hãy thử ping 10.1.1.2 từ máy thật. Nếu nhận được phản hồi với độ trễ thường dưới 0.05ms, bạn đã thành công.

Bước 4: Cấp quyền truy cập Internet (NAT)

Namespace của bạn hiện đã thấy máy thật nhưng chưa thể ra ngoài Internet. Bạn cần biến máy thật thành một router trung gian.

# Kích hoạt chuyển tiếp gói tin (IP Forwarding)
sudo sysctl -w net.ipv4.ip_forward=1

# Cấu hình NAT qua iptables (thay eth0 bằng card mạng thật của bạn)
sudo iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -o eth0 -j MASQUERADE

# Thêm default gateway cho Namespace
sudo ip netns exec lab_network ip route add default via 10.1.1.1

Kiểm tra bằng lệnh: sudo ip netns exec lab_network ping 8.8.8.8.

Kinh nghiệm thực tế để tránh “ăn hành”

Sau nhiều lần debug hệ thống, mình rút ra 3 lưu ý xương máu:

  1. Lỗi DNS: Nếu ping được IP 8.8.8.8 nhưng không thể curl google.com, đó là do Namespace chưa có DNS. Hãy tạo file /etc/netns/lab_network/resolv.conf và thêm nameserver 8.8.8.8 vào đó.
  2. Tự động dọn dẹp: Khi bạn xóa Namespace (sudo ip netns del), Linux sẽ tự động thu hồi các interface veth liên quan. Bạn không cần lo lắng về việc rác hệ thống.
  3. Giám sát gói tin: Nếu mạng không thông, hãy dùng tcpdump -i v-host trên máy thật. Bạn sẽ thấy ngay gói tin bị chặn ở đâu: do firewall hay do sai định tuyến.

Lời kết

Sử dụng Network Namespaces giống như việc chơi Lego với các sợi dây cáp và switch ảo. Nó không chỉ là công cụ để cô lập ứng dụng, mà còn là cách tốt nhất để học về Networking một cách trực quan. Tại văn phòng mình, mỗi khi cần test một rule firewall mới, mình luôn dựng mô hình netns trước để đảm bảo không làm rớt mạng của cả công ty. Hãy bắt đầu với những lệnh cơ bản, bạn sẽ thấy việc quản trị Linux thú vị hơn rất nhiều.

Share: