BGP 的 TCP 访问限制
了解 BGP 与 TCP 的安全选项
在路由协议中,BGP 在使用 TCP 作为其传输协议方面独树一帜。通过在路由设备之间手动配置建立 BGP 对等方,以便在端口 179 上创建 TCP 会话。启用 BGP 的设备会定期发送激活消息以保持连接。
随着时间的推移,BGP 已成为互联网上占主导地位的域间路由协议。但是,它对稳定性和安全性的保证有限。为 BGP 配置安全选项时,必须在适当的安全措施与可接受的成本之间取得平衡。没有一种方法优于其他方法。每个网络管理员都必须配置满足所用网络需求的安全措施。
有关 BGP 使用 TCP 作为传输协议的安全问题的详细信息,请参阅 RFC 4272,BGP 安全漏洞分析。
另请参阅
示例:配置过滤器以阻止对端口的 TCP 访问(来自指定 BGP 对等方除外)
此示例说明如何配置标准无状态防火墙过滤器,以阻止除指定 BGP 对等方之外的所有请求方对端口 179 的所有 TCP 连接尝试。
要求
在配置此示例之前,不需要除设备初始化之外的特殊配置。
概述
在此示例中,您将创建一个无状态防火墙过滤器,用于阻止除指定 BGP 对等方之外的所有请求者对端口 179 的所有 TCP 连接尝试。
无状态防火墙过滤器 filter_bgp179 会将来自设备 A 和设备 B 上直接连接的接口的所有数据包与目标端口号 179 进行匹配。
配置
CLI 快速配置
要快速配置此示例,请复制以下命令,将其粘贴到文本文件中,删除所有换行符,更改与您的网络配置匹配所需的任何详细信息,然后将命令复制并粘贴到层次结构级别的 CLI [edit] 中。
设备 C
set interfaces ge-1/2/0 unit 10 description to-E set interfaces ge-1/2/0 unit 10 family inet address 10.10.10.10/30 set protocols bgp group external-peers type external set protocols bgp group external-peers peer-as 17 set protocols bgp group external-peers neighbor 10.10.10.9 set routing-options autonomous-system 22
设备 E
set interfaces ge-1/2/0 unit 0 description to-A set interfaces ge-1/2/0 unit 0 family inet address 10.10.10.1/30 set interfaces ge-1/2/1 unit 5 description to-B set interfaces ge-1/2/1 unit 5 family inet address 10.10.10.5/30 set interfaces ge-1/0/0 unit 9 description to-C set interfaces ge-1/0/0 unit 9 family inet address 10.10.10.9/30 set interfaces lo0 unit 2 family inet filter input filter_bgp179 set interfaces lo0 unit 2 family inet address 192.168.0.1/32 set protocols bgp group external-peers type external set protocols bgp group external-peers peer-as 22 set protocols bgp group external-peers neighbor 10.10.10.2 set protocols bgp group external-peers neighbor 10.10.10.6 set protocols bgp group external-peers neighbor 10.10.10.10 set routing-options autonomous-system 17 set firewall family inet filter filter_bgp179 term 1 from source-address 10.10.10.2/32 set firewall family inet filter filter_bgp179 term 1 from source-address 10.10.10.6/32 set firewall family inet filter filter_bgp179 term 1 from destination-port bgp set firewall family inet filter filter_bgp179 term 1 then accept set firewall family inet filter filter_bgp179 term 2 then reject
配置设备 E
分步过程
以下示例要求您在配置层次结构中导航各个级别。有关导航 CLI 的信息,请参阅《Junos OS CLI 用户指南》中的在配置模式下使用 CLI 编辑器。
要使用无状态防火墙过滤器配置设备 E,以阻止除指定 BGP 对等方之外的所有请求者对端口 179 的所有 TCP 连接尝试,请执行以下操作:
配置接口。
user@E# set interfaces ge-1/2/0 unit 0 description to-A user@E# set interfaces ge-1/2/0 unit 0 family inet address 10.10.10.1/30 user@E# set interfaces ge-1/2/1 unit 5 description to-B user@E# set interfaces ge-1/2/1 unit 5 family inet address 10.10.10.5/30 user@E# set interfaces ge-1/0/0 unit 9 description to-C user@E# set interfaces ge-1/0/0 unit 9 family inet address 10.10.10.9/30
配置 BGP。
[edit protocols bgp group external-peers] user@E# set type external user@E# set peer-as 22 user@E# set neighbor 10.10.10.2 user@E# set neighbor 10.10.10.6 user@E# set neighbor 10.10.10.10
配置自治系统编号。
[edit routing-options] user@E# set autonomous-system 17
定义接受来自指定 BGP 对等方的端口 179 的 TCP 连接尝试的过滤器术语。
[edit firewall family inet filter filter_bgp179] user@E# set term 1 from source-address 10.10.10.2/32 user@E# set term 1 from source-address 10.10.10.6/32 user@E# set term 1 from destination-port bgp user@E# set term 1 then accept
定义其他过滤器术语以拒绝来自其他源的数据包。
[edit firewall family inet filter filter_bgp179] user@E# set term 2 then reject
将防火墙过滤器应用于环路接口。
[edit interfaces lo0 unit 2 family inet] user@E# set filter input filter_bgp179 user@E# set address 192.168.0.1/32
结果
在配置模式下,输入 show firewall 、show interfaces、show protocols 和 show routing-options 命令,以确认您的配置。如果输出未显示预期的配置,请重复此示例中的说明,以便进行更正。
user@E# show firewall family inet { filter filter_bgp179 { term 1 { from { source-address { 10.10.10.2/32; 10.10.10.6/32; } destination-port bgp; } then accept; } term 2 { then { reject; } } } }
user@E# show interfaces lo0 { unit 2 { family inet { filter { input filter_bgp179; } address 192.168.0.1/32; } } } ge-1/2/0 { unit 0 { description to-A; family inet { address 10.10.10.1/30; } } } ge-1/2/1 { unit 5 { description to-B; family inet { address 10.10.10.5/30; } } } ge-1/0/0 { unit 9 { description to-C; family inet { address 10.10.10.9/30; } } }
user@E# show protocols bgp { group external-peers { type external; peer-as 22; neighbor 10.10.10.2; neighbor 10.10.10.6; neighbor 10.10.10.10; } }
user@E# show routing-options autonomous-system 17;
如果完成设备配置,请从配置模式输入 commit。
验证
确认配置工作正常。
验证是否已配置过滤器
目的
确保筛选器列在命令的 show firewall filter
输出中。
操作
user@E> show firewall filter filter_bgp179 Filter: filter_bgp179
验证 TCP 连接
目的
验证 TCP 连接。
操作
在操作模式下, show system connections extensive
在设备 C 和设备 E 上运行命令。
设备 C 上的输出显示了建立 TCP 连接的尝试。设备 E 上的输出显示仅与设备 A 和设备 B 建立连接。
user@C> show system connections extensive | match 10.10.10 tcp4 0 0 10.10.10.9.51872 10.10.10.10.179 SYN_SENT
user@E> show system connections extensive | match 10.10.10 tcp4 0 0 10.10.10.5.179 10.10.10.6.62096 ESTABLISHED tcp4 0 0 10.10.10.6.62096 10.10.10.5.179 ESTABLISHED tcp4 0 0 10.10.10.1.179 10.10.10.2.61506 ESTABLISHED tcp4 0 0 10.10.10.2.61506 10.10.10.1.179 ESTABLISHED
监控接口上的流量
目的
使用命令将 monitor traffic 建立 TCP 连接的接口上的流量与未建立 TCP 连接的接口上的流量进行比较。
操作
在操作模式下, monitor traffic 在设备 B 的设备 E 接口和设备 C 的设备 E 接口上运行命令。以下示例输出验证在第一个示例中是否收到了确认 (ack) 消息。在第二个示例中, ack 未收到消息。
user@E> monitor traffic size 1500 interface ge-1/2/1.5 19:02:49.700912 Out IP 10.10.10.5.bgp > 10.10.10.6.62096: P 3330573561:3330573580(19) ack 915601686 win 16384 <nop,nop,timestamp 1869518816 1869504850>: BGP, length: 19 19:02:49.801244 In IP 10.10.10.6.62096 > 10.10.10.5.bgp: . ack 19 win 16384 <nop,nop,timestamp 1869518916 1869518816> 19:03:03.323018 In IP 10.10.10.6.62096 > 10.10.10.5.bgp: P 1:20(19) ack 19 win 16384 <nop,nop,timestamp 1869532439 1869518816>: BGP, length: 19 19:03:03.422418 Out IP 10.10.10.5.bgp > 10.10.10.6.62096: . ack 20 win 16384 <nop,nop,timestamp 1869532539 1869532439> 19:03:17.220162 Out IP 10.10.10.5.bgp > 10.10.10.6.62096: P 19:38(19) ack 20 win 16384 <nop,nop,timestamp 1869546338 1869532439>: BGP, length: 19 19:03:17.320501 In IP 10.10.10.6.62096 > 10.10.10.5.bgp: . ack 38 win 16384 <nop,nop,timestamp 1869546438 1869546338>
user@E> monitor traffic size 1500 interface ge-1/0/0.9 18:54:20.175471 Out IP 10.10.10.9.61335 > 10.10.10.10.bgp: S 573929123:573929123(0) win 16384 <mss 1460,nop,wscale 0,nop,nop,timestamp 1869009240 0,sackOK,eol> 18:54:23.174422 Out IP 10.10.10.9.61335 > 10.10.10.10.bgp: S 573929123:573929123(0) win 16384 <mss 1460,nop,wscale 0,nop,nop,timestamp 1869012240 0,sackOK,eol> 18:54:26.374118 Out IP 10.10.10.9.61335 > 10.10.10.10.bgp: S 573929123:573929123(0) win 16384 <mss 1460,nop,wscale 0,nop,nop,timestamp 1869015440 0,sackOK,eol> 18:54:29.573799 Out IP 10.10.10.9.61335 > 10.10.10.10.bgp: S 573929123:573929123(0) win 16384 <mss 1460,sackOK,eol> 18:54:32.773493 Out IP 10.10.10.9.61335 > 10.10.10.10.bgp: S 573929123:573929123(0) win 16384 <mss 1460,sackOK,eol> 18:54:35.973185 Out IP 10.10.10.9.61335 > 10.10.10.10.bgp: S 573929123:573929123(0) win 16384 <mss 1460,sackOK,eol>
示例:配置过滤器以根据前缀列表限制对端口的 TCP 访问
此示例说明如何配置标准无状态防火墙过滤器,通过指定包含允许的 BGP 对等方的前缀源列表,限制发往路由引擎的某些 TCP 和互联网控制消息协议 (ICMP) 流量。
要求
配置此示例之前,不需要除设备初始化之外的特殊配置。
概述
在此示例中,您将创建一个无状态防火墙过滤器,该过滤器阻止所有请求方对端口 179 的所有 TCP 连接尝试,但具有指定前缀的 BGP 对等方除外。
拓扑学
将创建一个源前缀列表 plist_bgp179,用于指定包含允许的 BGP 对等方的源前缀列表。
无状态防火墙过滤器 filter_bgp179 匹配源前缀列表中 plist_bgp179 与目标端口号 179 的所有数据包。
配置
CLI 快速配置
要快速配置此示例,请复制以下命令,将其粘贴到文本文件中,删除所有换行符,更改与您的网络配置匹配所需的任何详细信息,然后将命令复制并粘贴到层次结构级别的 CLI [edit] 中。
set policy-options prefix-list plist_bgp179 apply-path "protocols bgp group <*> neighbor <*>" set firewall family inet filter filter_bgp179 term 1 from source-address 0.0.0.0/0 set firewall family inet filter filter_bgp179 term 1 from source-prefix-list plist_bgp179 except set firewall family inet filter filter_bgp179 term 1 from destination-port bgp set firewall family inet filter filter_bgp179 term 1 then reject set firewall family inet filter filter_bgp179 term 2 then accept set interfaces lo0 unit 0 family inet filter input filter_bgp179 set interfaces lo0 unit 0 family inet address 127.0.0.1/32
配置过滤器
分步过程
以下示例要求您在配置层次结构中导航各个级别。有关导航 CLI 的信息,请参阅《Junos OS CLI 用户指南》中的在配置模式下使用 CLI 编辑器。
要配置过滤器:
展开前缀列表 bgp179 以包括由 定义的 protocols bgp group <*> neighbor <*>BGP 对等组指向的所有前缀。
[edit policy-options prefix-list plist_bgp179] user@host# set apply-path " protocols bgp group <*> neighbor <*>"
定义过滤器术语,该术语拒绝除指定 BGP 对等方之外的所有请求方对端口 179 的 TCP 连接尝试。
[edit firewall family inet filter filter_bgp179] user@host# set term term1 from source-address 0.0.0.0/0 user@host# set term term1 from source-prefix-list bgp179 except user@host# set term term1 from destination-port bgp user@host# set term term1 then reject
定义另一个过滤器术语以接受所有数据包。
[edit firewall family inet filter filter_bgp179] user@host# set term term2 then accept
将防火墙过滤器应用于环路接口。
[edit interfaces lo0 unit 0 family inet] user@host# set filter input filter_bgp179 user@host# set address 127.0.0.1/32
结果
在配置模式下,输入 show firewall、 show interfaces和 show policy-options 命令确认您的配置。如果输出未显示预期的配置,请重复此示例中的说明,以便进行更正。
user@host# show firewall family inet { filter filter_bgp179 { term 1 { from { source-address { 0.0.0.0/0; } source-prefix-list { plist_bgp179 except; } destination-port bgp; } then { reject; } } term 2 { then { accept; } } } }
user@host# show interfaces lo0 { unit 0 { family inet { filter { input filter_bgp179; } address 127.0.0.1/32; } } }
user@host# show policy-options prefix-list plist_bgp179 { apply-path "protocols bgp group <*> neighbor <*>"; }
如果完成设备配置,请从配置模式输入 commit。
验证
确认配置工作正常。
显示应用于环路接口的防火墙过滤器
目的
验证防火墙过滤器 filter_bgp179 是否已应用于逻辑接口 lo0.0上的 IPv4 输入流量。
操作
对 show interfaces statistics operational mode
逻辑接口 lo0.0使用命令,并包括该 detail 选项。在 Protocol inet 命令输出部分的部分下,该 Input Filters 字段显示应用于输入方向逻辑接口的无状态防火墙过滤器的名称。
[edit] user@host> show interfaces statistics lo0.0 detail Logical interface lo0.0 (Index 321) (SNMP ifIndex 16) (Generation 130) Flags: SNMP-Traps Encapsulation: Unspecified Traffic statistics: Input bytes : 0 Output bytes : 0 Input packets: 0 Output packets: 0 Local statistics: Input bytes : 0 Output bytes : 0 Input packets: 0 Output packets: 0 Transit statistics: Input bytes : 0 0 bps Output bytes : 0 0 bps Input packets: 0 0 pps Output packets: 0 0 pps Protocol inet, MTU: Unlimited, Generation: 145, Route table: 0 Flags: Sendbcast-pkt-to-re Input Filters: filter_bgp179 Addresses, Flags: Primary Destination: Unspecified, Local: 127.0.0.1, Broadcast: Unspecified, Generation: 138
示例:限制 BGP 的 TCP 分段大小
此示例说明在使用最大传输单元 (MTU) 发现时,如何通过限制 TCP 段大小来避免互联网控制消息协议 (ICMP) 漏洞问题。在 TCP 路径上使用 MTU 发现是避免 BGP 数据包分段的一种方法。
要求
在配置此示例之前,不需要除设备初始化之外的特殊配置。
概述
TCP 在两个对等方之间建立会话连接期间协商最大分段大小 (MSS) 值。协商的 MSS 值主要基于通信对等方直接连接到的接口的最大传输单元 (MTU)。但是,由于 TCP 数据包所采用路径上的链路 MTU 会发生变化,当数据包大小超过链路的 MTU 时,网络中某些完全在 MSS 值内的数据包可能会分段。
要配置 TCP MSS 值,请包含 tcp-mss
段大小为 1 到 4096 的语句。
如果路由器收到设置了 SYN 位和 MSS 选项的 TCP 数据包,并且数据包中指定的 MSS 选项大于语句 tcp-mss
指定的 MSS 值,则路由器会将数据包中的 MSS 值替换为语句指定的 tcp-mss
较低值。
配置的 MSS 值用作发送方的最大分段大小。假设发送方用于与 BGP 邻接方通信的 TCP MSS 值与发送方可以从 BGP 邻接方接受的 TCP MSS 值相同。如果来自 BGP 邻居的 MSS 值小于配置的 MSS 值,则来自 BGP 邻居的 MSS 值将用作发送方的最大分段大小。
TCP over IPv4 和 TCP over IPv6 支持此功能。
配置
CLI 快速配置
要快速配置此示例,请复制以下命令,将其粘贴到文本文件中,删除所有换行符,更改与您的网络配置匹配所需的任何详细信息,然后将命令复制并粘贴到层次结构级别的 CLI [edit]
中。
R0
set interfaces fe-1/2/0 unit 1 family inet address 1.1.0.1/30 set interfaces lo0 unit 1 family inet address 10.255.14.179/32 set protocols bgp group-int tcp-mss 2020 set protocols bgp group int type internal set protocols bgp group int local-address 10.255.14.179 set protocols bgp group int mtu-discovery set protocols bgp group int neighbor 10.255.71.24 tcp-mss 2000 set protocols bgp group int neighbor 10.255.14.177 set protocols bgp group int neighbor 10.0.14.4 tcp-mss 4000 set protocols ospf area 0.0.0.0 interface fe-1/2/0.1 set protocols ospf area 0.0.0.0 interface 10.255.14.179 set routing-options autonomous-system 65000
程序
分步过程
以下示例要求您在配置层次结构中导航各个级别。有关导航 CLI 的信息,请参阅《Junos OS CLI 用户指南》中的在配置模式下使用 CLI 编辑器。
要配置路由器 R0:
配置接口。
[edit interfaces] user@R0# set fe-1/2/0 unit 1 family inet address 1.1.0.1/30 user@R0# set lo0 unit 1 family inet address 10.255.14.179/32
配置内部网关协议 (IGP),在本例中为 OSPF。
[edit protocols ospf area 0.0.0.0] user@R0# set interface fe-1/2/0.1 user@R0# set interface 10.255.14.179
配置一个或多个 BGP 组。
[edit protocols bgp group int] user@R0# set type internal user@R0# set local-address 10.255.14.179
配置 MTU 发现以防止数据包分段。
[edit protocols bgp group int] user@R0# set mtu-discovery
配置 BGP 邻接方,将 TCP MSS 设置为全局组或专门针对各种邻接方设置。
[edit protocols bgo group int] user@R0# set tcp-mss 2020 user@R0# set neighbor 10.255.14.177 user@R0# set neighbor 10.255.71.24 tcp-mss 2000 user@R0# set neighbor 10.0.14.4 tcp-mss 4000
注:TCP MSS 邻居设置将覆盖组设置。
配置本地自治系统。
[edit routing-options] user@R0# set autonomous-system 65000
结果
在配置模式下,输入 show interfaces
、 show protocols
和 show routing-options
命令确认您的配置。如果输出未显示预期的配置,请重复此示例中的说明,以便进行更正。
user@R0# show interfaces fe-1/2/0 { unit 1 { family inet { address 1.1.0.1/30; } } } lo0 { unit 1 { family inet { address 10.255.14.179/32; } } }
user@R0# show protocols bgp { group int { type internal; local-address 10.255.14.179; mtu-discovery; tcp-mss 2020; neighbor 10.255.71.24 { tcp-mss 2000; } neighbor 10.255.14.177; neighbor 10.0.14.4 { tcp-mss 4000; } } } ospf { area 0.0.0.0 { interface fe-1/2/0.1; interface 10.255.14.179; } }
user@R0# show routing-options autonomous-system 65000;
如果完成设备配置,请从配置模式输入 commit
。
验证
要确认配置工作正常,请运行以下命令:
show system connections extensive | find <neighbor-address>
,以检查协商的 TCP MSS 值。monitor traffic interface
,以监控 BGP 流量并确保配置的 TCP MSS 值用作 TCP SYN 数据包中的 MSS 选项。
故障排除
使用 MTU 发现进行 MSS 计算
问题
考虑一个示例,其中两个路由设备(R1 和 R2)具有内部 BGP (IBGP) 连接。在两个路由器上,连接的接口都将 4034 作为 IPv4 MTU。
user@R1# show protocols bgp | display set [edit] set protocols bgp group ibgp type internal set protocols bgp group ibgp local-address 45.45.45.2 set protocols bgp group ibgp mtu-discovery set protocols bgp group ibgp neighbor 45.45.45.1
user@R1# run show interfaces xe-0/0/3 extensive | match mtu Link-level type: Ethernet, MTU: 4048, LAN-PHY mode, Speed: 10Gbps, FIFO errors: 0, HS link CRC errors: 0, MTU errors: 0, Resource errors: 0 Protocol inet, MTU: 4034, Generation: 180, Route table: 0 Protocol multiservice, MTU: Unlimited, Generation: 181, Route table: 0
在设备 R1 上的以下数据包捕获中,协商的 MSS 为 3994。在 MSS 的信息中 show system connections extensive
,它设置为 2048。
05:50:01.575218 Out Juniper PCAP Flags [Ext], PCAP Extension(s) total length 16 Device Media Type Extension TLV #3, length 1, value: Ethernet (1) Logical Interface Encapsulation Extension TLV #6, length 1, value: Ethernet (14) Device Interface Index Extension TLV #1, length 2, value: 137 Logical Interface Index Extension TLV #4, length 4, value: 69 -----original packet----- 00:21:59:e1:e8:03 > 00:19:e2:20:79:01, ethertype IPv4 (0x0800), length 78: (tos 0xc0, ttl 64, id 53193, offset 0, flags [DF], proto: TCP (6), length: 64) 45.45.45.2.62840 > 45.45.45.1.bgp: S 2939345813:2939345813(0) win 16384 **mss 3994,nop,wscale 0,nop,nop,timestamp 70559970 0,sackOK,eol> 05:50:01.575875 In Juniper PCAP Flags [Ext, no-L2, In], PCAP Extension(s) total length 16 Device Media Type Extension TLV #3, length 1, value: Ethernet (1) Logical Interface Encapsulation Extension TLV #6, length 1, value: Ethernet (14) Device Interface Index Extension TLV #1, length 2, value: 137 Logical Interface Index Extension TLV #4, length 4, value: 69 -----original packet----- PFE proto 2 (ipv4): (tos 0xc0, ttl 255, id 37709, offset 0, flags [DF], proto: TCP (6), length: 64) 45.45.45.1.bgp > 45.45.45.2.62840: S 2634967984:2634967984(0) ack 2939345814 win 16384 **mss 3994,nop,wscale 0,nop,nop,timestamp 174167273 70559970,sackOK,eol>
user@R1# run show system connections extensive | find 45.45 tcp4 0 0 45.45.45.2.62840 45.45.45.1.179 ESTABLISHED sndsbcc: 0 sndsbmbcnt: 0 sndsbmbmax: 131072 sndsblowat: 2048 sndsbhiwat: 16384 rcvsbcc: 0 rcvsbmbcnt: 0 rcvsbmbmax: 131072 rcvsblowat: 1 rcvsbhiwat: 16384 proc id: 19725 proc name: rpd iss: 2939345813 sndup: 2939345972 snduna: 2939345991 sndnxt: 2939345991 sndwnd: 16384 sndmax: 2939345991 sndcwnd: 10240 sndssthresh: 1073725440 irs: 2634967984 rcvup: 2634968162 rcvnxt: 2634968162 rcvadv: 2634984546 rcvwnd: 16384 rtt: 0 srtt: 1538 rttv: 1040 rxtcur: 1200 rxtshift: 0 rtseq: 2939345972 rttmin: 1000 mss: 2048
解决方案
这是 Junos OS 的预期行为。MSS 值等于 MTU 值减去 IP 或 IPv6 和 TCP 报头。这意味着 MSS 值通常比 MTU 小 40 个字节(对于 IPv4),比 MTU(对于 IPv6)小 60 个字节。此值在对等方之间进行协商。在此示例中,它是 4034 - 40 = 3994。然后,Junos OS 将此值舍入为 2 KB 的倍数。值为 3994 / 2048 * 2048=2048。因此,没有必要在输出中看到 show system connections
相同的 MSS 值。
3994 / 2048 = 1.95
1.95 四舍五入为 1。
1 * 2048 = 2048