Cấu hình VLAN trên Linux: Tách biệt mạng, tăng bảo mật và quản lý dễ dàng

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

Giới thiệu vấn đề: Tại sao chúng ta cần VLAN?

Trong công việc quản lý hệ thống, đặc biệt là mạng, mình thường xuyên đối mặt với bài toán làm sao để mạng của công ty vừa an toàn, vừa hiệu quả, mà lại không tốn quá nhiều chi phí mua sắm thiết bị mới. Mình quản lý network cho một văn phòng 50 người và một datacenter nhỏ, nên mình hiểu rõ những thách thức này.

Khi một mạng phát triển lớn hơn, từ 5-10 máy lên đến 50 máy hoặc hơn, nhiều vấn đề bắt đầu nảy sinh. Thứ nhất là về bảo mật: Làm sao để máy tính của phòng kế toán không thể truy cập thẳng vào máy chủ phát triển, hay các thiết bị IoT không gây ảnh hưởng đến hệ thống chính?

Thứ hai là về hiệu suất: Khi một máy tính gửi tin broadcast (ví dụ: tìm máy in hay xin IP từ DHCP server), mọi thiết bị khác trong cùng mạng LAN đều phải xử lý. Tình trạng này vừa lãng phí tài nguyên, vừa làm mạng chậm đi đáng kể.

Ngày xưa, để giải quyết, mình có thể phải mua thêm switch, kéo thêm dây, tách biệt các phòng ban thành các mạng vật lý riêng biệt. Nhưng cách này tốn kém, phức tạp, và không hề linh hoạt. Nếu phòng ban thay đổi chỗ, hoặc muốn thêm một máy tính vào mạng khác, lại phải kéo lại dây. Đó là lý do mình tìm đến VLAN.

Khái niệm cốt lõi: VLAN là gì và hoạt động ra sao?

VLAN là gì?

VLAN (Virtual Local Area Network) hiểu đơn giản là một cách để tạo ra nhiều mạng LAN ảo trên cùng một hạ tầng mạng vật lý. Hãy tưởng tượng một switch vật lý duy nhất được chia thành nhiều switch ảo độc lập nhờ VLAN. Các thiết bị thuộc cùng một VLAN có thể giao tiếp như thể chúng đang trong cùng một mạng vật lý, ngay cả khi chúng cắm vào các cổng khác nhau trên cùng một switch, hoặc thậm chí là trên nhiều switch vật lý khác nhau.

Tại sao chúng ta cần dùng VLAN?

  • Tăng cường bảo mật: Lợi ích lớn nhất là đây. VLAN giúp tách biệt các phòng ban (ví dụ: Kế toán, Marketing, IT) hay thiết bị (máy chủ, máy tính, camera an ninh) vào các mạng riêng. Điều này ngăn chặn truy cập trái phép, giảm rủi ro khi mạng bị tấn công.
  • Cải thiện hiệu suất mạng: VLAN giảm kích thước các broadcast domain. Khi một máy tính gửi tin broadcast, nó chỉ đến các thành viên trong cùng VLAN, thay vì toàn bộ mạng vật lý. Điều này cắt giảm lưu lượng không cần thiết, giúp mạng nhanh hơn.
  • Quản lý dễ dàng và linh hoạt: Nhân viên di chuyển hay phòng ban thay đổi? Bạn chỉ cần cấu hình lại mạng bằng phần mềm (trên switch hoặc server Linux), không cần kéo lại dây cáp vật lý. Điều này cực kỳ tiện lợi cho việc quản lý hạ tầng mạng luôn biến động.
  • Tiết kiệm chi phí: Thay vì phải mua nhiều switch cho từng mạng vật lý, mình chỉ cần một vài switch hỗ trợ VLAN là đủ.

Cơ chế hoạt động của VLAN: 802.1Q Tagging

Để các switch hay server Linux nhận diện gói tin thuộc VLAN nào, người ta sử dụng một cơ chế gọi là VLAN Tagging, theo chuẩn IEEE 802.1Q. Khi một gói tin Ethernet đi qua một cổng mạng cấu hình cho VLAN, một “thẻ” (tag) sẽ được thêm vào tiêu đề của gói tin đó. Tag này chứa thông tin về ID của VLAN (VLAN ID), là một số từ 1 đến 4094.

  • Cổng Access (Access Port): Thường kết nối với thiết bị cuối (như máy tính người dùng). Gói tin đi vào hoặc ra từ cổng này sẽ không có tag VLAN. Switch tự động gán VLAN ID cho gói tin vào và loại bỏ tag khi ra, dựa trên cấu hình cổng.
  • Cổng Trunk (Trunk Port): Thường dùng để kết nối giữa các switch, hoặc giữa switch và máy chủ (như server Linux). Các gói tin đi qua cổng Trunk sẽ mang theo tag VLAN, cho phép nhiều VLAN cùng đi qua một đường truyền vật lý duy nhất.

Trong ngữ cảnh Linux server, khi cấu hình VLAN, chúng ta thực chất đang giúp card mạng của server hiểu và xử lý các gói tin có tag 802.1Q. Điều này biến card mạng thành một dạng “cổng Trunk” phần mềm.

Thực hành chi tiết: Cấu hình VLAN trên Linux

Giờ là phần quan trọng nhất: làm sao để áp dụng những điều này vào thực tế trên một server Linux. Những kinh nghiệm này đều từ thực tế mình triển khai ở một datacenter nhỏ. Tại đó, mình dùng Linux server làm gateway, firewall hoặc máy chủ ảo hóa cần tham gia nhiều mạng ảo khác nhau.

1. Kiểm tra hỗ trợ Kernel và cài đặt công cụ

Hầu hết các bản phân phối Linux hiện đại đều đã có sẵn module kernel cho VLAN. Chúng ta có thể kiểm tra bằng lệnh:

lsmod | grep 8021q

Nếu thấy output, nghĩa là module đã được load. Nếu không, có thể load thủ công:

sudo modprobe 8021q

Các công cụ cần thiết thường là iproute2 (cung cấp lệnh ip) và đôi khi là vlan (cung cấp lệnh vconfig, nhưng ip là cách hiện đại hơn và được khuyến khích sử dụng).

# Trên Debian/Ubuntu
sudo apt update
sudo apt install iproute2 vlan

# Trên CentOS/RHEL
sudo yum install iproute vlan

2. Các lệnh cơ bản để quản lý VLAN tạm thời (runtime)

Chúng ta sẽ sử dụng lệnh ip để tạo và quản lý các giao diện VLAN.

Xem thông tin card mạng hiện có

Giả sử card mạng vật lý của mình là eth0 hoặc enpXsX. Dùng lệnh sau để kiểm tra:

ip a

Ví dụ, mình sẽ dùng enp0s3 làm card mạng vật lý cho các bước tiếp theo.

Tạo một giao diện VLAN mới

Mình muốn tạo một giao diện VLAN với ID 10 trên card enp0s3. Mình sẽ đặt tên cho nó là enp0s3.10 theo quy ước phổ biến:

sudo ip link add link enp0s3 name enp0s3.10 type vlan id 10
  • link enp0s3: Chỉ định giao diện vật lý mà VLAN này sẽ hoạt động trên đó.
  • name enp0s3.10: Tên của giao diện VLAN mới.
  • type vlan id 10: Khai báo đây là một giao diện VLAN với ID là 10.

Gán địa chỉ IP cho giao diện VLAN

sudo ip addr add 192.168.10.100/24 dev enp0s3.10

Ở đây mình gán IP 192.168.10.100 với subnet mask /24 cho giao diện enp0s3.10.

Kích hoạt giao diện VLAN

sudo ip link set dev enp0s3.10 up

Kiểm tra lại cấu hình

Sau khi cấu hình, mình có thể kiểm tra xem giao diện VLAN đã được tạo và có IP chưa:

ip a show enp0s3.10

Hoặc xem chi tiết hơn với cờ -d để thấy thông tin VLAN:

ip -d link show enp0s3.10

Xóa một giao diện VLAN

Nếu muốn xóa một giao diện VLAN tạm thời (chỉ có tác dụng cho đến khi reboot), hãy dùng lệnh:

sudo ip link delete enp0s3.10

3. Cấu hình VLAN tồn tại sau khi reboot (Persistence Configuration)

Các lệnh ip ở trên chỉ có tác dụng trong phiên làm việc hiện tại. Khi khởi động lại server, cấu hình sẽ mất. Để cấu hình tồn tại vĩnh viễn, chúng ta cần chỉnh sửa file cấu hình mạng của hệ điều hành.

Mỗi bản phân phối Linux có thể có cách cấu hình khác nhau. Mình sẽ trình bày hai cách phổ biến nhất.

Cách 1: Cấu hình với Netplan (trên Ubuntu Server 18.04+ và Debian 10+)

Netplan sử dụng các file YAML để cấu hình mạng, là cách mình hay dùng trên các server Ubuntu.

Tạo hoặc chỉnh sửa file cấu hình trong thư mục /etc/netplan/. Ví dụ: /etc/netplan/01-netcfg.yaml.

network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: no
      dhcp6: no
  vlans:
    enp0s3.10:
      id: 10
      link: enp0s3
      addresses: [192.168.10.100/24]
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]
      routes:
        - to: default
          via: 192.168.10.1
    enp0s3.20:
      id: 20
      link: enp0s3
      addresses: [192.168.20.100/24]
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]
      routes:
        - to: default
          via: 192.168.20.1

Giải thích:

  • ethernets: enp0s3:: Khai báo card vật lý. Mình tắt DHCP trên card vật lý vì nó sẽ chỉ dùng làm “đường truyền” cho các VLAN.
  • vlans:: Phần định nghĩa các giao diện VLAN.
  • enp0s3.10:: Tên giao diện VLAN.
  • id: 10: VLAN ID.
  • link: enp0s3: Chỉ định giao diện vật lý cha.
  • addresses: [192.168.10.100/24]: Địa chỉ IP và subnet mask.
  • routes:nameservers:: Cấu hình gateway và DNS server cho VLAN này.

Sau khi chỉnh sửa file, áp dụng cấu hình:

sudo netplan try # Nên dùng lệnh này để kiểm tra cấu hình trước khi áp dụng vĩnh viễn
sudo netplan apply

Cách 2: Cấu hình với NetworkManager và ifcfg files (trên CentOS/RHEL)

Trên các hệ thống CentOS/RHEL, mình thường dùng NetworkManager cùng với các file ifcfg- trong thư mục /etc/sysconfig/network-scripts/.

Đầu tiên, đảm bảo NetworkManager đang chạy và card mạng vật lý được cấu hình để không nhận IP trực tiếp.

Tạo file cấu hình cho card mạng vật lý ifcfg-enp0s3:

sudo vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE="Ethernet"
BOOTPROTO="none"
NAME="enp0s3"
DEVICE="enp0s3"
ONBOOT="yes"

Tạo file cấu hình cho giao diện VLAN 10 (ifcfg-enp0s3.10):

sudo vi /etc/sysconfig/network-scripts/ifcfg-enp0s3.10
VLAN="yes"
TYPE="Vlan"
DEVICE="enp0s3.10"
PHYSDEV="enp0s3"
VID="10"
BOOTPROTO="static"
IPADDR="192.168.10.100"
NETMASK="255.255.255.0"
GATEWAY="192.168.10.1"
ONBOOT="yes"

Tạo file cấu hình cho giao diện VLAN 20 (ifcfg-enp0s3.20):

sudo vi /etc/sysconfig/network-scripts/ifcfg-enp0s3.20
VLAN="yes"
TYPE="Vlan"
DEVICE="enp0s3.20"
PHYSDEV="enp0s3"
VID="20"
BOOTPROTO="static"
IPADDR="192.168.20.100"
NETMASK="255.255.255.0"
GATEWAY="192.168.20.1"
ONBOOT="yes"

Sau khi tạo hoặc chỉnh sửa, khởi động lại NetworkManager:

sudo systemctl restart NetworkManager

Hoặc khởi động lại dịch vụ network cũ hơn nếu không dùng NetworkManager:

sudo systemctl restart network

4. Ví dụ thực tế: Server Linux tham gia nhiều VLAN

Hãy tưởng tượng mình có một server cần đóng vai trò là một máy chủ ảo hóa, và các máy ảo trên đó cần truy cập vào hai mạng khác nhau: một mạng cho Web Servers (VLAN 10) và một mạng cho Database Servers (VLAN 20). Server vật lý chỉ có một card mạng enp0s3.

Để thực hiện, mình sẽ cấu hình như sau (sử dụng Netplan làm ví dụ):

  1. Đảm bảo switch đã được cấu hình để cổng mà server Linux cắm vào là một cổng Trunk, cho phép VLAN 10 và VLAN 20 đi qua.
  2. Tạo file cấu hình Netplan như đã trình bày ở trên, với hai giao diện VLAN enp0s3.10enp0s3.20.
network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: no
      dhcp6: no
  vlans:
    enp0s3.10:
      id: 10
      link: enp0s3
      addresses: [192.168.10.100/24]
      nameservers:
        addresses: [8.8.8.8]
      routes:
        - to: default
          via: 192.168.10.1
    enp0s3.20:
      id: 20
      link: enp0s3
      addresses: [192.168.20.100/24]
      nameservers:
        addresses: [8.8.8.8]
      routes:
        - to: default
          via: 192.168.20.1

Sau khi sudo netplan apply, server của mình sẽ có hai giao diện mạng ảo, mỗi cái thuộc một VLAN riêng biệt, với địa chỉ IP và gateway riêng:

ip a show enp0s3.10
# Output tương tự:
# 4: enp0s3.10@enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
#     link/ether 08:00:27:1c:1d:9e brd ff:ff:ff:ff:ff:ff
#     inet 192.168.10.100/24 brd 192.168.10.255 scope global enp0s3.10
#        valid_lft forever preferred_lft forever

ip a show enp0s3.20
# Output tương tự:
# 5: enp0s3.20@enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
#     link/ether 08:00:27:1c:1d:9e brd ff:ff:ff:ff:ff:ff
#     inet 192.168.20.100/24 brd 192.168.20.255 scope global enp0s3.20
#        valid_lft forever preferred_lft forever

Với cấu hình này, server Linux giờ đây có thể giao tiếp với cả hai VLAN 10 và VLAN 20 một cách độc lập, chỉ trên một cổng mạng vật lý duy nhất. Điều này cực kỳ hữu ích khi triển khai ảo hóa hoặc các dịch vụ cần cô lập mạng, đảm bảo hiệu quả và an toàn.

Kết luận

VLAN là một kỹ thuật mạnh mẽ và cần thiết trong việc thiết kế, quản lý mạng hiện đại. Từ kinh nghiệm của mình, dù là mạng cho một văn phòng nhỏ hay một datacenter, việc áp dụng VLAN đều mang lại những lợi ích rõ rệt về bảo mật, hiệu suất và khả năng mở rộng.

Trên Linux, việc cấu hình VLAN khá đơn giản với các công cụ như ip và các phương thức cấu hình persistence như Netplan hay NetworkManager. Nắm vững cách cấu hình VLAN sẽ giúp bạn xây dựng một hạ tầng mạng vững chắc và dễ quản lý hơn rất nhiều.

Hãy thử nghiệm cấu hình VLAN trên máy ảo hoặc môi trường thử nghiệm của bạn để làm quen và áp dụng vào các dự án thực tế nhé. Chúc bạn thành công!

Share: