一、Port-Security概述

在部署園區網的時候,對於交換機,我們往往有如下幾種特殊的需求:
- 限制交換機每個端口下接入主機的數量(MAC地址數量)
- 限定交換機端口下所連接的主機(根據IP或MAC地址進行過濾)
- 當出現違例時間的時候能夠檢測到,並可采取懲罰措施
上述需求,可通過交換機的Port-Security功能來實現:

二、理解Port-Security
1.Port-Security安全地址:secure MAC address
在接口上激活Port-Security后,該接口就具有了一定的安全功能,例如能夠限制接口(所連接的)的最大MAC數量,從而限制接入的主機用戶;或者限定接口所連接的特定MAC,從而實現接入用戶的限制。那么要執行過濾或者限制動作,就需要有依據,這個依據就是安全地址 – secure MAC address。
安全地址表項可以通過讓使用端口動態學習到的MAC(SecureDynamic),或者是手工在接口下進行配置(SecureConfigured),以及sticy MAC address(SecureSticky) 三種方式進行配置。
當我們將接口允許的MAC地址數量設置為1並且為接口設置一個安全地址,那么這個接口將只為該MAC所屬的PC服務,也就是源為該MAC的數據幀能夠進入該接口。
2.當以下情況發生時,激活懲罰(violation):
當一個激活了Port-Security的接口上,MAC地址數量已經達到了配置的最大安全地址數量,並且又收到了一個新的數據幀,而這個數據幀的源MAC並不在這些安全地址中,那么啟動懲罰措施
當在一個Port-Security接口上配置了某個安全地址,而這個安全地址的MAC又企圖在同VLAN的另一個Port-Security接口上接入時,啟動懲罰措施
當設置了Port-Security接口的最大允許MAC的數量后,接口關聯的安全地址表項可以通過如下方式獲取:
- 在接口下使用switchport port-security mac-address 來配置靜態安全地址表項
- 使用接口動態學習到的MAC來構成安全地址表項
- 一部分靜態配置,一部分動態學習
當接口出現up/down,則所有動態學習的MAC安全地址表項將清空。而靜態配置的安全地址表項依然保留。
3.Port-Security與Sticky MAC地址
上面我們說了,通過接口動態學習的MAC地址構成的安全地址表項,在接口出現up/down后,將會丟失這些通過動態學習到的MAC構成的安全地址表項,但是所有的接口都用switchport port-security mac-address手工來配置,工作量又太大。因此這個sticky mac地址,可以讓我們將這些動態學習到的MAC變成“粘滯狀態”,可以簡單的理解為,我先動態的學,學到之后我再將你粘起來,形成一條”靜態“ (實際上是SecureSticky)的表項。
在up/down現象出現后仍能保存。而在使用wr后,這些sticky安全地址將被寫入start-up config,即使設備重啟也不會被丟失。
三、默認的Port-Security配置
- Port-Security 默認關閉
- 默認最大允許的安全MAC地址數量 1
- 懲罰模式 shutdown(進入err-disable狀態),同時發送一個SNMP trap
四、Port-Security的部署注意事項
1.Port-Security配置步驟
a) 在接口上激活Port-Security
Port-Security開啟后,相關參數都有默認配置,需關注
b) 配置每個接口的安全地址(Secure MAC Address)
可通過交換機動態學習、手工配置、以及stciky等方式創建安全地址
c) 配置Port-Security懲罰機制
默認為shutdown,可選的還有protect、restrict
d) (可選)配置安全地址老化時間
2.關於被懲罰后進入err-disable的恢復:
如果一個psec端口由於被懲罰進入了err-disable,可以使用如下方法來恢復接口的狀態:
- 使用全局配置命令:err-disable recovery psecure-violation
- 手工將特定的端口shutdown再noshutdown
3.清除接口上動態學習到的安全地址表項
- 使用clear port-security dynamic命令,將清除所有port-security接口上通過動態學習到的安全地址表項
- 使用clear port-security sticky 命令,將清除所有sticky安全地址表項
- 使用clear port-security configured命令,將清除所有手工配置的安全地址表項
- 使用clear port-security all命令,將清除所有安全地址表項
- 使用show port-security address來查看每個port-security接口下的安全地址表項
4.關於sticky安全地址
Sticky安全地址,是允許我們將Port-Security接口通過動態學習到的MAC地址變成“粘滯”的安全地址,從而不會由於接口的up/down丟失。然而如果我們希望在設備重啟之后,這個sticky的安全地址表項仍然存在,那么就需要wr一下。將配置寫入start-up config文件。Sticky安全地址也是一個簡化我們管理員操作的一個很好的工具,畢竟現在不用再一條條的手工去綁了。
5.port-security支持private vlan
6.port-security支持802.1Q tunnel接口
7.port-security不支持SPAN的目的接口
8.port-security不支持etherchannel的port-channel接口
9.在CISCO IOS 12.2(33)SXH 以及后續的版本,我們可以將port-security及802.1X部署在同一個接口上。而在此之前的軟件版本:
- 如果你試圖在一個port-security接口上激活8021.X則會報錯,並且802.1X功能無法開啟
- 如果你試圖在一個802.1X接口上激活port-security則也會報錯,並且port-security特性無法開啟
10.Port-Security支持nonegotiating trunk 接口
Port-Security 支持在如下配置的trunk上激活
switchport
switchport trunk encapsulation ?
switchport mode trukn
switchport nonegotiate
- If you reconfigure a secure access port as a trunk, port security converts all the sticky and static secure addresses on that port that were dynamically learned in the access VLAN to sticky or static secure addresses on the native VLAN of the trunk. Port security removes all secure addresses on the voice VLAN of the access port.
- If you reconfigure a secure trunk as an access port, port security converts all sticky and static addresses learned on the native VLAN to addresses learned on the access VLAN of the access port. Port security removes all addresses learned on VLANs other than the native VLAN.
11.Flex links和Port-Security互不兼容
五、Port-security的配置
1.激活Port-Security(在access接口上)

Switch(config)# interface fast0/1
Switch(config-if)# switchport
Switch(config-if)# switchport mode access
Switch(config-if)# switchport access vlan 10
Switch(config-if)# switchport port-security
接口的Port-Security特性一旦激活后,默認的最大安全地址個數為1,也就是說,在不進行手工配置安全地址的情況下,這個接口將使用其動態學習到的MAC作為安全地址,並且,這個接口相當於被該MAC(所屬的設備)獨占。而且默認的violation是shutdown
SW1#show port-security interface f0/1
Port Security : Enabled
Port Status : Secure-up !!接口目前的狀態是up的
Violation Mode : Shutdown !!違例后的懲罰措施,默認為shutdown
Aging Time : 0 mins
Aging Type : Absolute
SecureStatic Address Aging : Disabled
Maximum MAC Addresses : 1 !!最大安全地址個數,默認為1
Total MAC Addresses : 0
Configured MAC Addresses : 0 !!手工靜態配置的安全MAC地址,這里沒配
Sticky MAC Addresses : 0 !!sticky的安全地址,這里沒有
Last Source Address:Vlan : 00b0.1111.2222:10 !!最近的一個安全地址+vlan
Security Violation Count : 0 !!該接口歷史上出現過的違例次數
這個時候,如果另一台PC接入到這個端口上,那么該port-security接口將會收到一個新的、非安全地址表項中的MAC地址的數據幀,於是觸發的違例動作,給接口將被err-disable掉。同時產生一個snmp trap消息,另外,接口下,Security Violation Count將會加1
2.激活Port-Security(在trunk接口上)

3. Port-Security violation懲罰措施

默認的violation是shutdown。如果是protect,那么懲罰就會溫柔些,對於非法的數據幀(例如數據幀的源MAC不在安全地址表項中的、且安全地址已經達到最大數),這些非法數據將僅僅被丟棄,合法數據照常轉發,同時不會觸發一個syslog消息,另外接口下的“Security Violation Count”也不會加1。而如果是restrict,那么非法數據被丟棄,同時觸發一個syslog消息,再者,Security Violation Count加1,合法的數據照常轉發。
4. 配置Port Security Rate Limiter
(注意,在6509交換機,truncated switching模式下不支持該功能)
在交換機接口上開啟Port-Security是會耗費資源的,Port-Security會檢測每一個進入接口的數據幀,以判斷流量是否合法,或者是否存在違例行為。當一個安全接口設置的violation為shutdown的時候,該接口在違例后觸發懲罰機制,進入err-diasble狀態,這樣可以有效的方式有效的防止交換機由於處理違例事件導致交換機的CPU利用率過高。然而protect和restict的懲罰措施,則不會將端口關閉,端口依然可用,那么這就可能導致在違例事件發生的情況下交換機的CPU利用率飆高(例如大量的非法數據涌入)。因此當使用protect和restrict這兩種違例懲罰措施事,可以通過Port-Secuirty rate limiter來防止CPU飆高。
Switch(config)# mls rate-limite layer2 port-security rate_in_pps [burst_size]
關於rate_in_pps參數:
- 范圍是10- 1000000
- 沒有默認值
- 值設置的越低,對CPU的保護程度就越高,這個值對懲罰措施發生前、后都生效,當然這個值也不能設置的過低,至少要保障合法流量被處理吧。一般低於1000就差不多。
關於burst-size參數:
- 范圍是1-255
- 默認是10,這個默認值一般就夠用了。
5. 配置Port-Security 最大允許的安全地址數量

最大安全地址數量,不同的軟件平台允許的上限值有所不同,但是默認都是1。
在trunk口上,前面說了,也是可以激活port-security的,而在trunk口上配置最大安全地址數量,可以基於接口配置(對所有VLAN生效),也可以基於VLAN進行配置。如下:
switchport port-security maximum 1
switchport port-security maximum 1 vlan 10,20,30 !!可以關聯多個VLAN
6. 在port-security接口上手工配置安全地址

上述配置中,最大安全地址數設置為3,然后使用手工配置了一個安全地址,那么剩下2個,交換機可以通過動態學習的方式來構建安全地址。
在trunk接口上手工配置安全地址,可關聯vlan關鍵字。如果在trunk接口上手工配置安全地址,沒有關聯vlan關鍵字,那么該安全地址將被關聯到trunk的native vlan上
7. 在port-security接口上使用sticky MAC地址

我們知道,構成安全地址表項的方式有好幾種,其中一種是使用switchport port-security mac 來手工配置,但是這種方式耗時耗力,更需要去PC上抄MAC,工作成本比較高。而另一種構成安全地址的方式是讓交換機使用動態學習到的MAC,然而這些安全地址在接口一旦up/down后,將丟失,更別說重啟設備了。因此可以使用sticky mac的方式,這種方式激活后,交換機將動態學習到的MAC“粘起來”,具體的動作很簡單,就是在動態學習到MAC(例如一個00b0.1111.2222)后,如果我激活了sticiky MAC address,則在接口下自動產生一條命令:
interface FastEthernet0/1
switchport access vlan 10
switchport mode access
switchport port-security
switchport port-security mac-address sticky
switchport port-security mac-address sticky 00b0.1111.2222 !!自動產生

這樣形成的安全地址表項(是SecureSticky的),即使在接口翻動,也不會丟失。在者如果wr保存配置,命令寫入config.text,那么設備即使重啟,安全地址也不會丟失。
當在接口上激活了port-security mac-address sticky,那么:
- 該接口上所有通過動態學習到的MAC,將被轉成sticky mac address從而形成安全地址
- 接口上的靜態手工配置的安全地址不會被轉成sticky mac address
- 通過voice vlan動態學習到的安全地址不會被轉成sticky mac address
- 命令配置后,新學習到的MAC地址,也是sticky的
當此時又敲入no port-secuirty mac-address sticiky ,則所有的sticky安全地址條目都變成動態的安全地址條目(SecureDynamic)
8. 配置安全地址老化時間
配置的命令比較簡單:
Switch(config-if)# switchport port-security aging type {absolute | inactivity}
配置老化時間的類型,如果選擇absolute,也就是絕對時間,需要搭配aging time命令設定老化時間的具體值,命令一旦敲下去后,所有的通過動態學習的MAC構建的安全地址表項將開始以aging time倒計時。如果是inactivity關鍵字,則只在該動態安全地址表項不活躍的時候(譬如主機離線了或者掛掉了)才開始倒計時。
Switch(config-if)# switchport port-security aging time ?
設定老化時間
Switch(config-if)# switchport port-security aging static
使用前面兩條命令,老化時間是不會影響那些使用靜態手工配置的安全地址表項的,當然sticky表項也不會受影響,這些表項都是永不老化的,但是如果搭配上上面這條命令,則手工配置的安全地址表項也受限於老化時間了。
不過對於sticky表項,則始終不會激活aging time,它是不會老化的。
- 示例1:

將安全地址老化時間設置為50min。針對動態學習到的MAC構成的安全地址有效
50min是一個絕對時間,配置完成后開始倒計時,無論該MAC是否依然活躍,都始終進行倒計時
- 示例2:

針對動態學習到的MAC構成的安全地址有效,如果該MAC在50min內一直處於失效狀態(例如主機離線了),那么該安全地址在aging time超時后被清除
- 示例3:

注意,上述兩種配置方式,對手工配置switchport port-security mac-address 00b0.9999.9999的安全地址無效。也就是采用上述方法配置的靜態安全地址表項永不超時。
如果增加switchport port-security aging static命令,則手工靜態配置的安全地址也的aging time也開始計時
注意,對於sticky mac address,安全地址的老化時間無效