VLAN Configuration บน Linux

VLAN (Virtual Local Area Network) แบ่ง Network ทางกายภาพเดียวออกเป็นหลาย Network ทางตรรกะที่แยกจากกัน ทำให้ Traffic ระหว่าง VLAN ไม่สามารถผ่านกันได้โดยตรงโดยไม่ผ่าน Router หรือ Layer 3 Switch ใช้สำหรับแบ่ง Production, Staging, และ Management Network บน Server เดียวกัน หรือแบ่ง Network สำหรับแต่ละ Tenant บน Bare Metal Server

บทความนี้อธิบายการตั้งค่า VLAN บน Linux ตั้งแต่การติดตั้ง 802.1Q Module, การสร้าง VLAN Interface ด้วย ip command, การตั้งค่าถาวรผ่าน Netplan (Ubuntu) และ nmcli (RHEL/Rocky), รวมถึงการใช้ VLAN บน Bridge สำหรับ Virtualization

IEEE 802.1Q — มาตรฐาน VLAN บน Linux

# VLAN บน Linux ใช้ IEEE 802.1Q Tagging
# Kernel Module: 8021q

# ตรวจสอบว่า Module โหลดอยู่หรือไม่
lsmod | grep 8021q

# โหลด Module
sudo modprobe 8021q

# ให้ Module โหลดอัตโนมัติเมื่อ Boot
echo "8021q" | sudo tee /etc/modules-load.d/8021q.conf

# ตรวจสอบ Interface ที่มีอยู่
ip link show

สร้าง VLAN Interface ด้วย ip command

การสร้าง VLAN Interface แบบ Manual ด้วย ip command เป็นวิธีที่เร็วที่สุดสำหรับทดสอบ แต่ไม่คงอยู่หลัง Reboot

# สร้าง VLAN Interface (VLAN 100 บน eth0)
# รูปแบบชื่อ: <interface>.<vlan-id> หรือ vlan<id>
sudo ip link add link eth0 name eth0.100 type vlan id 100

# เปิดใช้งาน Interface
sudo ip link set eth0.100 up

# กำหนด IP Address
sudo ip addr add 10.0.100.10/24 dev eth0.100

# สร้าง VLAN หลายตัว
sudo ip link add link eth0 name eth0.200 type vlan id 200
sudo ip link set eth0.200 up
sudo ip addr add 10.0.200.10/24 dev eth0.200

sudo ip link add link eth0 name eth0.300 type vlan id 300
sudo ip link set eth0.300 up
sudo ip addr add 10.0.300.10/24 dev eth0.300

# ตรวจสอบ VLAN Interface ที่สร้างขึ้น
ip link show type vlan
ip addr show eth0.100
# ดูข้อมูล VLAN จาก /proc
cat /proc/net/vlan/config

# ตัวอย่าง Output:
# VLAN Dev name    | VLAN ID
# Name-Type: VLAN_NAME_TYPE_PLUS_VID_NO_PAD
# eth0.100       | 100  | eth0
# eth0.200       | 200  | eth0
# eth0.300       | 300  | eth0

# ดูรายละเอียด VLAN เฉพาะตัว
cat /proc/net/vlan/eth0.100

# ลบ VLAN Interface
sudo ip link delete eth0.100

ตั้งค่า VLAN ถาวรบน Ubuntu ด้วย Netplan

# /etc/netplan/01-vlan.yaml
# VLAN บน eth0 หลายตัวพร้อมกัน
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: false
      # eth0 เป็น Trunk Port — ไม่มี IP ของตัวเอง
  vlans:
    eth0.100:
      id: 100
      link: eth0
      addresses:
        - 10.0.100.10/24
      nameservers:
        addresses: [8.8.8.8]
    eth0.200:
      id: 200
      link: eth0
      addresses:
        - 10.0.200.10/24
    eth0.300:
      id: 300
      link: eth0
      addresses:
        - 10.0.300.10/24
      routes:
        - to: default
          via: 10.0.300.1
# ตรวจสอบ Config
sudo netplan try

# Apply Config
sudo netplan apply

# ตรวจสอบผลลัพธ์
ip link show type vlan
ip addr show eth0.100
ip route show

ตั้งค่า VLAN ถาวรบน RHEL/Rocky ด้วย nmcli

# สร้าง VLAN 100 บน eth0
sudo nmcli connection add type vlan \
  con-name vlan100 \
  ifname eth0.100 \
  dev eth0 \
  id 100 \
  ipv4.addresses "10.0.100.10/24" \
  ipv4.method manual

# สร้าง VLAN 200 บน eth0
sudo nmcli connection add type vlan \
  con-name vlan200 \
  ifname eth0.200 \
  dev eth0 \
  id 200 \
  ipv4.addresses "10.0.200.10/24" \
  ipv4.method manual

# เปิดใช้งาน
sudo nmcli connection up vlan100
sudo nmcli connection up vlan200

# ตรวจสอบ
nmcli connection show
ip addr show eth0.100
# ดู VLAN Config ที่สร้างโดย nmcli
cat /etc/NetworkManager/system-connections/vlan100.nmconnection

# แก้ไข VLAN (เช่น เปลี่ยน IP)
sudo nmcli connection modify vlan100 \
  ipv4.addresses "10.0.100.20/24"

sudo nmcli connection up vlan100

# ลบ VLAN Connection
sudo nmcli connection delete vlan100

VLAN บน Bond Interface

การรวม VLAN กับ Network Bonding เป็นรูปแบบที่ใช้บน Production Server เพื่อให้ทั้ง Failover และการแบ่ง Network ในเวลาเดียวกัน

# Netplan: Bond + VLAN
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: false
    eth1:
      dhcp4: false
  bonds:
    bond0:
      interfaces: [eth0, eth1]
      parameters:
        mode: active-backup
        mii-monitor-interval: 100
  vlans:
    bond0.100:
      id: 100
      link: bond0
      addresses:
        - 10.0.100.10/24
    bond0.200:
      id: 200
      link: bond0
      addresses:
        - 10.0.200.10/24
      routes:
        - to: default
          via: 10.0.200.1
# nmcli: Bond + VLAN (RHEL/Rocky)
# 1. สร้าง Bond ก่อน (ดูบทความ Network Bonding)

# 2. สร้าง VLAN บน Bond
sudo nmcli connection add type vlan \
  con-name bond0-vlan100 \
  ifname bond0.100 \
  dev bond0 \
  id 100 \
  ipv4.addresses "10.0.100.10/24" \
  ipv4.method manual

sudo nmcli connection up bond0-vlan100

VLAN บน Linux Bridge (สำหรับ VM/Container)

เมื่อใช้ KVM, LXC หรือ Docker ที่ต้องการให้ VM/Container เข้าถึง VLAN ต่าง ๆ ต้องสร้าง Bridge บน VLAN Interface และให้ VM เชื่อมต่อผ่าน Bridge นั้น

# สร้าง Bridge บน VLAN Interface (Netplan)
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: false
  vlans:
    eth0.100:
      id: 100
      link: eth0
  bridges:
    br-vlan100:
      interfaces: [eth0.100]
      addresses:
        - 10.0.100.1/24
      parameters:
        stp: false
        forward-delay: 0
# สร้าง VLAN-aware Bridge (Linux Bridge รุ่นใหม่)
# Bridge เดียวรองรับหลาย VLAN โดยใช้ vlan_filtering=1

sudo ip link add name br0 type bridge
sudo ip link set br0 up
sudo bridge vlan add vid 100 dev br0 self
sudo bridge vlan add vid 200 dev br0 self

# เพิ่ม Port เข้า Bridge และกำหนด VLAN
sudo ip link set eth0 master br0
sudo bridge vlan add vid 100 dev eth0
sudo bridge vlan add vid 200 dev eth0

# ดู VLAN บน Bridge
bridge vlan show

ทดสอบ VLAN Isolation

# ทดสอบว่า VLAN แยกกันจริงหรือไม่
# เพิ่ม Route ไป VLAN อื่นเพื่อทดสอบ
ping -I eth0.100 10.0.200.1    # ควรไม่ได้รับการตอบกลับ (ถ้าไม่มี Router)

# ทดสอบ Connectivity ใน VLAN เดียวกัน
ping -I eth0.100 10.0.100.1    # ควรตอบกลับ

# ดู ARP Table ของแต่ละ VLAN Interface
arp -i eth0.100
arp -i eth0.200

# ดู Route Table
ip route show table main
ip route show dev eth0.100

Script สร้าง VLAN อัตโนมัติ

#!/bin/bash
# /usr/local/bin/create-vlan.sh
# สร้าง VLAN Interface และตั้งค่า IP

PARENT="${1}"       # เช่น eth0
VLAN_ID="${2}"      # เช่น 100
IP_CIDR="${3}"      # เช่น 10.0.100.10/24

if [ -z "$PARENT" ] || [ -z "$VLAN_ID" ] || [ -z "$IP_CIDR" ]; then
    echo "Usage: $0 <interface> <vlan-id> <ip/cidr>"
    echo "Example: $0 eth0 100 10.0.100.10/24"
    exit 1
fi

VLAN_IF="${PARENT}.${VLAN_ID}"

# ตรวจสอบว่า 8021q module โหลดอยู่
modprobe 8021q

# สร้าง VLAN Interface
ip link add link "$PARENT" name "$VLAN_IF" type vlan id "$VLAN_ID"
ip link set "$VLAN_IF" up
ip addr add "$IP_CIDR" dev "$VLAN_IF"

echo "✅ สร้าง VLAN Interface ${VLAN_IF} สำเร็จ"
echo "   IP: ${IP_CIDR}"
ip addr show "$VLAN_IF"

สรุป

VLAN บน Linux ใช้ Kernel Module 8021q ในการสร้าง Virtual Interface ที่ Tag Traffic ด้วย VLAN ID ตาม IEEE 802.1Q การสร้างแบบชั่วคราวใช้ ip link add link eth0 name eth0.100 type vlan id 100 ส่วนการตั้งค่าถาวรบน Ubuntu ใช้ Netplan และบน RHEL/Rocky ใช้ nmcli VLAN สามารถสร้างบน Bond Interface เพื่อรวม Failover กับ Network Segmentation และยังใช้ร่วมกับ Bridge สำหรับ VM/Container ที่ต้องการเข้าถึงหลาย VLAN ได้ด้วย

แนะนำบริการ DE

การตั้งค่า VLAN บน Server ต้องการสิทธิ์ Root และการเข้าถึง Network Interface โดยตรง Cloud VPS ของ DE ให้ Root Access เต็มรูปแบบ สามารถตั้งค่า VLAN และ Network Segmentation สำหรับแบ่ง Environment หรือ Tenant บน Server เดียวกันได้อย่างอิสระ

สำหรับผู้ที่ต้องการโฮสต์เว็บไซต์โดยไม่ต้องจัดการ Network Configuration เอง Cloud Hosting ของ DE มี Network Infrastructure ที่พร้อมใช้งานและเสถียร โดยไม่ต้องตั้งค่า VLAN หรือ Network Interface เพิ่มเติม