Mô Phỏng Lab Mạng với Containerlab: Xây Dựng Môi Trường Router và Switch Ảo Nhanh Hơn GNS3

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

Ba năm trước tôi đang khởi động GNS3 để kiểm tra kịch bản BGP failover trước khi đẩy lên production. VM mất 8 phút để boot, ngốn 12 GB RAM, và crash hai lần trước khi tôi kịp ping giữa các router. Đó là lúc tôi bắt đầu tìm kiếm thứ gì đó tốt hơn — và Containerlab đã thay đổi tất cả.

Cả network engineer lẫn DevOps đều hiểu bài toán lab: bạn cần một môi trường thực tế để kiểm thử, nhưng dựng lên mất quá nhiều thời gian. Containerlab giải quyết điều này bằng cách định nghĩa và triển khai topology mạng đa nhà cung cấp dùng container thay vì VM cồng kềnh. Hỗ trợ đầy đủ giao thức định tuyến, image OS thực của các hãng, và toàn bộ lab khởi động trong vòng 60 giây.

Bắt Đầu Nhanh — Chạy Được Trong 5 Phút

Cài Containerlab thực sự rất nhanh. Bạn cần Docker đã được cài và một máy Linux (hoặc WSL2 trên Windows).

Cài Đặt Containerlab

# Cài bằng một lệnh duy nhất (script chính thức)
bash -c "$(curl -sL https://get.containerlab.dev)"

# Kiểm tra cài đặt
clab version

Chỉ vậy thôi. Không pip, không virtualenv, không địa ngục dependency.

Lab Đầu Tiên — Ba Router, Hai Phút

Tạo file tên lab01.yml:

name: first-lab

topology:
  nodes:
    router1:
      kind: linux
      image: frrouting/frr:latest
    router2:
      kind: linux
      image: frrouting/frr:latest
    router3:
      kind: linux
      image: frrouting/frr:latest

  links:
    - endpoints: ["router1:eth1", "router2:eth1"]
    - endpoints: ["router2:eth2", "router3:eth1"]

Triển khai nó:

sudo clab deploy -t lab01.yml

Bạn sẽ thấy các container khởi động và một bảng hiển thị IP quản lý của từng node. Tổng thời gian từ không có gì đến ba router kết nối với nhau: khoảng 25 giây trên laptop tầm trung.

Để kết nối vào router1:

sudo docker exec -it clab-first-lab-router1 vtysh

Khi xong việc:

sudo clab destroy -t lab01.yml

Container biến mất, network interface được dọn sạch, không để lại gì.

Đào Sâu Hơn — Hiểu Topology File của Containerlab

File YAML topology của Containerlab làm một việc: mô tả mạng của bạn. Khi đã hiểu cấu trúc, bạn có thể mô hình hóa hầu hết mọi kịch bản thực tế.

Các Loại Node và Image

Containerlab hỗ trợ sẵn nhiều loại node:

  • linux — bất kỳ Docker image nào chạy Linux (FRRouting, Bird, VyOS)
  • srl — Nokia SR Linux (miễn phí, đầy đủ tính năng, xuất sắc cho lab)
  • ceos — Arista cEOS (cần đăng ký miễn phí tại arista.com)
  • crpd — Juniper cRPD (cần license của Juniper)
  • vr-ros — MikroTik RouterOS qua vrnetlab

Với hầu hết lab không có license nhà cung cấp, FRRouting trên Linux đã bao phủ OSPF, BGP, IS-IS, MPLS và nhiều hơn nữa. Nokia SR Linux miễn phí để kéo về và cho bạn trải nghiệm network OS thực sự.

Cấu Hình Node Lúc Triển Khai

Startup config được mount trực tiếp vào container qua key binds — không cần copy thủ công sau khi triển khai:

name: ospf-lab

topology:
  nodes:
    r1:
      kind: linux
      image: frrouting/frr:latest
      binds:
        - configs/r1/frr.conf:/etc/frr/frr.conf
        - configs/r1/daemons:/etc/frr/daemons

    r2:
      kind: linux
      image: frrouting/frr:latest
      binds:
        - configs/r2/frr.conf:/etc/frr/frr.conf
        - configs/r2/daemons:/etc/frr/daemons

  links:
    - endpoints: ["r1:eth1", "r2:eth1"]
      mtu: 9000

Config router nằm trên máy host — quản lý được bằng version control, so sánh diff dễ dàng, và tái tạo được trên mọi máy.

Network Link và Các Thuộc Tính

Về bản chất link là các cặp veth. Đặt MTU, mô phỏng độ trễ, hoặc bridge sang interface vật lý của máy host — tất cả đều trong file topology:

  links:
    # Link đơn giản
    - endpoints: ["r1:eth1", "r2:eth1"]

    # Với mô phỏng suy giảm (mô phỏng độ trễ)
    - endpoints: ["r1:eth2", "r3:eth1"]
      mtu: 1500

    # Bridge sang interface vật lý của máy host
    - endpoints: ["r2:eth3", "host:ens4"]

Nâng Cao — Lab BGP Đa Nhà Cung Cấp

Tôi dùng kiểu thiết lập này để kiểm tra thay đổi chính sách BGP trước khi động vào router production. Topology dưới đây chạy trong khoảng 45 giây trên máy 4 nhân với 8 GB RAM. GNS3 với VM Cisco IOS tương đương cần tối thiểu 16 GB.

Lab BGP với FRRouting

name: bgp-lab

topology:
  nodes:
    isp1:
      kind: linux
      image: frrouting/frr:latest
      binds:
        - configs/isp1/frr.conf:/etc/frr/frr.conf
        - configs/isp1/daemons:/etc/frr/daemons

    isp2:
      kind: linux
      image: frrouting/frr:latest
      binds:
        - configs/isp2/frr.conf:/etc/frr/frr.conf
        - configs/isp2/daemons:/etc/frr/daemons

    customer:
      kind: linux
      image: frrouting/frr:latest
      binds:
        - configs/customer/frr.conf:/etc/frr/frr.conf
        - configs/customer/daemons:/etc/frr/daemons

    client:
      kind: linux
      image: alpine:latest

  links:
    - endpoints: ["isp1:eth1", "customer:eth1"]
    - endpoints: ["isp2:eth1", "customer:eth2"]
    - endpoints: ["customer:eth3", "client:eth0"]

Cấu hình BGP FRRouting tối giản cho router customer (configs/customer/frr.conf):

frr version 9.0
frr defaults traditional
hostname customer

router bgp 65001
 bgp router-id 10.0.0.1
 neighbor 10.0.1.1 remote-as 65010
 neighbor 10.0.2.1 remote-as 65020
 !
 address-family ipv4 unicast
  network 192.168.100.0/24
  neighbor 10.0.1.1 soft-reconfiguration inbound
  neighbor 10.0.2.1 soft-reconfiguration inbound
 exit-address-family
!
line vty
!

Và file daemons để bật BGP:

bgpd=yes
ospfd=no
zebra=yes
vtysh_enable=yes

Kiểm Tra Lab Đang Chạy

# Hiển thị tất cả node và IP quản lý của chúng
sudo clab inspect -t bgp-lab.yml

# Kết nối vào vtysh của router customer
sudo docker exec -it clab-bgp-lab-customer vtysh

# Bên trong vtysh — kiểm tra BGP neighbor
show bgp summary
show ip route bgp

# Bắt gói tin trên eth1
sudo ip netns exec clab-bgp-lab-customer tcpdump -i eth1 -n

Dùng Nokia SR Linux (Miễn Phí, Không Cần License)

name: srl-lab

topology:
  nodes:
    leaf1:
      kind: srl
      image: ghcr.io/nokia/srlinux:latest
    leaf2:
      kind: srl
      image: ghcr.io/nokia/srlinux:latest
    spine1:
      kind: srl
      image: ghcr.io/nokia/srlinux:latest

  links:
    - endpoints: ["leaf1:e1-1", "spine1:e1-1"]
    - endpoints: ["leaf2:e1-1", "spine1:e1-2"]

SR Linux đi kèm CLI đầy đủ cùng các interface gRPC, gNMI và JSON-RPC — rất tốt để kiểm thử script tự động hóa với thứ gì đó hoạt động thực sự như OS của nhà cung cấp thật.

Mẹo Thực Chiến Từ Kinh Nghiệm

So Sánh Tài Nguyên: Containerlab vs GNS3

Trên cùng một máy 8 nhân, 16 GB RAM, chạy topology OSPF 5 node:

  • GNS3 với VM Cisco IOS: ~10 GB RAM, boot mất 4-8 phút, một VM mỗi router
  • Containerlab với FRRouting: ~400 MB RAM, dưới 30 giây, một container mỗi router
  • Containerlab với Nokia SR Linux: ~1.2 GB RAM mỗi node, 60-90 giây, OS vendor đầy đủ

Với hầu hết bài kiểm thử giao thức — OSPF, BGP, MPLS, chính sách định tuyến — container FRRouting cho bạn tất cả những gì cần với một phần nhỏ chi phí tài nguyên.

Lưu và Khôi Phục Cấu Hình Router

Sau khi thay đổi thủ công trong vtysh, lưu config trở lại máy host:

# Lưu running config từ container về máy host
sudo docker exec clab-bgp-lab-customer vtysh -c "write memory"
sudo docker cp clab-bgp-lab-customer:/etc/frr/frr.conf ./configs/customer/frr.conf

Giờ config lab của bạn được quản lý bằng version control. Push lên Git, chia sẻ với đồng nghiệp, tái tạo lab y hệt ở bất kỳ đâu.

Tích Hợp Containerlab vào CI/CD

Mô hình file YAML kết hợp Docker image phù hợp tự nhiên với CI pipeline. Kiểm tra thay đổi cấu hình mạng trước khi merge:

# .github/workflows/network-test.yml
jobs:
  network-lab-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Cài Containerlab
        run: bash -c "$(curl -sL https://get.containerlab.dev)"
      - name: Triển khai lab
        run: sudo clab deploy -t tests/bgp-lab.yml
      - name: Chạy kiểm tra kết nối
        run: |
          sleep 30  # Chờ BGP hội tụ
          sudo docker exec clab-bgp-lab-client ping -c 3 192.168.100.1
      - name: Xóa lab
        if: always()
        run: sudo clab destroy -t tests/bgp-lab.yml

Vẽ Sơ Đồ Topology

Còn có một công cụ trực quan hóa topology tích hợp sẵn:

sudo clab graph -t bgp-lab.yml

Lệnh này mở trình duyệt web với sơ đồ topology tương tác — hữu ích cho tài liệu hóa và nắm bắt nhanh các lab phức tạp.

Các Lệnh clab Hữu Ích Cần Nhớ

# Liệt kê tất cả lab đang chạy
sudo clab inspect --all

# Triển khai lại mà không xóa (cấu hình lại)
sudo clab redeploy -t lab01.yml

# Triển khai với prefix riêng để tránh xung đột tên
sudo clab deploy -t lab01.yml --prefix myproject

# Lưu tất cả cấu hình node cùng lúc
sudo clab save -t lab01.yml

Nếu bạn làm network engineering nghiêm túc hoặc tự động hóa hạ tầng, thành thạo Containerlab sẽ mang lại lợi ích rất nhanh. Dựng lên, kiểm thử, phá, và xây lại — tất cả trong dưới một phút, không cần lab vật lý, không tốn phí hypervisor VM. Khi topology YAML và config router cùng nằm trong một Git repo, khoảng cách giữa “kiểm thử trên lab” và “tự tin lên production” gần như thu về bằng không.

Hãy bắt đầu với thiết lập hai router FRRouting. Làm quen với cú pháp YAML, rồi chuyển sang SR Linux hoặc cEOS khi cần hành vi đặc thù của từng nhà cung cấp. Một buổi chiều là đủ để bạn làm việc hiệu quả với công cụ này.

Share: