Trong phần trước, mình đã giới thiệu về cách để cải thiện sự hội tụ của STP. Trong phần này mình sẽ nói về cách để bảo vệ STP.
STP có thể bị tấn công vì hai lý do chính:
STP có thể bị tấn công vì hai lý do chính:
- STP xây dựng cấu trúc mạng bằng cách chấp nhận BPDUs từ các switch lân cận.
- Root Bridge luôn được xác định bởi Bridge ID thấp nhất.
- Một switch có ưu tiên thấp có thể được cài đặt vào mạng một cách có chủ đích hoặc vô tình và được chọn làm Root Bridge. STP sẽ thực hiện tái cấu trúc mạng, thường dẫn đến sự không ổn định hoặc một cấu trúc mạng không tối ưu.
- Cisco đã triển khai ba cơ chế để bảo vệ cấu trúc STP:
- Cisco đã triển khai ba cơ chế để bảo vệ cấu trúc STP:
- Root Guard
- BPDU Guard
- BPDU Filtering
Tất cả ba cơ chế này đều được cấu hình theo từng port và đều bị tắt theo mặc định. Và có một cơ chế để tránh các lỗi gián tiếp là Loop guard
- Root Guard ngăn chặn việc một switch không được ủy quyền quảng bá bản thân như là Root Bridge. Nếu một BPDU có ưu tiên cao hơn Root Bridge trên một port, với Root Guard được kích hoạt, port đó sẽ được đặt vào trạng thái root-inconsistent. Trong trạng thái này, port sẽ ở trạng thái tương tự như blocking và sẽ không chuyển tiếp frame. Tuy nhiên, port vẫn có thể lắng nghe các BPDU.
- Root Guard được kích hoạt theo từng port và mặc định là tắt:
- Để xem tất cả các port đã bị đặt vào trạng thái root-inconsistent:
- Root Guard có thể tự động phục hồi. Ngay khi các BPDU không còn được nhận nữa, port sẽ chuyển tiếp sang trạng thái STP bình thường.
- BPDU Guard được sử dụng để bảo vệ các port có kích hoạt PortFast khỏi việc nhận BPDUs. Nếu một port kích hoạt PortFast nhận được một BPDU, bất kể đó là BPDU gì, port sẽ được đặt vào trạng thái errdisable. Trong trạng thái này, port sẽ không hoạt động và STP topology sẽ không bị ảnh hưởng bởi switch khác được kết nối với port đó.
- BPDU Guard được bật theo từng port và mặc định là tắt:
- BPDU Guard được bật trên switch, nó chỉ áp dụng cho các port có kích hoạt PortFast:
- Một port có thể được phục hồi từ trạng thái errdisable bằng cách thực hiện lệnh shutdown và sau đó là no shutdown:
- Để kiểm tra BPDU Guard:
- BPDU Filtering được sử dụng để ngăn các BPDU gửi ra hoặc nhận vào và phải được kích hoạt kết hợp với PortFast, đồng nghĩa với tắt spanning tree bị tắt trên port.
Khi một BPDU được nhận trên một port, BPDU Filtering sẽ phản ứng theo một trong hai cách tùy thuộc vào cách cấu hình:
IV. Protecting STP
1. Root guard
- Root Guard ngăn chặn việc một switch không được ủy quyền quảng bá bản thân như là Root Bridge. Nếu một BPDU có ưu tiên cao hơn Root Bridge trên một port, với Root Guard được kích hoạt, port đó sẽ được đặt vào trạng thái root-inconsistent. Trong trạng thái này, port sẽ ở trạng thái tương tự như blocking và sẽ không chuyển tiếp frame. Tuy nhiên, port vẫn có thể lắng nghe các BPDU.
- Root Guard được kích hoạt theo từng port và mặc định là tắt:
Bash:
Switch(config)# interface gi0/1
Switch(config-if)# spanning-tree guard root
Bash:
Switch# show spanning-tree inconsistentports
2. BPDU Guard
- BPDU Guard được sử dụng để bảo vệ các port có kích hoạt PortFast khỏi việc nhận BPDUs. Nếu một port kích hoạt PortFast nhận được một BPDU, bất kể đó là BPDU gì, port sẽ được đặt vào trạng thái errdisable. Trong trạng thái này, port sẽ không hoạt động và STP topology sẽ không bị ảnh hưởng bởi switch khác được kết nối với port đó.
- BPDU Guard được bật theo từng port và mặc định là tắt:
Bash:
Switch(config)# interface gi1/14
Switch(config-if)# spanning-tree bpduguard enable
Bash:
Switch(config)# spanning-tree portfast bpduguard default
Bash:
Switch(config)# interface gi1/14
Switch(config-if)# shutdown
Switch(config-if)# no shutdown
Bash:
Switch(config)# do show spanning-tree interface g0/1 detail
3. BPDU Filtering
- BPDU Filtering được sử dụng để ngăn các BPDU gửi ra hoặc nhận vào và phải được kích hoạt kết hợp với PortFast, đồng nghĩa với tắt spanning tree bị tắt trên port.
Khi một BPDU được nhận trên một port, BPDU Filtering sẽ phản ứng theo một trong hai cách tùy thuộc vào cách cấu hình:
- Nếu filtering được bật globally(trên tất cả port), Port sẽ không gửi BPDU(trừ khi interface bật lại). Nếu port nào nhận BPDU, portfast và BPDU filter sẽ bị tắt, và trở lại trạng thái STP.
- Nếu filtering được bật trên từng port, BPDU sẽ không được gửi qua những port này và cũng sẽ không nhận được được BPDU(Tắt STP trên port).
- Theo mình thì nên cẩn thận khi dùng tính năng này, vì port sẽ từ chối nhận các gói BPDU. Sẽ không vào trạng thái err-disabled hoặc trở lại STP có thể gây loop.
- BPDU Filtering được bật globally, nó chỉ áp dụng cho các port có PortFast kích hoạt:
- Để kích hoạt BPDU Filtering trên một port cụ thể:
- Để kiểm tra BPDU Filtering:
- STP dựa vào việc trao đổi BPDUs để duy trì một môi trường không có loop. Nếu một lỗi phần mềm hoặc phần cứng khiến một switch ngừng nhận BPDUs, switch đó cuối cùng sẽ loại bỏ thông tin BPDU sau khi bộ đếm max age hết hạn. Điều này có thể dẫn đến việc switch chuyển sai trạng thái của một port từ blocking sang forwarding, từ đó tạo ra một loop.
- Loop Guard cung cấp một giải pháp toàn diện, nếu một port blocking ngừng nhận BPDUs trên một VLAN, nó sẽ được chuyển vào trạng thái loop-inconsistent cho VLAN đó. Một port trong trạng thái loop-inconsistent không thể chuyển tiếp lưu lượng cho các VLAN bị ảnh hưởng và thực tế là ở trạng thái pseudo-errdisable.
- Tuy nhiên, Loop Guard có thể tự động phục hồi. Ngay khi BPDUs được nhận lại, port sẽ chuyển trạng thái bình thường qua các trạng thái STP.
- Loop Guard có thể được bật globally:
- Loop Guard có thể bật trên từng interface:
- BPDU Filtering được bật globally, nó chỉ áp dụng cho các port có PortFast kích hoạt:
Bash:
Switch(config)# spanning-tree portfast bpdufilter default
Bash:
Switch(config)# interface gi0/0/1
Switch(config-if)# spanning-tree bpdufilter enable
Bash:
Switch(config)# do show spanning-tree interface g0/1 detail | include filter
4. Loop Guard
- STP dựa vào việc trao đổi BPDUs để duy trì một môi trường không có loop. Nếu một lỗi phần mềm hoặc phần cứng khiến một switch ngừng nhận BPDUs, switch đó cuối cùng sẽ loại bỏ thông tin BPDU sau khi bộ đếm max age hết hạn. Điều này có thể dẫn đến việc switch chuyển sai trạng thái của một port từ blocking sang forwarding, từ đó tạo ra một loop.
- Loop Guard cung cấp một giải pháp toàn diện, nếu một port blocking ngừng nhận BPDUs trên một VLAN, nó sẽ được chuyển vào trạng thái loop-inconsistent cho VLAN đó. Một port trong trạng thái loop-inconsistent không thể chuyển tiếp lưu lượng cho các VLAN bị ảnh hưởng và thực tế là ở trạng thái pseudo-errdisable.
- Tuy nhiên, Loop Guard có thể tự động phục hồi. Ngay khi BPDUs được nhận lại, port sẽ chuyển trạng thái bình thường qua các trạng thái STP.
- Loop Guard có thể được bật globally:
Bash:
Switch(config)# spanning-tree loopguard default
Bash:
Switch(config)# interface gi0/10
Switch(config-if)# spanning-tree guard loop
- Loop Guard chỉ nên được bật trên các port trunk hoặc các port kết nối với các switch khác. Loop Guard không nên được bật trên port kết nối với máy chủ, vì một port access không nên nhận BPDU.