Tcp
许多应用程序和服务都使用 TCP 进行通信。配置 TCP 选项以提高链路质量和安全性。
具有 SYN 和 FIN 标志的 TCP 报头的安全性
默认情况下,您的设备接受在 TCP 标志中同时设置了 SYN 和 FIN 位的数据包。配置设备以丢弃设置 SYN 和 FIN 位的数据包,以减少安全漏洞。
SYN 和 FIN 控制标志通常不会在同一 TCP 分段标头中设置。SYN 标志会同步序列号以启动 TCP 连接。FIN 标志表示要完成 TCP 连接的数据传输结束。它们的目的相互排斥。设置了 SYN 和 FIN 标志的 TCP 报头是异常 TCP 行为,根据操作系统的不同,接收方会发出各种响应。请参阅 图 1。
攻击者可以发送一个同时设置了两个标记的分段,以查看会返回哪种类型的系统回复,从而确定接收端是哪种操作系统。然后,攻击者可以利用任何已知的系统漏洞进行进一步攻击。启用 tcp-drop-synfin-set
语句时,Junos OS 会检查 TCP 标头中是否设置了 SYN 和 FIN 标志。如果发现此类标头,它将丢弃数据包。
[edit system internet-options] tcp-drop-synfin-set;
禁用 TCP RFC 1323 扩展
要禁用 RFC 1323 TCP 扩展,请在 no-tcp-rfc1323
层次结构级别包含语句 [edit system internet-options]
:
[edit system internet-options] no-tcp-rfc1323;
要禁用保护封装序列 (PAWS) 编号扩展(在 RFC 1323,高性能的 TCP 扩展中介绍),请在层次结构级别上[edit system internet-options]
包括no-tcp-rfc1323-paws
以下语句:
[edit system internet-options] no-tcp-rfc1323-paws;
为会话协商配置 TCP MSS
在建立会话连接期间,两个对等方在协商中达成一致,以确定他们在通信过程中交换的数据包的 IP 分段大小。TCP SYN 数据包中的 TCP MSS(最大分段大小)值用于指定 TCP 数据包的数据字段或分段可包含的最大字节数。如果 MSS 值设置得太高,可能会导致 IP 数据报太大,无法发送,必须进行分片。分段可能会产生额外的开销成本和丢包情况。
为了降低分片的可能性并防止丢包,您可以使用 tcp-mss
语句指定较低的 TCP MSS 值。该 tcp-mss
语句适用于遍历所有路由器入口接口(其 MSS 值高于指定接口)的所有 IPv4 TCP SYN 数据包。您不能免除特定端口的影响。
下一节介绍如何在 T 系列、M 系列和 MX 系列路由器上配置 TCP MSS。
在 T 系列和 M 系列路由器以及 MX 系列路由器上使用服务卡配置 TCP MSS
要使用服务卡在 T 系列和 M 系列路由器以及 MX 系列路由器上指定 TCP MSS 值,请在层次结构级别添加 tcp-mss mss-value
语句 [edit services service-set service-set-name]
:
[edit services service-set service-set-name] tcp-mss mss-value;
参数的范围 tcp-mss mss-value
从 536 字节到 65535 字节。
将服务集添加到要调整 TCP-MSS 值的任何接口:
[edit interfaces interface-name unit 0 family family service] input service-set service-set-name; output service-set service-set-name;
要查看接收的 SYN 数据包和修改了 MSS 值的 SYN 数据包的统计信息,请发出 show services service-sets statistics tcp-mss
操作模式命令。
有关在 T 系列和 M 系列路由器上配置 TCP MSS 的详细信息,请参阅 路由设备的 Junos OS 服务接口库。
使用 MPC 线卡在 MX 系列路由器上配置 TCP MSS 内联
要指定使用 MPC 线卡的 MX 系列路由器上的 TCP MSS 值,请在层级添加语句 tcp-mss
[edit interfaces interface-name unit logical-unit-number family family]
:
[edit interfaces interface-name unit logical-unit-number family family] tcp-mss mss-value;
参数的范围 mss-value 是 64 到 65,535 字节。TCP MSS 值必须低于接口的 MTU。
以下接口支持此语句:gr-(GRE)、ge-(千兆以太网)、xe-(10 千兆以太网)和 et-(40 千兆和 100 千兆以太网)。支持的家庭是 inet
和 inet6
。
使用 MPC 线卡在 MX 系列路由器上内联配置 TCP MSS 仅适用于退出/出口接口的流量,不适用于进入/进入接口的流量。
为本地生成的 TCP/IP 数据包选择固定源地址
本地生成的 IP 数据包是在路由引擎上运行的应用程序产生的数据包。Junos OS 会为这些数据包选择一个源地址,以便应用程序对等方作出响应。它还允许您按应用程序指定源地址。为了达到此目的,Telnet CLI 命令包含参数 source-address
。
本节介绍以下 default-address-selection
语句:
[edit system] default-address-selection;
如果您特别选择源地址,如 Telnet, default-address-selection
则不会影响源地址选择。源地址将成为使用 source-address
参数指定的地址(前提是该地址是在路由器接口上指定的有效地址)。如果未指定源地址或指定地址无效, default-address-selection
将影响默认源地址选择。
如果源地址未明确指定为 Telnet 的情况,则默认情况下(未 default-address-selection
指定)为本地生成的 IP 数据包选择的源地址为传出接口的 IP 地址。这表示,根据所选的传出接口,对于给定应用程序的不同调用,源地址可能会有所不同。
如果接口未编号(接口上未指定任何 IP 地址),Junos OS 会使用可预测的算法来确定默认源地址。如果 default-address-selection
指定了 Junos OS,则使用该算法选择源地址,无论传出接口是否编号。这表明,有了 default-address-selection
,您可以影响 Junos OS 在本地生成的 IP 数据包中提供相同的源地址,而不管传出接口如何。
Junos OS 的源地址选择行为可以汇总如下表所示:
传出接口 |
指定时间 |
未指定何时 |
---|---|---|
未编号 |
使用 |
使用 |
编号 |
使用 |
使用传出接口的 IP 地址 |
有关默认地址源选择算法的详细信息 ,请参阅配置默认、主地址和首选地址和接口 。
对于由 IP 路由协议(包括 OSPF、RIP、RSVP 和组播协议(但不包括 IS-IS)发送的 IP 数据包,本地地址选择通常受协议规范的约束,以便协议正常运行。当路由协议中存在此约束时,数据包的源地址不会受配置中存在 default-address-selection
语句的影响。对于本地地址不受 IBGP 和多跳 EBGP 等协议规范限制的协议,如果在配置协议时未配置特定本地地址,则使用与其他本地生成的 IP 数据包相同的方法选择本地地址。
TCP 身份验证
启用 TCP 身份验证方法可增强安全性,并确保在 BGP 和 LDP 会话期间交换的 TCP 分段的真实性。Junos 设备支持三种主要 TCP 身份验证类型:TCP MD5、TCP 身份验证选项 (TCP-AO) 和基于 TCP 密钥链的身份验证。有关 TCP-AO 的更多信息,请参阅 TCP 身份验证选项 (TCP-AO)。
尽管 Junos 设备同时支持 TCP-AO 和 TCP MD5 身份验证方法,但对于给定连接,您不能同时同时使用这两种方法。
IP 子网支持
在 Junos OS 演化版 22.4R1 之前,Junos 设备仅允许您对特定地址使用 TCP 身份验证。这意味着,您只能使用已知 IP 地址对远程对等方验证 TCP 连接。
从 Junos OS 演化版 22.4R1 开始,TCP-AO 和 TCP MD5 身份验证支持 LDP 和 BGP 会话的 IP 子网。使用网络地址和前缀长度配置 TCP 身份验证时,您选择的 TCP 身份验证方法会验证到该子网下整个地址范围的 TCP 连接。这意味着您可以对 TCP 连接进行身份验证,而无需知道目标设备的确切 IP 地址。
当 IP 子网重叠时,身份验证方法使用最长前缀匹配 (LPM) 来确定特定 TCP 会话的确切身份验证密钥。
Bgp
要为 BGP 会话配置基于前缀的身份验证,请将语句 allow (all | prefix-list)
包含在以下任一层次结构中:
-
[edit protocols bgp group group-name]
-
[edit protocols bgp group group-name dynamic-neighbor dyn-name]
您可以为子网使用 IPV4 或 IPV6 地址。
在此示例中,TCP MD5 将验证与 10.0.3.0/24 子网中所有 BGP 会话的 TCP 连接:
[edit protocols] bgp { group one { authentication-key "$ABC123"; allow 10.0.3.0/24; dynamic-neighbor dyn_one { allow 10.0.3.0/24; authentication-key "$ABC123"; } } }
自民党
要为 LDP 配置基于前缀的身份验证,请在层次结构下 session-group ip-prefix
配置 TCP 身份验证。您必须使用 IPv4 地址。
在此示例中,LDP 使用 TCP-AO 验证与地址在 10.0.0.0/24 子网中的设备的任何 TCP 连接:
[edit protocols ldp] session-group 10.0.0.0/24 { authentication-algorithm ao; authentication-key-chain tcpao; }
有关如何配置 TCP-AO 密钥链,请参阅 TCP 身份验证选项 (TCP-AO)。
VRF 支持
在 Junos OS 演化版 22.4R1 之前的版本中,TCP MD5 和 TCP-AO 会忽略虚拟路由和转发 (VRF) 实例。设备会忽略非默认路由实例下的 TCP MD5 和 TCP-AO 配置。当您在默认 VRF 实例下配置 TCP MD5 或 TCP-AO 时,设备会将此身份验证方法应用于该 VRF 实例的 IP 地址范围内目标的所有 TCP 会话。如果一个 TCP 会话属于非默认 VRF 实例,但目标 IP 地址与默认 VRF 实例相同,则 TCP MD5 和 TCP-AO 将对具有相同目标 IP 地址的两个 TCP 连接应用相同的身份验证密钥。
从 Junos OS 演化版 22.4R1 开始,TCP-AO 和 TCP MD5 身份验证在 BGP 和 LDP 会话中实现 VRF 感知。您可以在非默认路由实例下配置 TCP-AO 和 TCP MD5。您在路由实例下配置的 TCP 身份验证方法只会应用于该 VRF 实例内的 TCP 会话。如果不同 VRF 实例中的 TCP 连接具有相同的目标 IP 地址,则如果 VRF 实例没有为对等方配置 TCP 身份验证,则 TCP 身份验证方法不会应用于该 TCP 连接。
像通常一样配置基于 VRF 的 TCP 身份验证,但在层级下 routing-instances
。要使用 TCP MD5 身份验证,请包括语句 authentication-key authentication-key
。要使用 TCP-AO,请添加以下语句:
user@device# set authentication-algorithm ao user@device# set authentication-key-chain keychain
有关如何配置 TCP-AO 密钥链,请参阅 TCP 身份验证选项 (TCP-AO)。
您可以将 VRF 感知配置与 IP 子网相结合。这样,您就可以对 VRF 实例内一系列地址的连接进行身份验证。
Bgp
在以下任一层级为 BGP 会话配置基于 VRF 的 TCP 身份验证:
-
[edit routing-instances vrf-instance protocols bgp]
-
[edit routing-instances vrf-instance protocols bgp group group-name]
-
[edit routing-instances vrf-instance protocols bgp group group-name neighbor neighbor-ip]
-
[edit routing-instances vrf-instance protocols bgp group group-name dynamic-neighbor dyn-name]
如果在级别配置基于 VRF 的 dynamic-neighbor
身份验证,请将语句 allow
与所选的身份验证方法配置一起包括在内。例如,要与动态邻接方使用 TCP-AO:
[edit routing-instances vrf-instance protocols bgp group group-name dynamic-neighbor dyn-name] user@device# set allow (all | prefix-list) user@device# set authentication-algorithm ao user@device# set authentication-key-chain keychain
在以下示例中,BGP 使用 TCP 身份验证来确保名为 vrf-one
的 VRF 实例中 TCP 连接的安全性。在第 1 组中,BGP 使用 TCP MD5 验证与邻接方 IP 地址为 10.0.1.1 的连接。它使用 TCP-AO 验证 IP 地址为 10.0.1.2 的邻接方连接。
在第二组中,BGP 使用 TCP-AO 验证到 10.0.0.0/24 子网中任何设备的连接。
[edit routing-instances] vrf-one { protocols { bgp { group one { peer-as 22; neighbor 10.0.1.1 { authentication-key "$ABC123"; ## SECRET-DATA } neighbor 10.0.1.2 { authentication-algorithm ao; authentication-key-chain tcpao; } } group two { peer-as 22; dynamic-neighbor dyn_two { allow 10.0.0.0/24; authentication-algorithm ao; authentication-key-chain tcpao; } } } } }
自民党
在以下任一层级为 LDP 会话配置基于 VRF 的身份验证:
-
[edit routing-instances vrf-instance protocols ldp]
-
[edit routing-instances vrf-instance protocols ldp session session-ip]
-
[edit routing-instances vrf-instance protocols ldp session-group ip-prefix]
在此示例中,TCP-AO 在名为 vrf-two
的 VRF 实例中对 TCP 连接进行身份验证。它会验证到地址 10.0.1.1 以及 10.0.0.0/24 子网中的任何地址的 TCP 连接。
[edit routing-instances] vrf-two { protocols { ldp { session 10.0.1.1 { authentication-algorithm ao; authentication-key-chain tcpao; } session-group 10.0.0.0/24 { authentication-algorithm ao; authentication-key-chain tcpao; } } } }