1. 从“贴标签”说起BGP团体属性到底是什么如果你管理过稍微复杂一点的网络肯定遇到过这种头疼事从上游或者对等体那里学来成千上万条路由你只想对其中一小部分做点“特殊处理”。比如有些路由你希望它只在本地AS内部传传别泄露出去有些路由你想给它调个优先级让它走另一条路。一条条手动写策略匹配前缀那得累死而且前缀一变策略全得重写。这时候BGP的团体属性Community就该登场了。你可以把它想象成给BGP路由“贴标签”。这标签不是随便贴的它是一串数字贴在路由上跟着路由一起传播。网络里的其他路由器看到这个标签就能知道“哦这条路由是打过标记的我得按事先说好的规矩来处理它。” 这个“规矩”就是路由策略。我刚开始接触团体属性时总觉得它很“虚”不如AS_PATH、MED这些属性实在。但用多了才发现它才是实现灵活、自动化路由策略控制的“神器”。它的核心价值在于解耦把“哪些路由需要被特殊处理”通过标签标识和“具体怎么处理这些路由”通过策略匹配标签分开了。网络拓扑变了前缀增删了你只需要确保标签贴对了处理这些标签的策略往往可以保持不变。团体属性主要分两大类这也是我们今天要深挖的重点标准公有团体属性和扩展私有团体属性。标准属性就像互联网上的“通用暗号”大家约定俗成看到就知道什么意思私有属性则是你自己或在一个小范围联盟内定义的“内部暗号”想怎么定义就怎么定义非常灵活。接下来我们就从实战配置出发把这两种属性的用法、坑点掰开揉碎了讲清楚。2. 标准团体属性互联网的“通用交通信号灯”标准团体属性是IANA定义好的全网公认的“信号”。它们通常是知名的、预留的数值功能明确。用好它们你就能和全球其他网络进行一些基础但非常重要的策略协同。最常用的几个我习惯叫它们“四不兄弟”NO_EXPORT (十进制: 4294967041, 格式: 65535:65281)这是我最常用的一个。给路由打上这个标签意思是“收到这条路由的路由器不要把它通告给任何EBGP邻居”。注意这里有个例外在BGP联邦Confederation内部即使是在成员AS之间算是一种特殊的eBGP这个路由仍然可以传递。它就像一个“止步于AS边界”的牌子。NO_ADVERTISE (十进制: 4294967042, 格式: 65535:65282)这个更狠。意思是“收到这条路由的路由器不要把它通告给任何BGP邻居无论是eBGP还是iBGP都不行”。也就是说这条路由到了这台路由器就“戛然而止”了不会再继续传播。通常用于非常严格的控制场景。NO_EXPORT_SUBCONFED (十进制: 4294967043, 格式: 65535:65283)这个可以看作是NO_EXPORT的“威力加强版”。它不仅阻止向普通EBGP邻居通告连联邦内部的EBGP邻居子AS之间也不会传递。当你使用联邦且需要更精细的控制时它会派上用场。INTERNET (十进制: 4294967044, 格式: 65535:65284)这个属性现在用得相对少一些。它表示“这条路由可以通告给任何BGP邻居”。由于BGP路由默认就是可以传播的所以通常不需要显式设置它。但在一些复杂的策略中用它来覆盖其他更严格的团体属性值也是一种用法。光知道含义不够关键是怎么用。这里有个新手必踩的大坑BGP邻居默认是不传递团体属性的对你没看错。即使你在R1上给路由精心设置好了团体值发给邻居R2如果没开启对应的功能R2根本收不到这个属性更别提根据它执行策略了。你必须在建立BGP邻居关系的配置下显式地启用send-community命令。而且这个属性需要“逐跳”传递。意思是从源到目的路径上的每一对BGP邻居都需要配置这个命令团体属性才能像接力棒一样传到最后。举个例子假设网络路径是 R1 --(iBGP)-- R2 --(iBGP)-- R3 --(eBGP)-- R4。你想在R1设置团体属性并让R4能收到。那么你需要在R1对R2、R2对R3、R3对R4的BGP邻居配置下都加上neighbor 对方IP send-community。少配一跳属性就断了。怎么验证呢一个很实用的命令是show ip bgp neighbors 邻居IP advertised-routes。这个命令不仅能看发送了哪些路由前缀如果配置了send-community还能看到每条路由所携带的团体属性值非常直观。2.1 实战配置用NO_EXPORT实现路由泄露控制假设一个场景你是AS 100的网络管理员从上游AS 200学到一条路由192.0.2.0/24。你希望在你的AS内部AS 100使用这条路由但绝对不允许它再被通告给你的其他对等体比如AS 300。这时候NO_EXPORT就完美契合。虽然更常见的做法是在你的边界路由器连接AS 300的那台上做入向/出向过滤但利用团体属性你可以把策略“委托”给上游。你可以请求上游AS 200在发送这条路由给你时就给它打上NO_EXPORT标签。如果上游配合配置可能类似这样以Cisco IOS风格为例! 在AS 200的边界路由器上配置 ip prefix-list PERMIT_ROUTE seq 5 permit 192.0.2.0/24 ! route-map SET_COMMUNITY permit 10 match ip address prefix-list PERMIT_ROUTE set community no-export ! route-map SET_COMMUNITY permit 20 ! 放行其他路由不设置团体属性 ! router bgp 200 neighbor 你的路由器IP send-community both ! 关键必须发送团体属性 neighbor 你的路由器IP route-map SET_COMMUNITY out当你的路由器AS 100内从AS 200收到这条带NO_EXPORT标签的路由后它会正常使用并通过iBGP在AS 100内部传播。但是当你的路由器要把它通告给EBGP邻居比如连接AS 300的会话时BGP协议本身就会阻止这个行为。这样就实现了一种非常干净、基于协议特性的路由控制。3. 私有团体属性打造你自己的策略标签系统如果说标准属性是“国标”那私有团体属性就是你的“企业标准”或者“联盟标准”。它是32比特的数值可以按你的心意来定义功能无限。这就像给你的每一条或每一类路由贴上独有的“条形码”然后在网络的不同节点设置扫描仪路由策略来读取这个条形码并执行相应动作。私有团体属性有两种常见的表示格式十进制格式 比如12345678。直接但可读性差你很难记住一串数字代表什么。AA:NN格式 这是最推荐、最常用的格式。比如65001:100。这里的AA部分通常是你的自治系统号ASNNN是你自定义的编号。65001:100可以理解为“来自AS 65001的第100类路由”。可读性瞬间提升。这里又有一个显示上的坑有些老版本或默认配置下的路由器不会把65001:100原样显示它可能会自动转换成十进制。为了让你的配置更清晰建议在全局配置模式下敲一条命令ip bgp-community new-format。这条命令就是告诉路由器“按我写的AA:NN格式来显示团体属性别瞎转换。”3.1 应用一根据来源标记统一调整路由属性这是私有团体属性最经典的应用。我们经常需要根据路由的不同“来源”或“类型”对它们的BGP属性如MED、Local_Pref、AS Path等进行批量调整。场景你作为AS 200的网络管理员从多个对等体比如AS 100和AS 300接收路由。你希望所有从AS 100学来的路由其MED值被设置为200意味着优先级较低而从AS 300学来的路由MED值设置为100优先级较高。如果没有团体属性你需要在入口为每个对等体写复杂的prefix-list来匹配它们宣告来的所有路由维护起来是噩梦。用团体属性就优雅多了。步骤1要求对等体在发送路由时打上私有标签。你需要和AS 100、AS 300的管理员协商好一个私有团体值规划。例如约定AS 100发送来的路由都携带团体值100:1约定AS 300发送来的路由都携带团体值300:1步骤2在你的入口路由器上根据团体值设置MED。! 定义团体列表匹配对等体打来的标签 ip community-list standard FROM_AS100 permit 100:1 ip community-list standard FROM_AS300 permit 300:1 ! 创建路由图匹配团体并设置MED route-map SET_MED_FROM_PEER permit 10 match community FROM_AS100 set metric 200 ! route-map SET_MED_FROM_PEER permit 20 match community FROM_AS300 set metric 100 ! route-map SET_MED_FROM_PEER permit 30 ! 其他路由不做修改 ! 在BGP进程下应用路由图 router bgp 200 neighbor AS100的IP route-map SET_MED_FROM_PEER in neighbor AS300的IP route-map SET_MED_FROM_PEER in这样无论AS 100和AS 300宣告的具体前缀如何变化只要他们遵守约定打对了标签你的策略就永远生效维护成本极低。3.2 应用二标记特定路由控制其传播路径另一个高级用法是“染色法”。你在网络入口给某些特殊路由打上自定义的团体标签然后在网络核心或出口根据这些标签来决定路由是正常传播还是被过滤或者修改其他属性。场景你有一些重要的客户路由比如203.0.113.0/24你希望它们在你的网络内部被赋予更高的本地优先级Local Preference并且只允许传播给某个特定的上游Transit Provider A而不允许传播给另一个较便宜的上游Provider B以实现成本优化和路径控制。步骤1在接收客户路由的入口点打上复合标签。! 匹配客户路由 ip prefix-list IMPORTANT_CUSTOMER seq 5 permit 203.0.113.0/24 ! 创建路由图设置本地优先级并添加私有团体属性 route-map TAG_CUSTOMER_ROUTE permit 10 match ip address prefix-list IMPORTANT_CUSTOMER set local-preference 200 ! 提高内部优先级 set community 65001:666 65001:777 additive ! 注意这里的additive关键字 ! route-map TAG_CUSTOMER_ROUTE permit 9999 ! 其他路由不处理 router bgp 你的AS号 neighbor 客户路由器IP route-map TAG_CUSTOMER_ROUTE in这里的关键是set community ... additive。additive参数意味着“添加”这个团体值到路由已有的团体属性中而不是覆盖它。如果你不加additive新的团体值会覆盖旧值可能导致之前设置的比如来自上游的团体属性丢失。步骤2在连接不同上游的出口点基于团体标签实施策略。假设连接Provider A的接口我们希望允许带65001:666标签的路由出去连接Provider B的接口我们希望阻止这类路由。在连接Provider B的出口路由器上ip community-list standard NO_LEAK_TO_CHEAP_PROVIDER permit 65001:666 route-map BLOCK_TO_PROVIDER_B deny 10 match community NO_LEAK_TO_CHEAP_PROVIDER ! 匹配到的路由直接deny不通告 ! route-map BLOCK_TO_PROVIDER_B permit 20 ! 未匹配到的路由正常放行 router bgp 你的AS号 neighbor Provider_B的IP route-map BLOCK_TO_PROVIDER_B out通过这种“入口染色出口识别”的模式你可以构建一个非常灵活、策略驱动的路由控制平面策略的调整几乎都集中在入口的“染色”规则上出口策略相对固定。4. 大型网络中的实战技巧与避坑指南在实际的大型网络或数据中心里用团体属性我踩过不少坑也总结了一些让运维更轻松的技巧。第一规划先行做好“标签字典”。千万不要想到一个需求就随便定义一个团体值。一定要事先规划一个文档比如65001:1xx系列表示路由来源如65001:101来自IDC-A65001:102来自云服务商X65001:2xx系列表示路由类型如65001:201客户路由65001:202内部环回路由65001:3xx系列表示动作指令如65001:301禁止通告给对等体65001:302设置低MED这个文档要团队共享每次新增标签都必须更新。否则半年后没人记得65001:54321是干嘛用的。第二善用“社区列表Community-list”进行批量匹配。除了标准的精确匹配还可以用扩展社区列表进行正则式的匹配。! 匹配所有AA部分为65001的团体属性 ip community-list expanded MATCH_AS65001 permit _65001:_ ! 匹配所有NN部分为100的团体属性 ip community-list expanded MATCH_TAG_100 permit _*:100_这在你需要基于一个大的分类比如所有来自本AS的标记执行策略时非常方便。第三注意团体属性的传递范围。前面说了需要显式开启send-community。在大型iBGP全互联或路由反射器RR环境中要确保RR在反射路由时也能反射团体属性。在Cisco设备上通常需要在RR的BGP配置中针对客户端邻居也配置neighbor x.x.x.x send-community both。第四清除或修改团体属性。有时候你需要移除路由上已有的某些团体标签特别是在做路由重分发或者策略边界点。可以使用set comm-list 列表号 delete命令在路由图中删除匹配到的团体属性然后再用set community ... additive添加新的。最后调试是必不可少的。除了之前提到的show ip bgp neighbors x.x.x.x advertised-routes查看一条具体路由的详细信息show ip bgp x.x.x.x/x会显示它携带的所有路径属性包括团体属性。还有一个强大的命令是show ip bgp community AA:NN可以列出所有携带该团体属性的BGP路由在检查策略效果时非常直观。团体属性不是一个“非用不可”的特性但一旦你用熟了就会发现它是把BGP从“自动路由协议”变成“可编程策略引擎”的关键一环。它让路由策略变得声明式Declarative——“我想要这样的路由被那样处理”而不是命令式Imperative——“我要为这个/24、那个/25写匹配规则”。这种思维转变对于管理现代复杂网络至关重要。刚开始配置可能会觉得多了一层抽象有点麻烦但当你需要调整策略时你会感谢自己当初用了团体属性。