BGP協議運行於TCP之上,因而,它也繼承了TCP連接的所有漏洞。例如,在一個BGP會話內,攻擊者可以冒充一個合法的BGP鄰居,然後說服另一端的BGP路由器共享路由信息給攻擊者。在攻擊者通告並向鄰居路由注入偽造的路由時,就會發生這個問題。毫無戒備的鄰居路由器就會開始向攻擊者發送通信實況,實際上這些信息並沒有去向任何地方,僅僅只是被丟棄了。回到2008年,YouTube實際上也受害於這樣的BGP路由中毒,並遭受了長達一個小時的視頻服務大量中斷。一個更加糟糕的情況是,如果攻擊者是個足夠懂行的人,他們可以偽裝成一台透明路由器,然後嗅探經過的通信以獲取敏感數據。你可以想象,這會造成深遠的影響。
要保護活躍的BGP會話不受攻擊,許多服務提供商在BGP會話中使用MD5校驗和及預共享密鑰。在受保護的BGP會話中,一台發送包的BGP路由器通過使用預共享的密鑰生成MD5散列值、部分IP和TCP頭以及有效載荷。然後,MD5散列作為一個TCP選項字段存儲。在收到包後,接受路由器用同樣的方法使用預共享密鑰生成它的MD5版本。它會將它的MD5散列和接收到的某個包的值進行對比,以決定是否接受該包。對於一個攻擊者而言,幾乎不可能猜測到校驗和或其密鑰。對於BGP路由器而言,它們能在使用包的內容前確保每個包的合法性。
在本教程中,我們將為大家演示如何使用MD5校驗和以及預共享密鑰來加固兩個鄰居間的BGP會話的安全。
准備
加固BGP會話安全是相當簡單而直截了當的,我們會使用以下路由器。
常用的Linux內核原生支持IPv4和IPv6的TCP MD5選項。因此,如果你從全新的Linux機器構建了一台Quagga路由器,TCP的MD5功能會自動啟用。剩下來的事情,僅僅是配置Quagga以使用它的功能。但是,如果你使用的是FreeBSD機器或者為Quagga構建了一個自定義內核,請確保內核開啟了TCP的MD5支持(如,Linux中的CONFIGTCPMD5SIG選項)。
配置Router-A驗證功能
我們將使用Quagga的CLI Shell來配置路由器,我們將使用的唯一的一個新命令是‘password’。
代碼如下:
[root@router-a ~]# vtysh
router-a# conf t
router-a(config)# router bgp 100
router-a(config-router)# network 192.168.100.0/24
router-a(config-router)# neighbor 10.10.12.2 remote-as 200
router-a(config-router)# neighbor 10.10.12.2 password xmodulo
本例中使用的預共享密鑰是‘xmodulo’。很明顯,在生產環境中,你需要選擇一個更健壯的密鑰。
注意: 在Quagga中,‘service password-encryption’命令被用做加密配置文件中所有明文密碼(如,登錄密碼)。然而,當我使用該命令時,我注意到BGP配置中的預共享密鑰仍然是明文的。我不確定這是否是Quagga的限制,還是版本自身的問題。
配置Router-B驗證功能
我們將以類似的方式配置router-B。
代碼如下:
[root@router-b ~]# vtysh
router-b# conf t
router-b(config)# router bgp 200
router-b(config-router)# network 192.168.200.0/24
router-b(config-router)# neighbor 10.10.12.1 remote-as 100
router-b(config-router)# neighbor 10.10.12.1 password xmodulo
驗證BGP會話
如果一切配置正確,那麼BGP會話就應該起來了,兩台路由器應該能交換路由表。這時候,TCP會話中的所有流出包都會攜帶一個MD5摘要的包內容和一個密鑰,而摘要信息會被另一端自動驗證。
我們可以像平時一樣通過查看BGP的概要來驗證活躍的BGP會話。MD5校驗和的驗證在Quagga內部是透明的,因此,你在BGP級別是無法看到的。
如果你想要測試BGP驗證,你可以配置一個鄰居路由,設置其密碼為空,或者故意使用錯誤的預共享密鑰,然後查看發生了什麼。你也可以使用包嗅探器,像tcpdump或者Wireshark等,來分析通過BGP會話的包。例如,帶有“-M ”選項的tcpdump將驗證TCP選項字段的MD5摘要。
小結
在本教程中,我們演示了怎樣簡單地加固兩台路由間的BGP會話安全。相對於其它協議而言,配置過程非常簡明。強烈推薦你加固BGP會話安全,尤其是當你用另一個AS配置BGP會話的時候。預共享密鑰也應該安全地保存。