| rfc8783xml2.original.xml | rfc8783.xml | |||
|---|---|---|---|---|
| <?xml version="1.0" encoding="US-ASCII"?> | <?xml version='1.0' encoding='utf-8'?> | |||
| <!DOCTYPE rfc SYSTEM "rfc2629.dtd"> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
| <?rfc toc="yes"?> | <rfc | |||
| <?rfc tocompact="yes"?> | xmlns:xi="http://www.w3.org/2001/XInclude" | |||
| <?rfc tocdepth="3"?> | category="std" | |||
| <?rfc tocindent="yes"?> | consensus="true" | |||
| <?rfc symrefs="yes"?> | docName="draft-ietf-dots-data-channel-31" | |||
| <?rfc sortrefs="yes"?> | number="8783" | |||
| <?rfc comments="yes"?> | ipr="trust200902" | |||
| <?rfc inline="yes"?> | obsoletes="" | |||
| <?rfc compact="yes"?> | updates="" | |||
| <?rfc subcompact="no"?> | submissionType="IETF" | |||
| <rfc category="std" docName="draft-ietf-dots-data-channel-31" | xml:lang="en" | |||
| ipr="trust200902"> | tocInclude="true" | |||
| tocDepth="3" | ||||
| symRefs="true" | ||||
| sortRefs="true" | ||||
| version="3"> | ||||
| <!-- xml2rfc v2v3 conversion 2.40.0 --> | ||||
| <front> | <front> | |||
| <title abbrev="DOTS Data Channel Protocol">Distributed Denial-of-Service | <title abbrev="DOTS Data Channel Protocol">Distributed Denial-of-Service | |||
| Open Threat Signaling (DOTS) Data Channel Specification</title> | Open Threat Signaling (DOTS) Data Channel Specification</title> | |||
| <seriesInfo name="RFC" value="8783"/> | ||||
| <author fullname="Mohamed Boucadair" initials="M." role="editor" | <author fullname="Mohamed Boucadair" initials="M." role="editor" surname="Bo | |||
| surname="Boucadair"> | ucadair"> | |||
| <organization>Orange</organization> | <organization>Orange</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <street></street> | ||||
| <city>Rennes</city> | <city>Rennes</city> | |||
| <region></region> | ||||
| <code>35000</code> | <code>35000</code> | |||
| <country>France</country> | <country>France</country> | |||
| </postal> | </postal> | |||
| <email>mohamed.boucadair@orange.com</email> | <email>mohamed.boucadair@orange.com</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author fullname="Tirumaleswar Reddy.K" initials="T." role="editor" surname= | ||||
| <author fullname="Tirumaleswar Reddy" initials="T." role="editor" | "Reddy.K"> | |||
| surname="Reddy"> | ||||
| <organization abbrev="McAfee">McAfee, Inc.</organization> | <organization abbrev="McAfee">McAfee, Inc.</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <street>Embassy Golf Link Business Park</street> | <street>Embassy Golf Link Business Park</street> | |||
| <city>Bangalore</city> | <city>Bangalore</city> | |||
| <region>Karnataka</region> | <region>Karnataka</region> | |||
| <code>560071</code> | <code>560071</code> | |||
| <country>India</country> | <country>India</country> | |||
| </postal> | </postal> | |||
| <email>kondtir@gmail.com</email> | <email>kondtir@gmail.com</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <date month="May" year="2020"/> | ||||
| <date day="22" month="July" year="2019" /> | ||||
| <workgroup>DOTS</workgroup> | <workgroup>DOTS</workgroup> | |||
| <keyword>Automation</keyword> | <keyword>Automation</keyword> | |||
| <keyword>Security</keyword> | <keyword>Security</keyword> | |||
| <keyword>Mitigation</keyword> | <keyword>Mitigation</keyword> | |||
| <keyword>Scrubbing</keyword> | <keyword>Scrubbing</keyword> | |||
| <keyword>Anti-DDoS</keyword> | <keyword>Anti-DDoS</keyword> | |||
| <keyword>Mitigator</keyword> | <keyword>Mitigator</keyword> | |||
| <keyword>Security Center</keyword> | <keyword>Security Center</keyword> | |||
| <keyword>Filtering</keyword> | <keyword>Filtering</keyword> | |||
| <keyword>Resilience</keyword> | <keyword>Resilience</keyword> | |||
| <keyword>RESTCONF</keyword> | <keyword>RESTCONF</keyword> | |||
| <abstract> | <abstract> | |||
| <t>The document specifies a Distributed Denial-of-Service Open Threat | <t>The document specifies a Distributed Denial-of-Service Open Threat | |||
| Signaling (DOTS) data channel used for bulk exchange of data that cannot | Signaling (DOTS) data channel used for bulk exchange of data that cannot | |||
| easily or appropriately communicated through the DOTS signal channel | easily or appropriately communicated through the DOTS signal channel | |||
| under attack conditions.</t> | under attack conditions.</t> | |||
| <t>This is a companion document to "Distributed Denial-of-Service Open Thr | ||||
| <t>This is a companion document to the DOTS signal channel | eat Signaling (DOTS) Signal Channel Specification" (RFC 8782).</t> | |||
| specification.</t> | ||||
| </abstract> | </abstract> | |||
| <note title="Editorial Note (To be removed by RFC Editor)"> | ||||
| <t>Please update these statements within the document with the RFC | ||||
| number to be assigned to this document:<list style="symbols"> | ||||
| <t>"This version of this YANG module is part of RFC XXXX;"</t> | ||||
| <t>"RFC XXXX: Distributed Denial-of-Service Open Threat Signaling | ||||
| (DOTS) Data Channel Specification";</t> | ||||
| <t>reference: RFC XXXX</t> | ||||
| </list></t> | ||||
| <t>Please update the "revision" date of the YANG module.</t> | ||||
| </note> | ||||
| </front> | </front> | |||
| <middle> | <middle> | |||
| <section title="Introduction"> | <section numbered="true" toc="default"> | |||
| <name>Introduction</name> | ||||
| <t>A distributed denial-of-service (DDoS) attack is an attempt to make | <t>A distributed denial-of-service (DDoS) attack is an attempt to make | |||
| machines or network resources unavailable to their intended users. In | machines or network resources unavailable to their intended users. In | |||
| most cases, sufficient scale can be achieved by compromising enough | most cases, sufficient scale can be achieved by compromising enough | |||
| end-hosts and using those infected hosts to perpetrate and amplify the | end hosts and using those infected hosts to perpetrate and amplify the | |||
| attack. The victim of such attack can be an application server, a | attack. The victim of such an attack can be an application server, a | |||
| router, a firewall, an entire network, etc.</t> | router, a firewall, an entire network, etc.</t> | |||
| <t>As discussed in <xref target="RFC8612" format="default"/>, the lack of | ||||
| <t>As discussed in <xref target="RFC8612"></xref>, the lack of a common | a common | |||
| method to coordinate a real-time response among involved actors and | method to coordinate a real-time response among involved actors and | |||
| network domains inhibits the speed and effectiveness of DDoS attack | network domains inhibits the speed and effectiveness of DDoS attack | |||
| mitigation. From that standpoint, DDoS Open Threat Signaling (DOTS) | mitigation. From that standpoint, DDoS Open Threat Signaling (DOTS) | |||
| defines an architecture that allows a DOTS client to send requests to a | defines an architecture that allows a DOTS client to send requests to a | |||
| DOTS server for DDoS attack mitigation <xref | DOTS server for DDoS attack mitigation | |||
| target="I-D.ietf-dots-architecture"></xref>. The DOTS approach is thus | <xref target="I-D.ietf-dots-architecture" format="default"/>. The DOTS app | |||
| roach is thus | ||||
| meant to minimize the impact of DDoS attacks, thereby contributing to | meant to minimize the impact of DDoS attacks, thereby contributing to | |||
| the enforcement of more efficient defensive if not proactive security | the enforcement of more efficient defensive if not proactive security | |||
| strategies. To that aim, DOTS defines two channels: the signal and the | strategies. To that aim, DOTS defines two channels: the signal channel and | |||
| data channels (<xref target="channels"></xref>). <figure align="center" | the | |||
| anchor="channels" title="DOTS Channels"> | data channel (<xref target="channels" format="default"/>). </t> | |||
| <artwork><![CDATA[+---------------+ +- | <figure anchor="channels"> | |||
| --------------+ | <name>DOTS Channels</name> | |||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| +---------------+ +---------------+ | ||||
| | | <------- Signal Channel ------> | | | | | <------- Signal Channel ------> | | | |||
| | DOTS Client | | DOTS Server | | | DOTS Client | | DOTS Server | | |||
| | | <======= Data Channel ======> | | | | | <======= Data Channel ======> | | | |||
| +---------------+ +---------------+]]></artwork> | +---------------+ +---------------+ | |||
| </figure></t> | ]]></artwork> | |||
| </figure> | ||||
| <t>The DOTS signal channel is used to carry information about a device | <t>The DOTS signal channel is used to carry information about a device | |||
| or a network (or a part thereof) that is under a DDoS attack. Such | or a network (or a part thereof) that is under a DDoS attack. Such | |||
| information is sent by a DOTS client to an upstream DOTS server so that | information is sent by a DOTS client to an upstream DOTS server so that | |||
| appropriate mitigation actions are undertaken on traffic deemed | appropriate mitigation actions are undertaken on traffic deemed | |||
| suspicious. The DOTS signal channel is further elaborated in <xref | suspicious. The DOTS signal channel is further elaborated in <xref target= | |||
| target="I-D.ietf-dots-signal-channel"></xref>.</t> | "RFC8782" format="default"/>.</t> | |||
| <t>The DOTS data channel is used for infrequent bulk data | ||||
| <t>As for the DOTS data channel, it is used for infrequent bulk data | ||||
| exchange between DOTS agents to significantly improve the coordination | exchange between DOTS agents to significantly improve the coordination | |||
| of all the parties involved in the response to the attack. Section 2 of | of all the parties involved in the response to the attack. | |||
| <xref target="I-D.ietf-dots-architecture"></xref> mentions that the DOTS | <xref target="I-D.ietf-dots-architecture" section="2" sectionFormat="of" f | |||
| ormat="default"/> mentions that the DOTS | ||||
| data channel is used to perform the following tasks:</t> | data channel is used to perform the following tasks:</t> | |||
| <ul spacing="normal"> | ||||
| <t><list style="symbols"> | <li> | |||
| <t>Creating aliases for resources for which mitigation may be | <t>Creation of aliases for resources for which mitigation may be | |||
| requested.<vspace blankLines="1" />A DOTS client may submit to its | requested.</t> | |||
| DOTS server a collection of prefixes which it would like to refer to | <t>A DOTS client may submit to its | |||
| DOTS server a collection of prefixes to which it would like to refer | ||||
| by an alias when requesting mitigation. The DOTS server can respond | by an alias when requesting mitigation. The DOTS server can respond | |||
| to this request with either a success or failure response (see | to this request with either a success or failure response (see | |||
| Section 2 in <xref | <xref target="I-D.ietf-dots-architecture" section="2" sectionFormat="o | |||
| target="I-D.ietf-dots-architecture"></xref>).<vspace | f" format="default"/>).</t> | |||
| blankLines="1" />Refer to <xref target="identifier"></xref> for more | <t>Refer to <xref target="identifier" format="default"/> for more | |||
| details.</t> | details.</t> | |||
| </li> | ||||
| <li> | ||||
| <t>Policy management, which enables a DOTS client to request the | <t>Policy management, which enables a DOTS client to request the | |||
| installation or withdrawal of traffic filters, dropping or | installation or withdrawal of traffic filters, the dropping or | |||
| rate-limiting unwanted traffic, and permitting accept-listed | rate-limiting of unwanted traffic, and the permitting of accept-listed | |||
| traffic. A DOTS client is entitled to instruct filtering rules only | traffic. A DOTS client is entitled to instruct filtering rules only | |||
| on IP resources that belong to its domain.<vspace | on IP resources that belong to its domain.</t> | |||
| blankLines="1" />Sample use cases for populating drop- or | <t>Sample use cases for populating drop- or | |||
| accept-list filtering rules are detailed hereafter: <list | accept-list filtering rules are detailed hereafter: </t> | |||
| style="symbols"> | <ul spacing="normal"> | |||
| <li> | ||||
| <t>If a network resource (DOTS client) is informed about a | <t>If a network resource (DOTS client) is informed about a | |||
| potential DDoS attack from a set of IP addresses, the DOTS | potential DDoS attack from a set of IP addresses, the DOTS | |||
| client informs its servicing DOTS gateway of all suspect IP | client informs its servicing DOTS gateway of all suspect IP | |||
| addresses that need to be drop-listed for further investigation. | addresses that need to be drop-listed for further investigation. | |||
| The DOTS client could also specify a list of protocols and port | The DOTS client could also specify a list of protocols and port | |||
| numbers in the drop-list rule. <vspace blankLines="1" />The DOTS | numbers in the drop-list rule. </t> | |||
| <t>The DOTS | ||||
| gateway then propagates the drop-listed IP addresses to a DOTS | gateway then propagates the drop-listed IP addresses to a DOTS | |||
| server which will undertake appropriate actions so that traffic | server, which will undertake appropriate actions so that traffic | |||
| originated by these IP addresses to the target network | originated by these IP addresses to the target network | |||
| (specified by the DOTS client) is blocked.</t> | (specified by the DOTS client) is blocked.</t> | |||
| </li> | ||||
| <t>A network, that has partner sites from which only legitimate | <li> | |||
| traffic arrives, may want to ensure that the traffic from these | <t>A network that has partner sites from which only legitimate | |||
| traffic arrives may want to ensure that the traffic from these | ||||
| sites is not subjected to DDoS attack mitigation. The DOTS | sites is not subjected to DDoS attack mitigation. The DOTS | |||
| client uses the DOTS data channel to convey the accept-listed IP | client uses the DOTS data channel to convey the accept-listed IP | |||
| prefixes of the partner sites to its DOTS server. <vspace | prefixes of the partner sites to its DOTS server. </t> | |||
| blankLines="1" />The DOTS server uses this information to | <t>The DOTS server uses this information to | |||
| accept-list flows originated by such IP prefixes and which reach | accept-list flows originated by such IP prefixes and which reach | |||
| the network.</t> | the network.</t> | |||
| </list>Refer to <xref target="filter"></xref> for more | </li> | |||
| </ul> | ||||
| <t>Refer to <xref target="filter" format="default"/> for more | ||||
| details.</t> | details.</t> | |||
| </list></t> | </li> | |||
| </ul> | ||||
| </section> | </section> | |||
| <section anchor="notation" numbered="true" toc="default"> | ||||
| <section anchor="notation" title="Terminology"> | <name>Terminology</name> | |||
| <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | <t> | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQU | |||
| "OPTIONAL" in this document are to be interpreted as described in <xref | IRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
| target="RFC2119"></xref> <xref target="RFC8174"></xref> when, and only | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14> | |||
| when, they appear in all capitals, as shown here.</t> | RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
| "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | ||||
| <t>The reader should be familiar with the terms defined in <xref | be interpreted as | |||
| target="RFC8612"></xref>.</t> | described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | |||
| when, and only when, they appear in all capitals, as shown here. | ||||
| <t>The terminology for describing YANG modules is defined in <xref | </t> | |||
| target="RFC7950"></xref>. The meaning of the symbols in the tree | <t>The reader should be familiar with the terms defined in <xref target="R | |||
| diagrams is defined in <xref target="RFC8340"></xref>.</t> | FC8612" format="default"/>.</t> | |||
| <t>The terminology for describing YANG modules is defined in | ||||
| <xref target="RFC7950" format="default"/>. The meaning of the symbols in t | ||||
| he tree | ||||
| diagrams is defined in <xref target="RFC8340" format="default"/>.</t> | ||||
| <t>This document generalizes the notion of Access Control List (ACL) so | <t>This document generalizes the notion of Access Control List (ACL) so | |||
| that it is not device-specific <xref target="RFC8519"></xref>. As such, | that it is not device specific <xref target="RFC8519" format="default"/>. As such, | |||
| this document defines an ACL as an ordered set of rules that is used to | this document defines an ACL as an ordered set of rules that is used to | |||
| filter traffic. Each rule is represented by an Access Control Entry | filter traffic. Each rule is represented by an Access Control Entry | |||
| (ACE). ACLs communicated via the DOTS data channel are not bound to a | (ACE). ACLs communicated via the DOTS data channel are not bound to a | |||
| device interface.</t> | device interface.</t> | |||
| <t>For the sake of simplicity, the examples in this document use | ||||
| <t>For the sake of simplicity, all of the examples in this document use | "/restconf" as the discovered RESTCONF API root path. Within the examples, | |||
| "/restconf" as the discovered RESTCONF API root path. Many protocol | many protocol | |||
| header lines and message-body text within examples throughout the | header lines and message-body text are split into multiple lines for displ | |||
| document are split into multiple lines for display purposes only. When a | ay purposes only. When a | |||
| line ends with backslash ('\') as the last character, the line is | line ends with backslash ('\') as the last character, the line is | |||
| wrapped for display purposes. It is to be considered to be joined to the | wrapped for display purposes. It is to be considered to be joined to the | |||
| next line by deleting the backslash, the following line break, and the | next line by deleting the backslash, the following line break, and the | |||
| leading whitespace of the next line.</t> | leading whitespace of the next line.</t> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="DOTS Data Channel"> | <name>DOTS Data Channel</name> | |||
| <section title="Design Overview"> | <section numbered="true" toc="default"> | |||
| <name>Design Overview</name> | ||||
| <t>Unlike the DOTS signal channel, which must remain operational even | <t>Unlike the DOTS signal channel, which must remain operational even | |||
| when confronted with signal degradation due to packets loss, the DOTS | when confronted with signal degradation due to packet loss, the DOTS | |||
| data channel is not expected to be fully operational at all times, | data channel is not expected to be fully operational at all times, | |||
| especially when a DDoS attack is underway. The requirements for a DOTS | especially when a DDoS attack is underway. The requirements for a DOTS | |||
| data channel protocol are documented in <xref | data channel protocol are documented in <xref target="RFC8612" format="d | |||
| target="RFC8612"></xref>.</t> | efault"/>.</t> | |||
| <t>This specification does not require an order of DOTS signal and | <t>This specification does not require an order of DOTS signal and | |||
| data channel creations nor mandates a time interval between them. | data channel creation nor does it mandate a time interval between them. | |||
| These considerations are implementation- and deployment-specific.</t> | These considerations are implementation and deployment specific.</t> | |||
| <t>As the primary function of the data channel is data exchange, a | <t>As the primary function of the data channel is data exchange, a | |||
| reliable transport mode is required in order for DOTS agents to detect | reliable transport mode is required in order for DOTS agents to detect | |||
| data delivery success or failure. This document uses RESTCONF <xref | data delivery success or failure. This document uses RESTCONF <xref targ | |||
| target="RFC8040"></xref> over TLS over TCP as the DOTS data channel | et="RFC8040" format="default"/> over TLS over TCP as the DOTS data channel | |||
| protocol. The abstract layering of DOTS data channel is shown in <xref | protocol. The abstract layering of the DOTS data channel is shown in <xr | |||
| target="fig_dots2"></xref>.</t> | ef target="fig_dots2" format="default"/>.</t> | |||
| <figure anchor="fig_dots2"> | ||||
| <t><figure anchor="fig_dots2" | <name>Abstract Layering of DOTS Data Channel</name> | |||
| title="Abstract Layering of DOTS Data Channel"> | <artwork align="center" name="" type="" alt=""><![CDATA[ | |||
| <artwork align="center"><![CDATA[+-------------------+ | +-------------------+ | |||
| | DOTS Data Channel | | | DOTS Data Channel | | |||
| +-------------------+ | +-------------------+ | |||
| | RESTCONF | | | RESTCONF | | |||
| +-------------------+ | +-------------------+ | |||
| | TLS | | | TLS | | |||
| +-------------------+ | +-------------------+ | |||
| | TCP | | | TCP | | |||
| +-------------------+ | +-------------------+ | |||
| | IP | | | IP | | |||
| +-------------------+ | +-------------------+ | |||
| ]]></artwork> | ]]></artwork> | |||
| </figure></t> | </figure> | |||
| <t>The HTTP POST, PUT, PATCH, and DELETE methods are used to edit data | <t>The HTTP POST, PUT, PATCH, and DELETE methods are used to edit data | |||
| resources represented by DOTS data channel YANG modules. These basic | resources represented by DOTS data channel YANG modules. These basic | |||
| edit operations allow the DOTS data channel running configuration to | edit operations allow a DOTS client to alter the running configuration | |||
| be altered by a DOTS client. Rules for generating and processing | of the DOTS data channel. Rules for generating and processing | |||
| RESTCONF methods are defined in Section 4 of <xref | RESTCONF methods are defined in <xref target="RFC8040" section="4" secti | |||
| target="RFC8040"></xref>.</t> | onFormat="of" format="default"/>.</t> | |||
| <t>DOTS data channel configuration information as well as state | <t>DOTS data channel configuration information as well as state | |||
| information can be retrieved with the GET method. An HTTP status-line | information can be retrieved with the GET method. An HTTP status-line | |||
| is returned for each request to report success or failure for RESTCONF | is returned for each request to report success or failure for RESTCONF | |||
| operations (Section 5.4 of <xref target="RFC8040"></xref>). The | operations (<xref target="RFC8040" section="5.4" sectionFormat="of" form | |||
| "error-tag" provides more information about encountered errors | at="default"/>). The | |||
| (Section 7 of <xref target="RFC8040"></xref>).</t> | error-tag provides more information about encountered errors | |||
| (<xref target="RFC8040" section="7" sectionFormat="of" format="default"/ | ||||
| >).</t> | ||||
| <t>DOTS clients perform the root resource discovery procedure | <t>DOTS clients perform the root resource discovery procedure | |||
| discussed in Section 3.1 of <xref target="RFC8040"></xref> to | discussed in <xref target="RFC8040" section="3.1" sectionFormat="of" for mat="default"/> to | |||
| determine the root of the RESTCONF API. After discovering the RESTCONF | determine the root of the RESTCONF API. After discovering the RESTCONF | |||
| API root, a DOTS client uses this value as the initial part of the | API root, a DOTS client uses this value as the initial part of the | |||
| path in the request URI in any subsequent request to the DOTS server. | path in the request URI in any subsequent request to the DOTS server. | |||
| The DOTS server may support the retrieval of the YANG modules it | The DOTS server may support the retrieval of the YANG modules it | |||
| supports (Section 3.7 in <xref target="RFC8040"></xref>). For example, | supports (<xref target="RFC8040" section="3.7" sectionFormat="of" format ="default"/>). For example, | |||
| a DOTS client may use RESTCONF to retrieve the vendor-specific YANG | a DOTS client may use RESTCONF to retrieve the vendor-specific YANG | |||
| modules supported by its DOTS server.</t> | modules supported by its DOTS server.</t> | |||
| <t>JavaScript Object Notation (JSON) <xref target="RFC8259" format="defa | ||||
| <t>JavaScript Object Notation (JSON) <xref target="RFC8259"> </xref> | ult"> </xref> | |||
| payloads are used to propagate the DOTS data-channel-specific payload | payloads are used to propagate the DOTS data-channel-specific payload | |||
| messages that carry request parameters and response information, such | messages that carry request parameters and response information, such | |||
| as errors. This specification uses the encoding rules defined in <xref | as errors. This specification uses the encoding rules defined in | |||
| target="RFC7951"></xref> for representing DOTS data channel | <xref target="RFC7951" format="default"/> for representing DOTS data cha | |||
| configuration data using YANG (<xref target="YANG"></xref>) as JSON | nnel | |||
| configuration data using YANG (<xref target="YANG" format="default"/>) a | ||||
| s JSON | ||||
| text.</t> | text.</t> | |||
| <t>A DOTS client registers itself with its DOTS server(s) in order to | ||||
| <t>A DOTS client registers itself to its DOTS server(s) in order to | set up DOTS data channel-related configuration data and to receive state | |||
| set up DOTS data channel-related configuration data and receive state | data (i.e., non-configuration data) from the DOTS server(s) (<xref targe | |||
| data (i.e., non-configuration data) from the DOTS server(s) (<xref | t="registering" format="default"/>). | |||
| target="registering"></xref>). Mutual authentication considerations | Mutual authentication considerations are specified in | |||
| are specified in Section 8 of <xref | <xref target="RFC8782" section="8" sectionFormat="of" format="default"/> | |||
| target="I-D.ietf-dots-signal-channel"></xref>. The coupling of signal | . | |||
| and data channels is discussed in Section 4.4.1 of <xref | The coupling of signal and data channels is discussed in | |||
| target="I-D.ietf-dots-signal-channel"></xref>.</t> | <xref target="RFC8782" section="4.4.1" sectionFormat="of" format="defaul | |||
| t"/>.</t> | ||||
| <t>A DOTS client can either maintain a persistent connection or | <t>A DOTS client can either maintain a persistent connection or initiate | |||
| periodic connections with its DOTS server(s). If the DOTS client needs | periodic connections with its DOTS server(s). If the DOTS client needs | |||
| to frequently update the drop-list or accept-list filtering rules or | to frequently update the drop-list or accept-list filtering rules or | |||
| aliases, it maintains a persistent connection with the DOTS server. | aliases, it maintains a persistent connection with the DOTS server. | |||
| For example, CAPTCHA and cryptographic puzzles can be used by the | For example, CAPTCHA and cryptographic puzzles can be used by the | |||
| mitigation service in the DOTS client domain to determine whether the | mitigation service in the DOTS client domain to determine | |||
| IP address is used for legitimate purpose or not, and the DOTS client | whether or not the | |||
| IP address is used for legitimate purpose, and the DOTS client | ||||
| can frequently update the drop-list filtering rules. A persistent | can frequently update the drop-list filtering rules. A persistent | |||
| connection is also useful if the DOTS client subscribes to event | connection is also useful if the DOTS client subscribes to event | |||
| notifications (Section 6.3 of <xref target="RFC8040"></xref>). | notifications (<xref target="RFC8040" section="6.3" sectionFormat="of" f ormat="default"/>). | |||
| Additional considerations related to RESTCONF connection management | Additional considerations related to RESTCONF connection management | |||
| (including, configuring the connection type or the reconnect strategy) | (including, configuring the connection type or the reconnect strategy) | |||
| can be found in <xref | can be found in <xref target="I-D.ietf-netconf-restconf-client-server" f | |||
| target="I-D.ietf-netconf-restconf-client-server"></xref>.</t> | ormat="default"/>.</t> | |||
| <t>A single DOTS data channel between DOTS agents can be used to | <t>A single DOTS data channel between DOTS agents can be used to | |||
| exchange multiple requests and multiple responses. To reduce DOTS | exchange multiple requests and multiple responses. To reduce DOTS | |||
| client and DOTS server workload, DOTS clients SHOULD re-use the same | client and DOTS server workload, DOTS clients <bcp14>SHOULD</bcp14> reus e the same | |||
| TLS session. While the communication to the DOTS server is quiescent, | TLS session. While the communication to the DOTS server is quiescent, | |||
| the DOTS client MAY probe the server to ensure it has maintained | the DOTS client <bcp14>MAY</bcp14> probe the server to ensure it has mai ntained | |||
| cryptographic state. Such probes can also keep alive firewall and/or | cryptographic state. Such probes can also keep alive firewall and/or | |||
| NAT bindings. A TLS heartbeat <xref target="RFC6520"></xref> verifies | NAT bindings. A TLS heartbeat <xref target="RFC6520" format="default"/> verifies | |||
| that the DOTS server still has TLS state by returning a TLS | that the DOTS server still has TLS state by returning a TLS | |||
| message.</t> | message.</t> | |||
| <t>A DOTS server may detect conflicting filtering requests from | <t>A DOTS server may detect conflicting filtering requests from | |||
| distinct DOTS clients which belong to the same domain. For example, a | distinct DOTS clients that belong to the same domain. For example, a | |||
| DOTS client could request to drop-list a prefix by specifying the | DOTS client could request to drop-list a prefix by specifying the | |||
| source prefix, while another DOTS client could request to accept-list | source prefix, while another DOTS client could request to accept-list | |||
| that same source prefix, but both having the same destination prefix. | that same source prefix, but both having the same destination prefix. | |||
| DOTS servers SHOULD support a configuration parameter to indicate the | DOTS servers <bcp14>SHOULD</bcp14> support a configuration parameter to indicate the | |||
| behavior to follow when a conflict is detected (e.g., reject all, | behavior to follow when a conflict is detected (e.g., reject all, | |||
| reject the new request, notify an administrator for validation). <xref | reject the new request, notify an administrator for validation). | |||
| target="install"></xref> specifies a default behavior when no | <xref target="install" format="default"/> specifies a default behavior w | |||
| hen no | ||||
| instruction is supplied to a DOTS server.</t> | instruction is supplied to a DOTS server.</t> | |||
| <t>How a DOTS client synchronizes its configuration with the one | <t>How a DOTS client synchronizes its configuration with the one | |||
| maintained by its DOTS server(s) is implementation-specific. For | maintained by its DOTS server(s) is implementation specific. For | |||
| example: <list style="symbols"> | example: </t> | |||
| <t>a DOTS client can systematically send a GET message before | <ul spacing="normal"> | |||
| and/or after a configuration change request.</t> | <li>A DOTS client can systematically send a GET message before | |||
| and/or after a configuration change request.</li> | ||||
| <t>a DOTS client can re-establish the disconnected DOTS session | <li>A DOTS client can reestablish the disconnected DOTS session | |||
| after an attack is mitigated and sends a GET message before a | after an attack is mitigated. Then, it sends a GET message before a | |||
| configuration change request.</t> | configuration change request. </li> | |||
| </list></t> | </ul> | |||
| <t>NAT considerations for the DOTS data channel are similar to those | <t>NAT considerations for the DOTS data channel are similar to those | |||
| discussed in Section 3 of <xref | discussed in <xref target="RFC8782" section="3" sectionFormat="of" forma | |||
| target="I-D.ietf-dots-signal-channel"></xref>.</t> | t="default"/>.</t> | |||
| <t>The translation of filtering rules instantiated on a DOTS server | ||||
| <t>How filtering rules that are instantiated on a DOTS server are | into network configuration actions is out of scope of this | |||
| translated into network configurations actions is out of scope of this | ||||
| specification.</t> | specification.</t> | |||
| <t>Some of the fields introduced in <xref target="YANG" format="default" | ||||
| <t>Some of the fields introduced in <xref target="YANG"></xref> are | /> are | |||
| also discussed in Sections <xref format="counter" | also discussed in Sections <xref format="counter" target="registering"/> | |||
| target="registering"></xref>, <xref format="counter" | , | |||
| target="identifier"></xref>, and <xref format="counter" | <xref format="counter" target="identifier"/>, and <xref format="counter" | |||
| target="filter"></xref>. These sections are authoritative for these | target="filter"/>. | |||
| fields.</t> | These sections are authoritative for these fields.</t> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="DOTS Server(s) Discovery"> | <name>DOTS Server(s) Discovery</name> | |||
| <t>This document assumes that DOTS clients are provisioned with a way | <t>This document assumes that DOTS clients are provisioned with the | |||
| to know how to reach their DOTS server(s), which could occur by a | knowledge of how to reach their DOTS server(s), which could occur by a | |||
| variety of means (e.g., local configuration, or dynamic means such as | variety of means (e.g., local configuration or dynamic means such as | |||
| DHCP <xref target="I-D.ietf-dots-server-discovery"></xref>). The | DHCP <xref target="I-D.ietf-dots-server-discovery" format="default"/>). | |||
| The | ||||
| specification of such means are out of scope of this document.</t> | specification of such means are out of scope of this document.</t> | |||
| <t>Likewise, it is out of scope of this document to specify the | <t>Likewise, it is out of scope of this document to specify the | |||
| behavior to be followed by a DOTS client to send DOTS requests when | behavior to be followed by a DOTS client to send DOTS requests when | |||
| multiple DOTS servers are provisioned (e.g., contact all DOTS servers, | multiple DOTS servers are provisioned (e.g., contact all DOTS servers, | |||
| select one DOTS server among the list).</t> | select one DOTS server among the list).</t> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="DOTS Gateways"> | <name>DOTS Gateways</name> | |||
| <t>When a server-domain DOTS gateway is involved in DOTS data channel | <t>When a server-domain DOTS gateway is involved in DOTS data channel | |||
| exchanges, the same considerations for manipulating the 'cdid' (client | exchanges, the same considerations for manipulating the 'cdid' (client | |||
| domain identifier) parameter specified in <xref | domain identifier) parameter specified in <xref target="RFC8782" format= | |||
| target="I-D.ietf-dots-signal-channel"></xref> MUST be followed by DOTS | "default"/> <bcp14>MUST</bcp14> be followed by DOTS | |||
| agents. As a reminder, 'cdid' is meant to assist the DOTS server to | agents. As a reminder, 'cdid' is meant to assist the DOTS server in | |||
| enforce some policies (e.g., limit the number of filtering rules per | enforcing some policies (e.g., limit the number of filtering rules per | |||
| DOTS client or per DOTS client domain). A loop detect mechanism for | DOTS client or per DOTS client domain). A loop detection mechanism for | |||
| DOTS gateways is specified in <xref target="loops"></xref>.</t> | DOTS gateways is specified in <xref target="loops" format="default"/>.</ | |||
| t> | ||||
| <t>If a DOTS gateway is involved, the DOTS gateway verifies that the | <t>If a DOTS gateway is involved, the DOTS gateway verifies that the | |||
| DOTS client is authorized to undertake a data channel action (e.g., | DOTS client is authorized to undertake a data channel action (e.g., | |||
| instantiate filtering rules). If the DOTS client is authorized, it | instantiate filtering rules). If the DOTS client is authorized, it | |||
| propagates the rules to the upstream DOTS server. Likewise, the DOTS | propagates the rules to the upstream DOTS server. Likewise, the DOTS | |||
| server verifies that the DOTS gateway is authorized to relay data | server verifies that the DOTS gateway is authorized to relay data | |||
| channel actions. For example, to create or purge filters, a DOTS | channel actions. For example, to create or purge filters, a DOTS | |||
| client sends its request to its DOTS gateway. The DOTS gateway | client sends its request to its DOTS gateway. The DOTS gateway | |||
| validates the rules in the request and proxies the requests containing | validates the rules in the request and proxies the requests containing | |||
| the filtering rules to its DOTS server. When the DOTS gateway receives | the filtering rules to its DOTS server. When the DOTS gateway receives | |||
| the associated response from the DOTS server, it propagates the | the associated response from the DOTS server, it propagates the | |||
| response back to the DOTS client.</t> | response back to the DOTS client.</t> | |||
| </section> | </section> | |||
| <section anchor="loops" numbered="true" toc="default"> | ||||
| <section anchor="loops" title="Detect and Prevent Infinite Loops"> | <name>Detecting and Preventing Infinite Loops</name> | |||
| <t>In order to detect and prevent infinite loops, DOTS gateways MUST | <t>In order to detect and prevent infinite loops, DOTS gateways <bcp14>M | |||
| support the procedure defined in Section 5.7.1 of <xref | UST</bcp14> | |||
| target="RFC7230"></xref>. In particular, each intermediate DOTS | support the procedure defined in <xref target="RFC7230" section="5.7.1" | |||
| gateway MUST check that none of its own information (e.g., server | sectionFormat="of" format="default"/>. | |||
| names, literal IP addresses) is present in the "Via" header field of a | In particular, each intermediate DOTS | |||
| DOTS message it receives:<list style="symbols"> | gateway <bcp14>MUST</bcp14> check that none of its own information (e.g. | |||
| <t>If it detects that its own information is present in the "Via" | , server | |||
| header field, the DOTS gateway MUST NOT forward the DOTS message. | names, literal IP addresses) is present in the Via header field of a | |||
| Messages that cannot be forwarded because of a loop SHOULD be | DOTS message it receives:</t> | |||
| logged with a "508 Loop Detected" status-line returned sent back | <ul spacing="normal"> | |||
| <li> | ||||
| <t>If it detects that its own information is present in the Via | ||||
| header field, the DOTS gateway <bcp14>MUST NOT</bcp14> forward the D | ||||
| OTS message. | ||||
| Messages that cannot be forwarded because of a loop <bcp14>SHOULD</b | ||||
| cp14> be | ||||
| logged with a "508 Loop Detected" status-line returned | ||||
| to the DOTS peer. The structure of the reported error is depicted | to the DOTS peer. The structure of the reported error is depicted | |||
| in <xref target="looperr"></xref>.<vspace blankLines="1" /><figure | in <xref target="looperr" format="default"/>.</t> | |||
| align="center" anchor="looperr" title="Loop Detected Error"> | <figure anchor="looperr"> | |||
| <artwork><![CDATA[error-app-tag: loop-detected | <name>Loop Detected Error</name> | |||
| <sourcecode type=""><![CDATA[ | ||||
| error-app-tag: loop-detected | ||||
| error-tag: operation-failed | error-tag: operation-failed | |||
| error-type: transport, application | error-type: transport, application | |||
| error-info: <via-header> : A copy of the Via header field when | error-info: <via-header> : A copy of the Via header field when | |||
| the loop was detected. | the loop was detected. | |||
| Description: An infinite loop has been detected when forwarding | Description: An infinite loop has been detected when forwarding | |||
| a requests via a proxy. | a requests via a proxy. | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure><vspace blankLines="1" />It is RECOMMENDED that DOTS | </figure> | |||
| <t>It is <bcp14>RECOMMENDED</bcp14> that DOTS | ||||
| clients and gateways support methods to alert administrators about | clients and gateways support methods to alert administrators about | |||
| loop errors so that appropriate actions are undertaken.</t> | loop errors so that appropriate actions are undertaken.</t> | |||
| </li> | ||||
| <t>Otherwise, the DOTS agent MUST update or insert the "Via" | <li>Otherwise, the DOTS agent <bcp14>MUST</bcp14> update or insert the | |||
| header by appending its own information.</t> | Via | |||
| </list></t> | header field by appending its own information.</li> | |||
| </ul> | ||||
| <t>Unless configured otherwise, DOTS gateways at the boundaries of a | <t>Unless configured otherwise, DOTS gateways at the boundaries of a | |||
| DOTS client domain SHOULD remove the previous "Via" header field | DOTS client domain <bcp14>SHOULD</bcp14> remove the previous Via header field | |||
| information after checking for a loop before forwarding. This behavior | information after checking for a loop before forwarding. This behavior | |||
| is required for topology hiding purposes but can also serve to | is required for topology hiding purposes but can also serve to | |||
| minimize potential conflicts that may arise if overlapping information | minimize potential conflicts that may arise if overlapping information | |||
| is used in distinct DOTS domains (e.g., private IPv4 addresses, non | is used in distinct DOTS domains (e.g., private IPv4 addresses, | |||
| globally unique aliases).</t> | aliases that are not globally unique).</t> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Stale Entries"> | <name>Preventing Stale Entries</name> | |||
| <t>In order to avoid stale entries, a lifetime is associated with | <t>In order to avoid stale entries, a lifetime is associated with | |||
| alias and filtering entries created by DOTS clients. Also, DOTS | alias and filtering entries created by DOTS clients. Also, DOTS | |||
| servers may track the inactivity timeout of DOTS clients to detect | servers may track the inactivity timeout of DOTS clients to detect | |||
| stale entries.</t> | stale entries.</t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="YANG" numbered="true" toc="default"> | ||||
| <name>DOTS Data Channel YANG Module</name> | ||||
| <section anchor="tree" numbered="true" toc="default"> | ||||
| <section anchor="YANG" title="DOTS Data Channel YANG Module"> | <name>Generic Tree Structure</name> | |||
| <section anchor="tree" title="Generic Tree Structure"> | <t>The DOTS data channel YANG module 'ietf-dots-data-channel' provides | |||
| <t>The DOTS data channel YANG module (ietf-dots-data-channel) provides | ||||
| a method for DOTS clients to manage aliases for resources for which | a method for DOTS clients to manage aliases for resources for which | |||
| mitigation may be requested. Such aliases may be used in subsequent | mitigation may be requested. Such aliases may be used in subsequent | |||
| DOTS signal channel exchanges to refer more efficiently to the | DOTS signal channel exchanges to refer more efficiently to the | |||
| resources under attack.</t> | resources under attack.</t> | |||
| <t>Note that the full module's tree has been split across several | <t>Note that the full module's tree has been split across several | |||
| figures to aid the exposition of the various sub-trees.</t> | figures to aid the exposition of the various subtrees.</t> | |||
| <t>The tree structure for the DOTS alias is depicted in <xref target="ta | ||||
| <t>The tree structure for the DOTS alias is depicted in <xref | lias" format="default"/>.</t> | |||
| target="talias"></xref>.</t> | <figure anchor="talias"> | |||
| <name>DOTS Alias Subtree</name> | ||||
| <t><figure align="center" anchor="talias" title="DOTS Alias Subtree"> | <sourcecode type="yangtree"><![CDATA[ | |||
| <artwork><![CDATA[module: ietf-dots-data-channel | module: ietf-dots-data-channel | |||
| +--rw dots-data | +--rw dots-data | |||
| +--rw dots-client* [cuid] | +--rw dots-client* [cuid] | |||
| | +--rw cuid string | | +--rw cuid string | |||
| | +--rw cdid? string | | +--rw cdid? string | |||
| | +--rw aliases | | +--rw aliases | |||
| | | +--rw alias* [name] | | | +--rw alias* [name] | |||
| | | +--rw name string | | | +--rw name string | |||
| | | +--rw target-prefix* inet:ip-prefix | | | +--rw target-prefix* inet:ip-prefix | |||
| | | +--rw target-port-range* [lower-port] | | | +--rw target-port-range* [lower-port] | |||
| | | | +--rw lower-port inet:port-number | | | | +--rw lower-port inet:port-number | |||
| | | | +--rw upper-port? inet:port-number | | | | +--rw upper-port? inet:port-number | |||
| | | +--rw target-protocol* uint8 | | | +--rw target-protocol* uint8 | |||
| | | +--rw target-fqdn* inet:domain-name | | | +--rw target-fqdn* inet:domain-name | |||
| | | +--rw target-uri* inet:uri | | | +--rw target-uri* inet:uri | |||
| | | +--ro pending-lifetime? int32 | | | +--ro pending-lifetime? int32 | |||
| | +--rw acls | | +--rw acls | |||
| | ... | | ... | |||
| +--ro capabilities | +--ro capabilities | |||
| ... | ... | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure></t> | </figure> | |||
| <t>Also, the 'ietf-dots-data-channel' YANG module provides a method for | ||||
| <t>Also, the 'ietf-dots-data-channel' module provides a method for | ||||
| DOTS clients to manage filtering rules. Examples of filtering | DOTS clients to manage filtering rules. Examples of filtering | |||
| management in a DOTS context include, but not limited to:</t> | management in a DOTS context include, but are not limited to:</t> | |||
| <ul spacing="normal"> | ||||
| <t><list style="symbols"> | <li>Drop-list management, which enables a DOTS client to inform a | |||
| <t>Drop-list management, which enables a DOTS client to inform a | ||||
| DOTS server about sources from which traffic should be | DOTS server about sources from which traffic should be | |||
| discarded.</t> | discarded.</li> | |||
| <li>Accept-list management, which enables a DOTS client to inform a | ||||
| <t>Accept-list management, which enables a DOTS client to inform a | ||||
| DOTS server about sources from which traffic should always be | DOTS server about sources from which traffic should always be | |||
| accepted.</t> | accepted.</li> | |||
| <li>Policy management, which enables a DOTS client to request the | ||||
| <t>Policy management, which enables a DOTS client to request the | installation or withdrawal of traffic filters, the dropping or | |||
| installation or withdrawal of traffic filters, dropping or | rate-limiting of unwanted traffic, and the allowance of accept-liste | |||
| rate-limiting unwanted traffic and permitting accept-listed | d | |||
| traffic.</t> | traffic.</li> | |||
| </list></t> | </ul> | |||
| <t>The tree structure for the DOTS filtering entries is depicted in | <t>The tree structure for the DOTS filtering entries is depicted in | |||
| <xref target="tacl"></xref>.</t> | <xref target="tacl" format="default"/>.</t> | |||
| <t>Investigations into the prospect of augmenting | <t>Investigations into the prospect of augmenting | |||
| 'ietf-access-control-list' to meet DOTS requirements concluded that | 'ietf-access-control-list' to meet DOTS requirements concluded that | |||
| such a design approach did not support many of the DOTS requirements, | such a design approach did not support many of the DOTS requirements, | |||
| e.g.,</t> | for example:</t> | |||
| <ul spacing="normal"> | ||||
| <t><list style="symbols"> | <li>Retrieve a filtering entry (or all entries) created by a DOTS | |||
| <t>Retrieve a filtering entry (or all entries) created by a DOTS | client.</li> | |||
| client.</t> | <li>Delete a filtering entry that was instantiated by a DOTS | |||
| client.</li> | ||||
| <t>Delete a filtering entry that was instantiated by a DOTS | </ul> | |||
| client.</t> | <t>Accordingly, new DOTS filtering entries (i.e., ACL) are defined that | |||
| </list></t> | mimic the structure specified in | |||
| <xref target="RFC8519" format="default"/>. Concretely, DOTS agents are a | ||||
| <t>Accordingly, new DOTS filtering entries (i.e., Access Control List | ssumed to | |||
| (ACL)) are defined that mimic the structure specified in <xref | ||||
| target="RFC8519"></xref>. Concretely, DOTS agents are assumed to | ||||
| manipulate an ordered list of ACLs; each ACL contains a separately | manipulate an ordered list of ACLs; each ACL contains a separately | |||
| ordered list of Access Control Entries (ACEs). Each ACE has a group of | ordered list of ACEs. Each ACE has a group of | |||
| match and a group of action criteria.</t> | match and a group of action criteria.</t> | |||
| <t>Once all of the ACE entries have been iterated though with no match, | ||||
| <t>Once all the ACE entries have been iterated though with no match, | then all of the following ACL's ACE entries are iterated through until | |||
| then all the following ACL's ACE entries are iterated through until | the first match, at which point the specified action is applied. If | |||
| the first match at which point the specified action is applied. If | ||||
| there is no match during 'idle' time (i.e., no mitigation is active), | there is no match during 'idle' time (i.e., no mitigation is active), | |||
| then there is no further action to be taken against the packet. If | then there is no further action to be taken against the packet. If | |||
| there is no match during active mitigation, then the packet will still | there is no match during active mitigation, then the packet will still | |||
| be scrubbed by the DDoS mitigator.</t> | be scrubbed by the DDoS mitigator.</t> | |||
| <figure anchor="tacl"> | ||||
| <t><figure align="center" anchor="tacl" title="DOTS ACLs Subtree"> | <name>DOTS ACLs Subtree</name> | |||
| <artwork><![CDATA[module: ietf-dots-data-channel | <sourcecode type="yangtree"><![CDATA[ | |||
| +--rw dots-data | module: ietf-dots-data-channel | |||
| +--rw dots-client* [cuid] | +--rw dots-data | |||
| | +--rw cuid string | +--rw dots-client* [cuid] | |||
| | +--rw cdid? string | | +--rw cuid string | |||
| | +--rw aliases | | +--rw cdid? string | |||
| | | ... | | +--rw aliases | |||
| | +--rw acls | | | ... | |||
| | +--rw acl* [name] | | +--rw acls | |||
| | +--rw name string | | +--rw acl* [name] | |||
| | +--rw type? ietf-acl:acl-type | | +--rw name string | |||
| | +--rw activation-type? activation-type | | +--rw type? ietf-acl:acl-type | |||
| | +--ro pending-lifetime? int32 | | +--rw activation-type? activation-type | |||
| | +--rw aces | | +--ro pending-lifetime? int32 | |||
| | +--rw ace* [name] | | +--rw aces | |||
| | +--rw name string | | +--rw ace* [name] | |||
| | +--rw matches | | +--rw name string | |||
| | | +--rw (l3)? | | +--rw matches | |||
| | | | +--:(ipv4) | | | +--rw (l3)? | |||
| | | | | ... | | | | +--:(ipv4) | |||
| | | | +--:(ipv6) | | | | | ... | |||
| | | | ... | | | | +--:(ipv6) | |||
| | | +--rw (l4)? | | | | ... | |||
| | | +--:(tcp) | | | +--rw (l4)? | |||
| | | | ... | | | +--:(tcp) | |||
| | | +--:(udp) | | | | ... | |||
| | | | ... | | | +--:(udp) | |||
| | | +--:(icmp) | | | | ... | |||
| | | ... | | | +--:(icmp) | |||
| | +--rw actions | | | ... | |||
| | | +--rw forwarding identityref | | +--rw actions | |||
| | | +--rw rate-limit? decimal64 | | | +--rw forwarding identityref | |||
| | +--ro statistics | | | +--rw rate-limit? decimal64 | |||
| | +--ro matched-packets? yang:counter64 | | +--ro statistics | |||
| | +--ro matched-octets? yang:counter64 | | +--ro matched-packets? yang:counter64 | |||
| +--ro capabilities | | +--ro matched-octets? yang:counter64 | |||
| ... | +--ro capabilities | |||
| ]]></artwork> | ... | |||
| </figure></t> | ]]></sourcecode> | |||
| </figure> | ||||
| <t>Filtering rules instructed by a DOTS client assumes a default | <t>Filtering rules instructed by a DOTS client assume a default | |||
| direction: the destination is the DOTS client domain.</t> | direction: the destination is the DOTS client domain.</t> | |||
| <t>DOTS forwarding actions can be 'accept' (i.e., accept matching | <t>DOTS forwarding actions can be 'accept' (i.e., accept matching | |||
| traffic) or 'drop' (i.e., drop matching traffic without sending any | traffic) or 'drop' (i.e., drop matching traffic without sending any | |||
| ICMP error message). Accepted traffic can be subject to rate-limiting | ICMP error message). Accepted traffic can be subject to rate-limiting | |||
| 'rate-limit'. Note that 'reject' action (i.e., drop matching traffic | 'rate-limit'. Note that 'reject' action (i.e., drop matching traffic | |||
| and send an ICMP error message to the source) is not supported in | and send an ICMP error message to the source) is not supported in | |||
| 'ietf-dots-data-channel' because it is not appropriate in the context | 'ietf-dots-data-channel' because it is not appropriate in the context | |||
| of DDoS mitigation. Generating ICMP messages to notify drops when | of DDoS mitigation. Generating ICMP messages to notify of drops when | |||
| mitigating a DDoS attack will exacerbate the DDoS attack. Furthermore, | mitigating a DDoS attack will exacerbate the DDoS attack. Furthermore, | |||
| these ICMP messages will be used by an attacker as an explicit signal | these ICMP messages will be used by an attacker as an explicit signal | |||
| that the traffic is being blocked.</t> | that the traffic is being blocked.</t> | |||
| </section> | </section> | |||
| <section anchor="filf" numbered="true" toc="default"> | ||||
| <section anchor="filf" title="Filtering Fields"> | <name>Filtering Fields</name> | |||
| <t>The 'ietf-dots-data-channel' module reuses the packet fields module | <t>The 'ietf-dots-data-channel' module reuses the packet fields module | |||
| 'ietf-packet-fields' <xref target="RFC8519"></xref> which defines | 'ietf-packet-fields' <xref target="RFC8519" format="default"/>, which de fines | |||
| matching on fields in the packet including IPv4, IPv6, and transport | matching on fields in the packet including IPv4, IPv6, and transport | |||
| layer fields. The 'ietf-dots-data-channel' module can be augmented, | layer fields. The 'ietf-dots-data-channel' module can be augmented, | |||
| for example, to support additional protocol-specific matching | for example, to support additional protocol-specific matching | |||
| fields.</t> | fields.</t> | |||
| <t>This specification defines a new IPv4/IPv6 matching field called | <t>This specification defines a new IPv4/IPv6 matching field called | |||
| 'fragment' to efficiently handle fragment-related filtering rules. | 'fragment' to efficiently handle fragment-related filtering rules. | |||
| Indeed, <xref target="RFC8519"></xref> does not support such | Indeed, <xref target="RFC8519" format="default"/> does not support such | |||
| capability for IPv6 but offers a partial support for IPv4 by means of | capability for IPv6 but offers a partial support for IPv4 by means of | |||
| 'flags'. Nevertheless, the use of 'flags' is problematic since it does | 'flags'. Nevertheless, the use of 'flags' is problematic since it does | |||
| not allow to define a bitmask. For example, setting other bits not | not allow a bitmask to be defined. For example, setting other bits not | |||
| covered by the 'flags' filtering clause in a packet will allow that | covered by the 'flags' filtering clause in a packet will allow that | |||
| packet to get through (because it won't match the ACE). Sample | packet to get through (because it won't match the ACE). | |||
| examples to illustrate how 'fragment' can be used are provided in | Examples to illustrate how 'fragment' can be used are provided in | |||
| <xref target="frag"></xref>.</t> | <xref target="frag" format="default"/>.</t> | |||
| <t><xref target="tipv4" format="default"/> shows the IPv4 match subtree. | ||||
| <t><xref target="tipv4"></xref> shows the IPv4 match subtree.</t> | </t> | |||
| <figure anchor="tipv4"> | ||||
| <t><figure align="center" anchor="tipv4" | <name>DOTS ACLs Subtree (IPv4 Match)</name> | |||
| title="DOTS ACLs Subtree (IPv4 Match)"> | <sourcecode type="yangtree"><![CDATA[ | |||
| <artwork><![CDATA[ module: ietf-dots-data-channel | module: ietf-dots-data-channel | |||
| +--rw dots-data | +--rw dots-data | |||
| +--rw dots-client* [cuid] | +--rw dots-client* [cuid] | |||
| | ... | | ... | |||
| | +--rw acls | | +--rw acls | |||
| | +--rw acl* [name] | | +--rw acl* [name] | |||
| | ... | | ... | |||
| | +--rw aces | | +--rw aces | |||
| | +--rw ace* [name] | | +--rw ace* [name] | |||
| | +--rw name string | | +--rw name string | |||
| | +--rw matches | | +--rw matches | |||
| | | +--rw (l3)? | | | +--rw (l3)? | |||
| | | | +--:(ipv4) | | | | +--:(ipv4) | |||
| | | | | +--rw ipv4 | | | | | +--rw ipv4 | |||
| | | | | +--rw dscp? inet:dscp | | | | | +--rw dscp? inet:dscp | |||
| | | | | +--rw ecn? uint8 | | | | | +--rw ecn? uint8 | |||
| | | | | +--rw length? uint16 | | | | | +--rw length? uint16 | |||
| | | | | +--rw ttl? uint8 | | | | | +--rw ttl? uint8 | |||
| | | | | +--rw protocol? uint8 | | | | | +--rw protocol? uint8 | |||
| | | | | +--rw ihl? uint8 | | | | | +--rw ihl? uint8 | |||
| | | | | +--rw flags? bits | | | | | +--rw flags? bits | |||
| | | | | +--rw offset? uint16 | | | | | +--rw offset? uint16 | |||
| | | | | +--rw identification? uint16 | | | | | +--rw identification? uint16 | |||
| | | | | +--rw (destination-network)? | | | | | +--rw (destination-network)? | |||
| | | | | | +--:(destination-ipv4-network) | | | | | | +--:(destination-ipv4-network) | |||
| | | | | | +--rw destination-ipv4-network? | | | | | | +--rw destination-ipv4-network? | |||
| | | | | | inet:ipv4-prefix | | | | | | inet:ipv4-prefix | |||
| | | | | +--rw (source-network)? | | | | | +--rw (source-network)? | |||
| | | | | | +--:(source-ipv4-network) | | | | | | +--:(source-ipv4-network) | |||
| | | | | | +--rw source-ipv4-network? | | | | | | +--rw source-ipv4-network? | |||
| | | | | | inet:ipv4-prefix | | | | | | inet:ipv4-prefix | |||
| | | | | +--rw fragment | | | | | +--rw fragment | |||
| | | | | +--rw operator? operator | | | | | +--rw operator? operator | |||
| | | | | +--rw type fragment-type | | | | | +--rw type fragment-type | |||
| | | | +--:(ipv6) | | | | +--:(ipv6) | |||
| | | | ... | | | | ... | |||
| | | +--rw (l4)? | | | +--rw (l4)? | |||
| | | ... | | | ... | |||
| | +--rw actions | | +--rw actions | |||
| | | ... | | | ... | |||
| | +--ro statistics | | +--ro statistics | |||
| | ... | | ... | |||
| +--ro capabilities | +--ro capabilities | |||
| ... | ... | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure></t> | </figure> | |||
| <t><xref target="tipv6" format="default"/> shows the IPv6 match subtree. | ||||
| <t><xref target="tipv6"></xref> shows the IPv6 match subtree.</t> | </t> | |||
| <figure anchor="tipv6"> | ||||
| <t><figure align="center" anchor="tipv6" | <name>DOTS ACLs Subtree (IPv6 Match)</name> | |||
| title="DOTS ACLs Subtree (IPv6 Match)"> | <sourcecode type="yangtree"><![CDATA[ | |||
| <artwork><![CDATA[ module: ietf-dots-data-channel | module: ietf-dots-data-channel | |||
| +--rw dots-data | +--rw dots-data | |||
| +--rw dots-client* [cuid] | +--rw dots-client* [cuid] | |||
| | ... | | ... | |||
| | +--rw acls | | +--rw acls | |||
| | +--rw acl* [name] | | +--rw acl* [name] | |||
| | ... | | ... | |||
| | +--rw aces | | +--rw aces | |||
| | +--rw ace* [name] | | +--rw ace* [name] | |||
| | +--rw name string | | +--rw name string | |||
| | +--rw matches | | +--rw matches | |||
| | | +--rw (l3)? | | | +--rw (l3)? | |||
| | | | +--:(ipv4) | | | | +--:(ipv4) | |||
| | | | | ... | | | | | ... | |||
| | | | +--:(ipv6) | | | | +--:(ipv6) | |||
| | | | +--rw ipv6 | | | | +--rw ipv6 | |||
| | | | +--rw dscp? inet:dscp | | | | +--rw dscp? inet:dscp | |||
| | | | +--rw ecn? uint8 | | | | +--rw ecn? uint8 | |||
| | | | +--rw length? uint16 | | | | +--rw length? uint16 | |||
| | | | +--rw ttl? uint8 | | | | +--rw ttl? uint8 | |||
| | | | +--rw protocol? uint8 | | | | +--rw protocol? uint8 | |||
| | | | +--rw (destination-network)? | | | | +--rw (destination-network)? | |||
| | | | | +--:(destination-ipv6-network) | | | | | +--:(destination-ipv6-network) | |||
| | | | | +--rw destination-ipv6-network? | | | | | +--rw destination-ipv6-network? | |||
| | | | | inet:ipv6-prefix | | | | | inet:ipv6-prefix | |||
| | | | +--rw (source-network)? | | | | +--rw (source-network)? | |||
| | | | | +--:(source-ipv6-network) | | | | | +--:(source-ipv6-network) | |||
| | | | | +--rw source-ipv6-network? | | | | | +--rw source-ipv6-network? | |||
| | | | | inet:ipv6-prefix | | | | | inet:ipv6-prefix | |||
| | | | +--rw flow-label? | | | | +--rw flow-label? | |||
| | | | | inet:ipv6-flow-label | | | | | inet:ipv6-flow-label | |||
| | | | +--rw fragment | | | | +--rw fragment | |||
| | | | +--rw operator? operator | | | | +--rw operator? operator | |||
| | | | +--rw type fragment-type | | | | +--rw type fragment-type | |||
| | | +--rw (l4)? | | | +--rw (l4)? | |||
| | | ... | | | ... | |||
| | +--rw actions | | +--rw actions | |||
| | | ... | | | ... | |||
| | +--ro statistics | | +--ro statistics | |||
| | ... | | ... | |||
| +--ro capabilities | +--ro capabilities | |||
| ... | ... | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure></t> | </figure> | |||
| <t><xref target="ttcp"></xref> shows the TCP match subtree. In | <t><xref target="ttcp" format="default"/> shows the TCP match subtree. I | |||
| addition to the fields defined in <xref target="RFC8519"></xref>, this | n | |||
| addition to the fields defined in <xref target="RFC8519" format="default | ||||
| "/>, this | ||||
| specification defines a new TCP matching field, called | specification defines a new TCP matching field, called | |||
| 'flags-bitmask', to efficiently handle TCP flags filtering rules. Some | 'flags-bitmask', to efficiently handle TCP flags filtering rules. Some | |||
| examples are provided in <xref target="flags"></xref>.</t> | examples are provided in <xref target="flags" format="default"/>.</t> | |||
| <figure anchor="ttcp"> | ||||
| <t><figure align="center" anchor="ttcp" | <name>DOTS ACLs Subtree (TCP Match)</name> | |||
| title="DOTS ACLs Subtree (TCP Match)"> | ||||
| <artwork><![CDATA[module: ietf-dots-data-channel | ||||
| +--rw dots-data | ||||
| +-rw dots-client* [cuid] | ||||
| | ... | ||||
| | +-rw acls | ||||
| | +-rw acl* [name] | ||||
| | ... | ||||
| | +-rw aces | ||||
| | +-rw ace* [name] | ||||
| | +-rw name string | ||||
| | +-rw matches | ||||
| | | +-rw (l3)? | ||||
| | | | ... | ||||
| | | +-rw (l4)? | ||||
| | | +-:(tcp) | ||||
| | | | +-rw tcp | ||||
| | | | +--rw sequence-number? uint32 | ||||
| | | | +--rw acknowledgement-number? uint32 | ||||
| | | | +--rw data-offset? uint8 | ||||
| | | | +--rw reserved? uint8 | ||||
| | | | +--rw flags? bits | ||||
| | | | +--rw window-size? uint16 | ||||
| | | | +--rw urgent-pointer? uint16 | ||||
| | | | +--rw options? binary | ||||
| | | | +--rw flags-bitmask | ||||
| | | | | +--rw operator? operator | ||||
| | | | | +--rw bitmask uint16 | ||||
| | | | +--rw (source-port)? | ||||
| | | | | +--:(source-port-range-or-operator) | ||||
| | | | | +--rw source-port-range-or-operator | ||||
| | | | | +--rw (port-range-or-operator)? | ||||
| | | | | +--:(range) | ||||
| | | | | | +--rw lower-port | ||||
| | | | | | | inet:port-number | ||||
| | | | | | +--rw upper-port | ||||
| | | | | | inet:port-number | ||||
| | | | | +--:(operator) | ||||
| | | | | +--rw operator? | ||||
| | | | | | operator | ||||
| | | | | +--rw port | ||||
| | | | | inet:port-number | ||||
| | | | +--rw (destination-port)? | ||||
| | | | +--:(destination-port-range-or-operator) | ||||
| | | | +--rw destination-port-range-or-operator | ||||
| | | | +--rw (port-range-or-operator)? | ||||
| | | | +--:(range) | ||||
| | | | | +--rw lower-port | ||||
| | | | | | inet:port-number | ||||
| | | | | +--rw upper-port | ||||
| | | | | inet:port-number | ||||
| | | | +--:(operator) | ||||
| | | | +--rw operator? | ||||
| | | | | operator | ||||
| | | | +--rw port | ||||
| | | | inet:port-number | ||||
| | | +-:(udp) | ||||
| | | | ... | ||||
| | | +-:(icmp) | ||||
| | | ... | ||||
| | +-rw actions | ||||
| | | ... | ||||
| | +-ro statistics | ||||
| | ... | ||||
| +-ro capabilities | ||||
| ... | ||||
| ]]></artwork> | ||||
| </figure></t> | ||||
| <t><xref target="ttransport"></xref> shows the UDP and ICMP match | <sourcecode type="yangtree"><![CDATA[ | |||
| +--rw matches | ||||
| | +--rw (l3)? | ||||
| | | ... | ||||
| | +--rw (l4)? | ||||
| | +--:(tcp) | ||||
| | | +--rw tcp | ||||
| | | +--rw sequence-number? uint32 | ||||
| | | +--rw acknowledgement-number? uint32 | ||||
| | | +--rw data-offset? uint8 | ||||
| | | +--rw reserved? uint8 | ||||
| | | +--rw flags? bits | ||||
| | | +--rw window-size? uint16 | ||||
| | | +--rw urgent-pointer? uint16 | ||||
| | | +--rw options? binary | ||||
| | | +--rw flags-bitmask | ||||
| | | | +--rw operator? operator | ||||
| | | | +--rw bitmask uint16 | ||||
| | | +--rw (source-port)? | ||||
| | | | +--:(source-port-range-or-operator) | ||||
| | | | +--rw source-port-range-or-operator | ||||
| | | | +--rw (port-range-or-operator)? | ||||
| | | | +--:(range) | ||||
| | | | | +--rw lower-port | ||||
| | | | | | inet:port-number | ||||
| | | | | +--rw upper-port | ||||
| | | | | inet:port-number | ||||
| | | | +--:(operator) | ||||
| | | | +--rw operator? | ||||
| | | | | operator | ||||
| | | | +--rw port | ||||
| | | | inet:port-number | ||||
| | | +--rw (destination-port)? | ||||
| | | +--:(destination-port-range-or-operator) | ||||
| | | +--rw destination-port-range-or-operator | ||||
| | | +--rw (port-range-or-operator)? | ||||
| | | +--:(range) | ||||
| | | | +--rw lower-port | ||||
| | | | | inet:port-number | ||||
| | | | +--rw upper-port | ||||
| | | | inet:port-number | ||||
| | | +--:(operator) | ||||
| | | +--rw operator? | ||||
| | | | operator | ||||
| | | +--rw port | ||||
| | | inet:port-number | ||||
| | +--:(udp) | ||||
| | | ... | ||||
| | +--:(icmp) | ||||
| | ... | ||||
| +--rw actions | ||||
| | ... | ||||
| ]]></sourcecode> | ||||
| </figure> | ||||
| <t><xref target="ttransport" format="default"/> shows the UDP and ICMP m | ||||
| atch | ||||
| subtrees. The same structure is used for both ICMP and ICMPv6. The | subtrees. The same structure is used for both ICMP and ICMPv6. The | |||
| indication whether an ACL is about ICMP or ICMPv6 is governed by the | indication whether an ACL is about ICMP or ICMPv6 is governed by the | |||
| 'l3' match or the ACL type.</t> | 'l3' match or the ACL type.</t> | |||
| <figure anchor="ttransport"> | ||||
| <name>DOTS ACLs Subtree (UDP and ICMP Match)</name> | ||||
| <t><figure align="center" anchor="ttransport" | <sourcecode type="yangtree"><![CDATA[ | |||
| title="DOTS ACLs Subtree (UDP and ICMP Match)"> | +--rw matches | |||
| <artwork><![CDATA[module: ietf-dots-data-channel | | +--rw (l3)? | |||
| +-rw dots-data | | | ... | |||
| +-rw dots-client* [cuid] | | +--rw (l4)? | |||
| | ... | | +--:(tcp) | |||
| | +-rw acls | | | ... | |||
| | +-rw acl* [name] | | +--:(udp) | |||
| | ... | | | +--rw udp | |||
| | +-rw aces | | | +--rw length? uint16 | |||
| | +-rw ace* [name] | | | +--rw (source-port)? | |||
| | +--rw name string | | | | +--:(source-port-range-or-operator) | |||
| | +--rw matches | | | | +--rw source-port-range-or-operator | |||
| | | +--rw (l3)? | | | | +--rw (port-range-or-operator)? | |||
| | | | ... | | | | +--:(range) | |||
| | | +--rw (l4)? | | | | | +--rw lower-port | |||
| | | +--:(tcp) | | | | | | inet:port-number | |||
| | | | ... | | | | | +--rw upper-port | |||
| | | +--:(udp) | | | | | inet:port-number | |||
| | | | +--rw udp | | | | +--:(operator) | |||
| | | | +--rw length? uint16 | | | | +--rw operator? | |||
| | | | +--rw (source-port)? | | | | | operator | |||
| | | | | +--:(source-port-range-or-operator) | | | | +--rw port | |||
| | | | | +--rw source-port-range-or-operator | | | | inet:port-number | |||
| | | | | +--rw (port-range-or-operator)? | | | +--rw (destination-port)? | |||
| | | | | +--:(range) | | | +--:(destination-port-range-or-operator) | |||
| | | | | | +--rw lower-port | | | +--rw destination-port-range-or-operator | |||
| | | | | | | inet:port-number | | | +--rw (port-range-or-operator)? | |||
| | | | | | +--rw upper-port | | | +--:(range) | |||
| | | | | | inet:port-number | | | | +--rw lower-port | |||
| | | | | +--:(operator) | | | | | inet:port-number | |||
| | | | | +--rw operator? | | | | +--rw upper-port | |||
| | | | | | operator | | | | inet:port-number | |||
| | | | | +--rw port | | | +--:(operator) | |||
| | | | | inet:port-number | | | +--rw operator? | |||
| | | | +--rw (destination-port)? | | | | operator | |||
| | | | +--:(destination-port-range-or-operator) | | | +--rw port | |||
| | | | +--rw destination-port-range-or-operator | | | inet:port-number | |||
| | | | +--rw (port-range-or-operator)? | | +--:(icmp) | |||
| | | | +--:(range) | | +--rw icmp | |||
| | | | | +--rw lower-port | | +--rw type? uint8 | |||
| | | | | | inet:port-number | | +--rw code? uint8 | |||
| | | | | +--rw upper-port | | +--rw rest-of-header? binary | |||
| | | | | inet:port-number | +--rw actions | |||
| | | | +--:(operator) | | ... | |||
| | | | +--rw operator? | ]]></sourcecode> | |||
| | | | | operator | </figure> | |||
| | | | +--rw port | <t>DOTS implementations <bcp14>MUST</bcp14> support the following matchi | |||
| | | | inet:port-number | ng | |||
| | | +--:(icmp) | criteria:</t> | |||
| | | +--rw icmp | <ul empty="true" spacing="normal"> | |||
| | | +--rw type? uint8 | <li>Match based on the IP header (IPv4 and IPv6), match based on | |||
| | | +--rw code? uint8 | the transport header (TCP, UDP, and ICMP), and match based | |||
| | | +--rw rest-of-header? binary | on any combination | |||
| | +--rw actions | ||||
| | | ... | ||||
| | +--ro statistics | ||||
| | ... | ||||
| +-ro capabilities | ||||
| ... | ||||
| ]]></artwork> | ||||
| </figure></t> | ||||
| <t>DOTS implementations MUST support the following matching | ||||
| criteria:<list style="empty"> | ||||
| <t>match based on the IP header (IPv4 and IPv6), match based on | ||||
| the transport header (TCP, UDP, and ICMP), and any combination | ||||
| thereof. The same matching fields are used for both ICMP and | thereof. The same matching fields are used for both ICMP and | |||
| ICMPv6.</t> | ICMPv6.</li> | |||
| </list></t> | </ul> | |||
| <t>The following match fields <bcp14>MUST</bcp14> be supported by DOTS | ||||
| <t>The following match fields MUST be supported by DOTS | implementations (<xref target="mf" format="default"/>):</t> | |||
| implementations (<xref target="mf"></xref>):</t> | <table align="center" anchor="mf"> | |||
| <name>Mandatory DOTS Channel Match Fields</name> | ||||
| <texttable align="center" anchor="mf" style="headers" | <thead> | |||
| title="Mandatory DOTS Channel Match Fields"> | <tr> | |||
| <ttcol>ACL Match</ttcol> | <th align="left">ACL Match</th> | |||
| <th align="left">Mandatory Fields</th> | ||||
| <ttcol>Mandatory Fields</ttcol> | </tr> | |||
| </thead> | ||||
| <c>ipv4</c> | <tbody> | |||
| <tr> | ||||
| <c>length, protocol, destination-ipv4-network, source-ipv4-network, | <td align="left">ipv4</td> | |||
| and fragment</c> | <td align="left">length, protocol, destination-ipv4-network, sourc | |||
| e-ipv4-network, | ||||
| <c>ipv6</c> | and fragment</td> | |||
| </tr> | ||||
| <c>length, protocol, destination-ipv6-network, source-ipv6-network, | <tr> | |||
| and fragment</c> | <td align="left">ipv6</td> | |||
| <td align="left">length, protocol, destination-ipv6-network, sourc | ||||
| <c>tcp</c> | e-ipv6-network, | |||
| and fragment</td> | ||||
| <c>flags-bitmask, source-port-range-or-operator, and | </tr> | |||
| destination-port-range-or-operator</c> | <tr> | |||
| <td align="left">tcp</td> | ||||
| <c>udp</c> | <td align="left">flags-bitmask, source-port-range-or-operator, and | |||
| destination-port-range-or-operator</td> | ||||
| <c>length, source-port-range-or-operator, and | </tr> | |||
| destination-port-range-or-operator</c> | <tr> | |||
| <td align="left">udp</td> | ||||
| <c>icmp</c> | <td align="left">length, source-port-range-or-operator, and | |||
| destination-port-range-or-operator</td> | ||||
| <c>type and code</c> | </tr> | |||
| </texttable> | <tr> | |||
| <td align="left">icmp</td> | ||||
| <t>Implementations MAY support other filtering match fields and | <td align="left">type and code</td> | |||
| actions. The 'ietf-dots-data-channel' provides a method for an | </tr> | |||
| </tbody> | ||||
| </table> | ||||
| <t>Implementations <bcp14>MAY</bcp14> support other filtering match fiel | ||||
| ds and | ||||
| actions. The 'ietf-dots-data-channel' YANG module provides a method for | ||||
| an | ||||
| implementation to expose its filtering capabilities. The tree | implementation to expose its filtering capabilities. The tree | |||
| structure of the 'capabilities' is shown in <xref | structure of the 'capabilities' is shown in <xref target="tcap" format=" | |||
| target="tcap"></xref>. DOTS clients that support both 'fragment' and | default"/>. | |||
| 'flags' (or 'flags-bitmask' and 'flags') matching fields MUST NOT set | DOTS clients that support both 'fragment' and | |||
| 'flags' (or 'flags-bitmask' and 'flags') matching fields <bcp14>MUST NOT | ||||
| </bcp14> set | ||||
| these fields in the same request.</t> | these fields in the same request.</t> | |||
| <figure anchor="tcap"> | ||||
| <t><figure anchor="tcap" title="Filtering Capabilities Subtree"> | <name>Filtering Capabilities Subtree</name> | |||
| <artwork align="left"><![CDATA[module: ietf-dots-data-channel | <sourcecode type="yangtree"><![CDATA[ | |||
| +--rw dots-data | module: ietf-dots-data-channel | |||
| ... | +--rw dots-data | |||
| +--ro capabilities | ... | |||
| +--ro address-family* enumeration | +--ro capabilities | |||
| +--ro forwarding-actions* identityref | +--ro address-family* enumeration | |||
| +--ro rate-limit? boolean | +--ro forwarding-actions* identityref | |||
| +--ro transport-protocols* uint8 | +--ro rate-limit? boolean | |||
| +--ro ipv4 | +--ro transport-protocols* uint8 | |||
| | +--ro dscp? boolean | +--ro ipv4 | |||
| | +--ro ecn? boolean | | +--ro dscp? boolean | |||
| | +--ro length? boolean | | +--ro ecn? boolean | |||
| | +--ro ttl? boolean | | +--ro length? boolean | |||
| | +--ro protocol? boolean | | +--ro ttl? boolean | |||
| | +--ro ihl? boolean | | +--ro protocol? boolean | |||
| | +--ro flags? boolean | | +--ro ihl? boolean | |||
| | +--ro offset? boolean | | +--ro flags? boolean | |||
| | +--ro identification? boolean | | +--ro offset? boolean | |||
| | +--ro source-prefix? boolean | | +--ro identification? boolean | |||
| | +--ro destination-prefix? boolean | | +--ro source-prefix? boolean | |||
| | +--ro fragment? boolean | | +--ro destination-prefix? boolean | |||
| +--ro ipv6 | | +--ro fragment? boolean | |||
| | +--ro dscp? boolean | +--ro ipv6 | |||
| | +--ro ecn? boolean | | +--ro dscp? boolean | |||
| | +--ro length? boolean | | +--ro ecn? boolean | |||
| | +--ro hoplimit? boolean | | +--ro length? boolean | |||
| | +--ro protocol? boolean | | +--ro hoplimit? boolean | |||
| | +--ro destination-prefix? boolean | | +--ro protocol? boolean | |||
| | +--ro source-prefix? boolean | | +--ro destination-prefix? boolean | |||
| | +--ro flow-label? boolean | | +--ro source-prefix? boolean | |||
| | +--ro fragment? boolean | | +--ro flow-label? boolean | |||
| +--ro tcp | | +--ro fragment? boolean | |||
| | +--ro sequence-number? boolean | +--ro tcp | |||
| | +--ro acknowledgement-number? boolean | | +--ro sequence-number? boolean | |||
| | +--ro data-offset? boolean | | +--ro acknowledgement-number? boolean | |||
| | +--ro reserved? boolean | | +--ro data-offset? boolean | |||
| | +--ro flags? boolean | | +--ro reserved? boolean | |||
| | +--ro window-size? boolean | | +--ro flags? boolean | |||
| | +--ro urgent-pointer? boolean | | +--ro window-size? boolean | |||
| | +--ro options? boolean | | +--ro urgent-pointer? boolean | |||
| | +--ro flags-bitmask? boolean | | +--ro options? boolean | |||
| | +--ro source-port? boolean | | +--ro flags-bitmask? boolean | |||
| | +--ro destination-port? boolean | | +--ro source-port? boolean | |||
| | +--ro port-range? boolean | | +--ro destination-port? boolean | |||
| +--ro udp | | +--ro port-range? boolean | |||
| | +--ro length? boolean | +--ro udp | |||
| | +--ro source-port? boolean | | +--ro length? boolean | |||
| | +--ro destination-port? boolean | | +--ro source-port? boolean | |||
| | +--ro port-range? boolean | | +--ro destination-port? boolean | |||
| +--ro icmp | | +--ro port-range? boolean | |||
| +--ro type? boolean | +--ro icmp | |||
| +--ro code? boolean | +--ro type? boolean | |||
| +--ro rest-of-header? boolean | +--ro code? boolean | |||
| ]]></artwork> | +--ro rest-of-header? boolean | |||
| </figure></t> | ]]></sourcecode> | |||
| </figure> | ||||
| <t></t> | <t/> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <name>YANG Module</name> | ||||
| <t>This module uses the common YANG types defined in <xref target="RFC69 | ||||
| 91" format="default"/> and types defined in <xref target="RFC8519" format="defau | ||||
| lt"/>. </t> | ||||
| <section title="YANG Module"> | <sourcecode name="ietf-dots-data-channel@2020-05-28.yang" type="yang" ma | |||
| <t>This module uses the common YANG types defined in <xref | rkers="true"><![CDATA[ | |||
| target="RFC6991"></xref> and types defined in <xref | ||||
| target="RFC8519"></xref>. <figure> | ||||
| <artwork><![CDATA[<CODE BEGINS> file "ietf-dots-data-channel@2019-05 | ||||
| -09.yang" | ||||
| module ietf-dots-data-channel { | module ietf-dots-data-channel { | |||
| yang-version 1.1; | yang-version 1.1; | |||
| namespace "urn:ietf:params:xml:ns:yang:ietf-dots-data-channel"; | namespace "urn:ietf:params:xml:ns:yang:ietf-dots-data-channel"; | |||
| prefix data-channel; | prefix data-channel; | |||
| import ietf-inet-types { | import ietf-inet-types { | |||
| prefix inet; | prefix inet; | |||
| reference "Section 4 of RFC 6991"; | reference | |||
| "Section 4 of RFC 6991"; | ||||
| } | } | |||
| import ietf-access-control-list { | import ietf-access-control-list { | |||
| prefix ietf-acl; | prefix ietf-acl; | |||
| reference | reference | |||
| "RFC 8519: YANG Data Model for Network Access | "RFC 8519: YANG Data Model for Network Access | |||
| Control Lists (ACLs)"; | Control Lists (ACLs)"; | |||
| } | } | |||
| import ietf-packet-fields { | import ietf-packet-fields { | |||
| prefix packet-fields; | prefix packet-fields; | |||
| reference | reference | |||
| skipping to change at line 1001 ¶ | skipping to change at line 904 ¶ | |||
| organization | organization | |||
| "IETF DDoS Open Threat Signaling (DOTS) Working Group"; | "IETF DDoS Open Threat Signaling (DOTS) Working Group"; | |||
| contact | contact | |||
| "WG Web: <https://datatracker.ietf.org/wg/dots/> | "WG Web: <https://datatracker.ietf.org/wg/dots/> | |||
| WG List: <mailto:dots@ietf.org> | WG List: <mailto:dots@ietf.org> | |||
| Editor: Mohamed Boucadair | Editor: Mohamed Boucadair | |||
| <mailto:mohamed.boucadair@orange.com> | <mailto:mohamed.boucadair@orange.com> | |||
| Editor: Konda, Tirumaleswar Reddy | Editor: Konda, Tirumaleswar Reddy.K | |||
| <mailto:TirumaleswarReddy_Konda@McAfee.com> | <mailto:TirumaleswarReddy_Konda@McAfee.com> | |||
| Author: Jon Shallow | Author: Jon Shallow | |||
| <mailto:jon.shallow@nccgroup.com> | <mailto:jon.shallow@nccgroup.com> | |||
| Author: Kaname Nishizuka | Author: Kaname Nishizuka | |||
| <mailto:kaname@nttv6.jp> | <mailto:kaname@nttv6.jp> | |||
| Author: Liang Xia | Author: Liang Xia | |||
| <mailto:frank.xialiang@huawei.com> | <mailto:frank.xialiang@huawei.com> | |||
| Author: Prashanth Patil | Author: Prashanth Patil | |||
| <mailto:praspati@cisco.com> | <mailto:praspati@cisco.com> | |||
| Author: Andrew Mortensen | Author: Andrew Mortensen | |||
| <mailto:amortensen@arbor.net> | <mailto:amortensen@arbor.net> | |||
| Author: Nik Teague | Author: Nik Teague | |||
| <mailto:nteague@verisign.com>"; | <mailto:nteague@ironmountain.co.uk>"; | |||
| description | description | |||
| "This module contains YANG definition for configuring | "This module contains YANG definition for configuring | |||
| aliases for resources and filtering rules using DOTS | aliases for resources and filtering rules using DOTS | |||
| data channel. | data channel. | |||
| Copyright (c) 2019 IETF Trust and the persons identified as | Copyright (c) 2020 IETF Trust and the persons identified as | |||
| authors of the code. All rights reserved. | authors of the code. All rights reserved. | |||
| Redistribution and use in source and binary forms, with or | Redistribution and use in source and binary forms, with or | |||
| without modification, is permitted pursuant to, and subject | without modification, is permitted pursuant to, and subject | |||
| to the license terms contained in, the Simplified BSD License | to the license terms contained in, the Simplified BSD License | |||
| set forth in Section 4.c of the IETF Trust's Legal Provisions | set forth in Section 4.c of the IETF Trust's Legal Provisions | |||
| Relating to IETF Documents | Relating to IETF Documents | |||
| (http://trustee.ietf.org/license-info). | (http://trustee.ietf.org/license-info). | |||
| This version of this YANG module is part of RFC XXXX; see | This version of this YANG module is part of RFC 8783; see | |||
| the RFC itself for full legal notices."; | the RFC itself for full legal notices."; | |||
| revision 2019-05-09 { | revision 2020-05-28 { | |||
| description | description | |||
| "Initial revision."; | "Initial revision."; | |||
| reference | reference | |||
| "RFC XXXX: Distributed Denial-of-Service Open Threat | "RFC 8783: Distributed Denial-of-Service Open Threat | |||
| Signaling (DOTS) Data Channel Specification"; | Signaling (DOTS) Data Channel Specification"; | |||
| } | } | |||
| typedef activation-type { | typedef activation-type { | |||
| type enumeration { | type enumeration { | |||
| enum "activate-when-mitigating" { | enum activate-when-mitigating { | |||
| value 1; | value 1; | |||
| description | description | |||
| "The Access Control List (ACL) is installed only when | "The Access Control List (ACL) is installed only when | |||
| a mitigation is active for the DOTS client."; | a mitigation is active for the DOTS client."; | |||
| } | } | |||
| enum "immediate" { | enum immediate { | |||
| value 2; | value 2; | |||
| description | description | |||
| "The ACL is immediately activated."; | "The ACL is immediately activated."; | |||
| } | } | |||
| enum "deactivate" { | enum deactivate { | |||
| value 3; | value 3; | |||
| description | description | |||
| "The ACL is maintained by the DOTS server, but it is | "The ACL is maintained by the DOTS server, but it is | |||
| deactivated."; | deactivated."; | |||
| } | } | |||
| } | } | |||
| description | description | |||
| "Indicates the activation type of an ACL."; | "Indicates the activation type of an ACL."; | |||
| } | } | |||
| typedef operator { | typedef operator { | |||
| type bits { | type bits { | |||
| bit not { | bit not { | |||
| position 0; | position 0; | |||
| description | description | |||
| "If set, logical negation of operation."; | "If set, logical negation of operation."; | |||
| } | } | |||
| bit match { | bit match { | |||
| position 1; | position 1; | |||
| description | description | |||
| "Match bit. This is a bitwise match operation | "Match bit. This is a bitwise match operation | |||
| defined as '(data & value) == value'."; | defined as '(data & value) == value'."; | |||
| } | } | |||
| bit any { | bit any { | |||
| position 3; | position 3; | |||
| description | description | |||
| "Any bit. This is a match on any of the bits in | "Any bit. This is a match on any of the bits in | |||
| bitmask. It evaluates to 'true' if any of the bits | bitmask. It evaluates to 'true' if any of the bits | |||
| in the value mask are set in the data, | in the value mask are set in the data, | |||
| i.e., '(data & value) != 0'."; | i.e., '(data & value) != 0'."; | |||
| } | } | |||
| } | } | |||
| description | description | |||
| "Specifies how to apply the defined bitmask."; | "Specifies how to apply the defined bitmask. | |||
| 'any' and 'match' bits must not be set simultaneously."; | ||||
| } | } | |||
| grouping tcp-flags { | grouping tcp-flags { | |||
| leaf operator { | leaf operator { | |||
| type operator; | type operator; | |||
| default "match"; | default "match"; | |||
| description | description | |||
| "Specifies how to interpret the TCP flags."; | "Specifies how to interpret the TCP flags."; | |||
| } | } | |||
| leaf bitmask { | leaf bitmask { | |||
| type uint16; | type uint16; | |||
| mandatory true; | mandatory true; | |||
| description | description | |||
| "The bitmask matches the last 4 bits of byte 12 | "The bitmask matches the last 4 bits of byte 12 | |||
| and byte 13 of the TCP header. For clarity, the 4 bits | and byte 13 of the TCP header. For clarity, the 4 bits | |||
| of byte 12 corresponding to the TCP data offset field | of byte 12 corresponding to the TCP data offset field | |||
| are not included in any matching."; | are not included in any matching."; | |||
| } | } | |||
| description | description | |||
| "Operations on TCP flags."; | "Operations on TCP flags."; | |||
| } | } | |||
| typedef fragment-type { | typedef fragment-type { | |||
| type bits { | type bits { | |||
| bit df { | bit df { | |||
| skipping to change at line 1156 ¶ | skipping to change at line 1060 ¶ | |||
| description | description | |||
| "Specifies the targets of the mitigation request."; | "Specifies the targets of the mitigation request."; | |||
| leaf-list target-prefix { | leaf-list target-prefix { | |||
| type inet:ip-prefix; | type inet:ip-prefix; | |||
| description | description | |||
| "IPv4 or IPv6 prefix identifying the target."; | "IPv4 or IPv6 prefix identifying the target."; | |||
| } | } | |||
| list target-port-range { | list target-port-range { | |||
| key "lower-port"; | key "lower-port"; | |||
| description | description | |||
| "Port range. When only lower-port is | "Port range. When only lower-port is | |||
| present, it represents a single port number."; | present, it represents a single port number."; | |||
| leaf lower-port { | leaf lower-port { | |||
| type inet:port-number; | type inet:port-number; | |||
| mandatory true; | mandatory true; | |||
| description | description | |||
| "Lower port number of the port range."; | "Lower port number of the port range."; | |||
| } | } | |||
| leaf upper-port { | leaf upper-port { | |||
| type inet:port-number; | type inet:port-number; | |||
| must '. >= ../lower-port' { | must '. >= ../lower-port' { | |||
| error-message | error-message | |||
| "The upper port number must be greater than | "The upper-port number must be greater than | |||
| or equal to the lower-port number."; | or equal to the lower-port number."; | |||
| } | } | |||
| description | description | |||
| "Upper port number of the port range."; | "Upper port number of the port range."; | |||
| } | } | |||
| } | } | |||
| leaf-list target-protocol { | leaf-list target-protocol { | |||
| type uint8; | type uint8; | |||
| description | description | |||
| "Identifies the target protocol number. | "Identifies the target protocol number. | |||
| Values are taken from the IANA protocol registry: | Values are taken from the IANA protocol registry: | |||
| https://www.iana.org/assignments/protocol-numbers/ | https://www.iana.org/assignments/protocol-numbers/ | |||
| protocol-numbers.xhtml | ||||
| For example, 6 for TCP or 17 for UDP."; | For example, 6 for TCP or 17 for UDP."; | |||
| } | } | |||
| leaf-list target-fqdn { | leaf-list target-fqdn { | |||
| type inet:domain-name; | type inet:domain-name; | |||
| description | description | |||
| "FQDN identifying the target."; | "FQDN identifying the target."; | |||
| } | } | |||
| leaf-list target-uri { | leaf-list target-uri { | |||
| type inet:uri; | type inet:uri; | |||
| skipping to change at line 1217 ¶ | skipping to change at line 1120 ¶ | |||
| mandatory true; | mandatory true; | |||
| description | description | |||
| "Indicates what fragment type to look for."; | "Indicates what fragment type to look for."; | |||
| } | } | |||
| description | description | |||
| "Operations on fragment types."; | "Operations on fragment types."; | |||
| } | } | |||
| grouping aliases { | grouping aliases { | |||
| description | description | |||
| "Top level container for aliases."; | "Top-level container for aliases."; | |||
| list alias { | list alias { | |||
| key "name"; | key "name"; | |||
| description | description | |||
| "List of aliases."; | "List of aliases."; | |||
| leaf name { | leaf name { | |||
| type string; | type string; | |||
| description | description | |||
| "The name of the alias."; | "The name of the alias."; | |||
| } | } | |||
| uses target; | uses target; | |||
| skipping to change at line 1272 ¶ | skipping to change at line 1175 ¶ | |||
| } | } | |||
| grouping access-lists { | grouping access-lists { | |||
| description | description | |||
| "Specifies the ordered set of Access Control Lists."; | "Specifies the ordered set of Access Control Lists."; | |||
| list acl { | list acl { | |||
| key "name"; | key "name"; | |||
| ordered-by user; | ordered-by user; | |||
| description | description | |||
| "An ACL is an ordered list of Access Control Entries (ACE). | "An ACL is an ordered list of Access Control Entries (ACE). | |||
| Each ACE has a list of match criteria and a list of actions."; | Each ACE has a list of match criteria and a list of | |||
| actions."; | ||||
| leaf name { | leaf name { | |||
| type string { | type string { | |||
| length "1..64"; | length "1..64"; | |||
| } | } | |||
| description | description | |||
| "The name of the access list."; | "The name of the access list."; | |||
| reference | reference | |||
| "RFC 8519: YANG Data Model for Network Access | "RFC 8519: YANG Data Model for Network Access | |||
| Control Lists (ACLs)"; | Control Lists (ACLs)"; | |||
| } | } | |||
| leaf type { | leaf type { | |||
| type ietf-acl:acl-type; | type ietf-acl:acl-type; | |||
| description | description | |||
| "Type of access control list. Indicates the primary intended | "Type of access control list. Indicates the primary | |||
| type of match criteria (e.g., IPv4, IPv6) used in the list | intended type of match criteria (e.g., IPv4, IPv6) | |||
| instance."; | used in the list instance."; | |||
| reference | reference | |||
| "RFC 8519: YANG Data Model for Network Access | "RFC 8519: YANG Data Model for Network Access | |||
| Control Lists (ACLs)"; | Control Lists (ACLs)"; | |||
| } | } | |||
| leaf activation-type { | leaf activation-type { | |||
| type activation-type; | type activation-type; | |||
| default "activate-when-mitigating"; | default "activate-when-mitigating"; | |||
| description | description | |||
| "Indicates the activation type of an ACL. An ACL can be | "Indicates the activation type of an ACL. An ACL can be | |||
| deactivated, installed immediately, or installed when | deactivated, installed immediately, or installed when | |||
| a mitigation is active."; | a mitigation is active."; | |||
| } | } | |||
| leaf pending-lifetime { | leaf pending-lifetime { | |||
| type int32; | type int32; | |||
| units "minutes"; | units "minutes"; | |||
| config false; | config false; | |||
| description | description | |||
| "Indicates the pending validity lifetime of the ACL | "Indicates the pending validity lifetime of the ACL | |||
| entry."; | entry."; | |||
| skipping to change at line 1450 ¶ | skipping to change at line 1354 ¶ | |||
| list dots-client { | list dots-client { | |||
| key "cuid"; | key "cuid"; | |||
| description | description | |||
| "List of DOTS clients."; | "List of DOTS clients."; | |||
| leaf cuid { | leaf cuid { | |||
| type string; | type string; | |||
| description | description | |||
| "A unique identifier that is generated by a DOTS client | "A unique identifier that is generated by a DOTS client | |||
| to prevent request collisions."; | to prevent request collisions."; | |||
| reference | reference | |||
| "RFC YYYY: Distributed Denial-of-Service Open Threat | "RFC 8782: Distributed Denial-of-Service Open Threat | |||
| Signaling (DOTS) Signal Channel Specification"; | Signaling (DOTS) Signal Channel Specification"; | |||
| } | } | |||
| leaf cdid { | leaf cdid { | |||
| type string; | type string; | |||
| description | description | |||
| "A client domain identifier conveyed by a | "A client domain identifier conveyed by a | |||
| server-domain DOTS gateway to a remote DOTS server."; | server-domain DOTS gateway to a remote DOTS server."; | |||
| reference | reference | |||
| "RFC YYYY: Distributed Denial-of-Service Open Threat | "RFC 8782: Distributed Denial-of-Service Open Threat | |||
| Signaling (DOTS) Signal Channel Specification"; | Signaling (DOTS) Signal Channel Specification"; | |||
| } | } | |||
| container aliases { | container aliases { | |||
| description | description | |||
| "Set of aliases that are bound to a DOTS client."; | "Set of aliases that are bound to a DOTS client."; | |||
| uses aliases; | uses aliases; | |||
| } | } | |||
| container acls { | container acls { | |||
| description | description | |||
| "Access lists that are bound to a DOTS client."; | "Access lists that are bound to a DOTS client."; | |||
| uses access-lists; | uses access-lists; | |||
| } | } | |||
| } | } | |||
| container capabilities { | container capabilities { | |||
| config false; | config false; | |||
| description | description | |||
| "Match capabilities"; | "Match capabilities"; | |||
| leaf-list address-family { | leaf-list address-family { | |||
| type enumeration { | type enumeration { | |||
| enum "ipv4" { | enum ipv4 { | |||
| description | description | |||
| "IPv4 is supported."; | "IPv4 is supported."; | |||
| } | } | |||
| enum "ipv6" { | enum ipv6 { | |||
| description | description | |||
| "IPv6 is supported."; | "IPv6 is supported."; | |||
| } | } | |||
| } | } | |||
| description | description | |||
| "Indicates the IP address families supported by | "Indicates the IP address families supported by | |||
| the DOTS server."; | the DOTS server."; | |||
| } | } | |||
| leaf-list forwarding-actions { | leaf-list forwarding-actions { | |||
| type identityref { | type identityref { | |||
| skipping to change at line 1511 ¶ | skipping to change at line 1415 ¶ | |||
| description | description | |||
| "Support of rate-limit action."; | "Support of rate-limit action."; | |||
| } | } | |||
| leaf-list transport-protocols { | leaf-list transport-protocols { | |||
| type uint8; | type uint8; | |||
| description | description | |||
| "Upper-layer protocol associated with a filtering rule. | "Upper-layer protocol associated with a filtering rule. | |||
| Values are taken from the IANA protocol registry: | Values are taken from the IANA protocol registry: | |||
| https://www.iana.org/assignments/protocol-numbers/ | https://www.iana.org/assignments/protocol-numbers/ | |||
| protocol-numbers.xhtml | ||||
| For example, this field contains 1 for ICMP, 6 for TCP | For example, this field contains 1 for ICMP, 6 for TCP | |||
| 17 for UDP, or 58 for ICMPv6."; | 17 for UDP, or 58 for ICMPv6."; | |||
| } | } | |||
| container ipv4 { | container ipv4 { | |||
| description | description | |||
| "Indicates IPv4 header fields that are supported to enforce | "Indicates IPv4 header fields that are supported to enforce | |||
| ACLs."; | ACLs."; | |||
| leaf dscp { | leaf dscp { | |||
| type boolean; | type boolean; | |||
| description | description | |||
| "Support of filtering based on Differentiated Services Code | "Support of filtering based on Differentiated Services | |||
| Point (DSCP)."; | Code Point (DSCP)."; | |||
| } | } | |||
| leaf ecn { | leaf ecn { | |||
| type boolean; | type boolean; | |||
| description | description | |||
| "Support of filtering based on Explicit Congestion | "Support of filtering based on Explicit Congestion | |||
| Notification (ECN)."; | Notification (ECN)."; | |||
| } | } | |||
| leaf length { | leaf length { | |||
| type boolean; | type boolean; | |||
| description | description | |||
| skipping to change at line 1582 ¶ | skipping to change at line 1485 ¶ | |||
| } | } | |||
| leaf destination-prefix { | leaf destination-prefix { | |||
| type boolean; | type boolean; | |||
| description | description | |||
| "Support of filtering based on the destination prefix."; | "Support of filtering based on the destination prefix."; | |||
| } | } | |||
| leaf fragment { | leaf fragment { | |||
| type boolean; | type boolean; | |||
| description | description | |||
| "Indicates the capability of a DOTS server to | "Indicates the capability of a DOTS server to | |||
| enforce filters on IPv4 fragments. That is, the match | enforce filters on IPv4 fragments. That is, the match | |||
| functionality based on the Layer 3 'fragment' clause | functionality based on the Layer 3 'fragment' clause | |||
| is supported."; | is supported."; | |||
| } | } | |||
| } | } | |||
| container ipv6 { | container ipv6 { | |||
| description | description | |||
| "Indicates IPv6 header fields that are supported to enforce | "Indicates IPv6 header fields that are supported to enforce | |||
| ACLs."; | ACLs."; | |||
| leaf dscp { | leaf dscp { | |||
| type boolean; | type boolean; | |||
| skipping to change at line 1629 ¶ | skipping to change at line 1532 ¶ | |||
| "Support of filtering based on the destination prefix."; | "Support of filtering based on the destination prefix."; | |||
| } | } | |||
| leaf source-prefix { | leaf source-prefix { | |||
| type boolean; | type boolean; | |||
| description | description | |||
| "Support of filtering based on the source prefix."; | "Support of filtering based on the source prefix."; | |||
| } | } | |||
| leaf flow-label { | leaf flow-label { | |||
| type boolean; | type boolean; | |||
| description | description | |||
| "Support of filtering based on the Flow label."; | "Support of filtering based on the Flow Label."; | |||
| } | } | |||
| leaf fragment { | leaf fragment { | |||
| type boolean; | type boolean; | |||
| description | description | |||
| "Indicates the capability of a DOTS server to | "Indicates the capability of a DOTS server to | |||
| enforce filters on IPv6 fragments."; | enforce filters on IPv6 fragments."; | |||
| } | } | |||
| } | } | |||
| container tcp { | container tcp { | |||
| description | description | |||
| skipping to change at line 1706 ¶ | skipping to change at line 1609 ¶ | |||
| description | description | |||
| "Support of filtering based on the destination port | "Support of filtering based on the destination port | |||
| number."; | number."; | |||
| } | } | |||
| leaf port-range { | leaf port-range { | |||
| type boolean; | type boolean; | |||
| description | description | |||
| "Support of filtering based on a port range. | "Support of filtering based on a port range. | |||
| This includes filtering based on a source port range, | This includes filtering based on a source port range, | |||
| destination port range, or both. All operators | destination port range, or both. All operators | |||
| (i.e, less than or equal to, greater than or equal to, | (i.e, less than or equal to, greater than or equal to, | |||
| equal to, and not equal to) are supported."; | equal to, and not equal to) are supported. | |||
| In particular, this means that the implementation | ||||
| supports filtering based on | ||||
| source-port-range-or-operator and | ||||
| destination-port-range-or-operator."; | ||||
| } | } | |||
| } | } | |||
| container udp { | container udp { | |||
| description | description | |||
| "Set of UDP fields that are supported by the DOTS server | "Set of UDP fields that are supported by the DOTS server | |||
| to enforce filters."; | to enforce filters."; | |||
| leaf length { | leaf length { | |||
| type boolean; | type boolean; | |||
| description | description | |||
| "Support of filtering based on the UDP length."; | "Support of filtering based on the UDP length."; | |||
| skipping to change at line 1737 ¶ | skipping to change at line 1645 ¶ | |||
| description | description | |||
| "Support of filtering based on the destination port | "Support of filtering based on the destination port | |||
| number."; | number."; | |||
| } | } | |||
| leaf port-range { | leaf port-range { | |||
| type boolean; | type boolean; | |||
| description | description | |||
| "Support of filtering based on a port range. | "Support of filtering based on a port range. | |||
| This includes filtering based on a source port range, | This includes filtering based on a source port range, | |||
| destination port range, or both. All operators | destination port range, or both. All operators | |||
| (i.e, less than or equal, greater than or equal, equal to, | (i.e, less than or equal, greater than or equal, | |||
| and not equal to) are supported."; | equal to, and not equal to) are supported. | |||
| In particular, this means that the implementation | ||||
| supports filtering based on | ||||
| source-port-range-or-operator and | ||||
| destination-port-range-or-operator."; | ||||
| } | } | |||
| } | } | |||
| container icmp { | container icmp { | |||
| description | description | |||
| "Set of ICMP/ICMPv6 fields that are supported by the DOTS | "Set of ICMP/ICMPv6 fields that are supported by the DOTS | |||
| server to enforce filters."; | server to enforce filters."; | |||
| leaf type { | leaf type { | |||
| type boolean; | type boolean; | |||
| description | description | |||
| "Support of filtering based on the ICMP/ICMPv6 type."; | "Support of filtering based on the ICMP/ICMPv6 type."; | |||
| } | } | |||
| leaf code { | leaf code { | |||
| type boolean; | type boolean; | |||
| description | description | |||
| "Support of filtering based on the ICMP/ICMPv6 code."; | "Support of filtering based on the ICMP/ICMPv6 code."; | |||
| } | } | |||
| leaf rest-of-header { | leaf rest-of-header { | |||
| type boolean; | type boolean; | |||
| description | description | |||
| "Support of filtering based on the ICMP four-bytes | "Support of filtering based on the ICMP four-byte | |||
| field / the ICMPv6 message body."; | field / the ICMPv6 message body."; | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| <CODE ENDS> | ]]></sourcecode> | |||
| ]]></artwork> | ||||
| </figure></t> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="registering" numbered="true" toc="default"> | ||||
| <section anchor="registering" title="Managing DOTS Clients"> | <name>Managing DOTS Clients</name> | |||
| <section anchor="registe" title="Registering DOTS Clients"> | <section anchor="registe" numbered="true" toc="default"> | |||
| <t>In order to make use of DOTS data channel, a DOTS client MUST | <name>Registering DOTS Clients</name> | |||
| register to its DOTS server(s) by creating a DOTS client | <t>In order to make use of the DOTS data channel, a DOTS client <bcp14>M | |||
| ('dots-client') resource. To that aim, DOTS clients SHOULD send a POST | UST</bcp14> | |||
| request (shown in <xref target="register"></xref>).</t> | register with its DOTS server(s) by creating a DOTS client | |||
| ('dots-client') resource. To that aim, DOTS clients <bcp14>SHOULD</bcp14 | ||||
| <t><figure anchor="register" title="POST to Register Schema"> | > send a POST | |||
| <artwork align="left"><![CDATA[ POST /restconf/data/ietf-dots-data-c | request (shown in <xref target="register" format="default"/>).</t> | |||
| hannel:dots-data HTTP/1.1 | <figure anchor="register"> | |||
| <name>POST to Register Schema</name> | ||||
| <sourcecode type=""><![CDATA[ | ||||
| POST /restconf/data/ietf-dots-data-channel:dots-data HTTP/1.1 | ||||
| Host: {host}:{port} | Host: {host}:{port} | |||
| Content-Type: application/yang-data+json | Content-Type: application/yang-data+json | |||
| { | { | |||
| "ietf-dots-data-channel:dots-client": [ | "ietf-dots-data-channel:dots-client": [ | |||
| { | { | |||
| "cuid": "string" | "cuid": "string" | |||
| } | } | |||
| ] | ] | |||
| }]]></artwork> | }]]></sourcecode> | |||
| </figure></t> | </figure> | |||
| <t>The 'cuid' (client unique identifier) parameter is described | <t>The 'cuid' (client unique identifier) parameter is described | |||
| below:<list style="hanging"> | below:</t> | |||
| <t hangText="cuid:">A globally unique identifier that is meant to | <dl newline="false" spacing="normal"> | |||
| <dt>cuid:</dt> | ||||
| <dd> | ||||
| <t>A globally unique identifier that is meant to | ||||
| prevent collisions among DOTS clients. This attribute has the same | prevent collisions among DOTS clients. This attribute has the same | |||
| meaning, syntax, and processing rules as the 'cuid' attribute | meaning, syntax, and processing rules as the 'cuid' attribute | |||
| defined in <xref | defined in <xref target="RFC8782" format="default"/>.</t> | |||
| target="I-D.ietf-dots-signal-channel"></xref>.<vspace | <t>DOTS clients <bcp14>MUST</bcp14> use the same 'cuid' for both | |||
| blankLines="1" />DOTS clients MUST use the same 'cuid' for both | signal and data channels.</t> | |||
| signal and data channels.<vspace blankLines="1" />This is a | <t>This is a | |||
| mandatory attribute.</t> | mandatory attribute.</t> | |||
| </list></t> | </dd> | |||
| </dl> | ||||
| <t>In deployments where server-domain DOTS gateways are enabled, | <t>In deployments where server-domain DOTS gateways are enabled, | |||
| identity information about the origin source client domain SHOULD be | identity information about the origin source client domain <bcp14>SHOULD </bcp14> be | |||
| supplied to the DOTS server. That information is meant to assist the | supplied to the DOTS server. That information is meant to assist the | |||
| DOTS server to enforce some policies. These policies can be enforced | DOTS server to enforce some policies. These policies can be enforced | |||
| per-client, per-client domain, or both. <xref | per client, per client domain, or both. <xref target="register-relayed" | |||
| target="register-relayed"></xref> shows a schema example of a request | format="default"/> | |||
| relayed by a server-domain DOTS gateway.<figure | shows a schema of a register request relayed by a server-domain DOTS | |||
| anchor="register-relayed" | gateway.</t> | |||
| title="POST to Register Schema (via a Server-Domain DOTS Gateway)"> | <figure anchor="register-relayed"> | |||
| <artwork align="left"><![CDATA[ POST /restconf/data/ietf-dots-data-c | <name>POST to Register Schema (via a Server-Domain DOTS Gateway)</name | |||
| hannel:dots-data HTTP/1.1 | > | |||
| <sourcecode type=""><![CDATA[ | ||||
| POST /restconf/data/ietf-dots-data-channel:dots-data HTTP/1.1 | ||||
| Host: {host}:{port} | Host: {host}:{port} | |||
| Content-Type: application/yang-data+json | Content-Type: application/yang-data+json | |||
| { | { | |||
| "ietf-dots-data-channel:dots-client": [ | "ietf-dots-data-channel:dots-client": [ | |||
| { | { | |||
| "cuid": "string", | "cuid": "string", | |||
| "cdid": "string" | "cdid": "string" | |||
| } | } | |||
| ] | ] | |||
| }]]></artwork> | } | |||
| </figure>A server-domain DOTS gateway SHOULD add the following | ]]></sourcecode> | |||
| </figure> | ||||
| <t>A server-domain DOTS gateway <bcp14>SHOULD</bcp14> add the following | ||||
| attribute:</t> | attribute:</t> | |||
| <dl newline="false" spacing="normal"> | ||||
| <t><list style="hanging"> | <dt>cdid:</dt> | |||
| <t hangText="cdid:">This attribute has the same meaning, syntax, | <dd> | |||
| and processing rules as the 'cdid' attribute defined in <xref | <t>This attribute has the same meaning, syntax, | |||
| target="I-D.ietf-dots-signal-channel"></xref>. <vspace | and processing rules as the 'cdid' attribute defined in | |||
| blankLines="1" /> In deployments where server-domain DOTS gateways | <xref target="RFC8782" format="default"/>. </t> | |||
| <t> In deployments where server-domain DOTS gateways | ||||
| are enabled, 'cdid' does not need to be inserted when relaying | are enabled, 'cdid' does not need to be inserted when relaying | |||
| DOTS methods to manage aliases (<xref target="identifier"></xref>) | DOTS methods to manage aliases (<xref target="identifier" format="de | |||
| or filtering rules (<xref target="filter"></xref>). DOTS servers | fault"/>) | |||
| or filtering rules (<xref target="filter" format="default"/>). DOTS | ||||
| servers | ||||
| are responsible for maintaining the association between 'cdid' and | are responsible for maintaining the association between 'cdid' and | |||
| 'cuid' for policy enforcement purposes.<vspace | 'cuid' for policy enforcement purposes.</t> | |||
| blankLines="1" />This is an optional attribute.</t> | <t>This is an optional attribute.</t> | |||
| </list></t> | </dd> | |||
| </dl> | ||||
| <t>A request example to create a 'dots-client' resource is depicted in | <t>An example request to create a 'dots-client' resource is depicted in | |||
| <xref target="register-example"></xref>. This request is relayed by a | <xref target="register-example" format="default"/>. This request is rela | |||
| yed by a | ||||
| server-domain DOTS gateway as hinted by the presence of the 'cdid' | server-domain DOTS gateway as hinted by the presence of the 'cdid' | |||
| attribute.</t> | attribute.</t> | |||
| <figure anchor="register-example"> | ||||
| <t><figure anchor="register-example" | <name>POST to Register (DOTS gateway)</name> | |||
| title="POST to Register (DOTS gateway)"> | <sourcecode type=""><![CDATA[ | |||
| <artwork align="left"><![CDATA[ POST /restconf/data/ietf-dots-data-c | POST /restconf/data/ietf-dots-data-channel:dots-data HTTP/1.1 | |||
| hannel:dots-data HTTP/1.1 | ||||
| Host: example.com | Host: example.com | |||
| Content-Type: application/yang-data+json | Content-Type: application/yang-data+json | |||
| { | { | |||
| "ietf-dots-data-channel:dots-client": [ | "ietf-dots-data-channel:dots-client": [ | |||
| { | { | |||
| "cuid": "dz6pHjaADkaFTbjr0JGBpw", | "cuid": "dz6pHjaADkaFTbjr0JGBpw", | |||
| "cdid": "7eeaf349529eb55ed50113" | "cdid": "7eeaf349529eb55ed50113" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure></t> | </figure> | |||
| <t>As a reminder, DOTS gateways may rewrite the 'cuid' used by peer | <t>As a reminder, DOTS gateways may rewrite the 'cuid' used by peer | |||
| DOTS clients (Section 4.4.1 of <xref | DOTS clients (<xref target="RFC8782" section="4.4.1" sectionFormat="of" | |||
| target="I-D.ietf-dots-signal-channel"></xref>).</t> | format="default"/>).</t> | |||
| <t>DOTS servers can identify the DOTS client domain using the 'cdid' | <t>DOTS servers can identify the DOTS client domain using the 'cdid' | |||
| parameter or using the client's DNS name specified in the Subject | parameter or using the client's DNS name specified in the Subject | |||
| Alternative Name extension's dNSName type in the client certificate | Alternative Name extension's dNSName type in the client certificate | |||
| <xref target="RFC6125"></xref>.</t> | <xref target="RFC6125" format="default"/>.</t> | |||
| <t>DOTS servers <bcp14>MUST</bcp14> limit the number of 'dots-client' re | ||||
| <t>DOTS servers MUST limit the number of 'dots-client' resources to be | sources to be | |||
| created by the same DOTS client to 1 per request. Requests with | created by the same DOTS client to 1 per request. Requests with | |||
| multiple 'dots-client' resources MUST be rejected by DOTS servers. To | multiple 'dots-client' resources <bcp14>MUST</bcp14> be rejected by DOTS | |||
| that aim, the DOTS server MUST rely on the same procedure to | servers. To | |||
| unambiguously identify a DOTS client as discussed in Section 4.4.1 of | that aim, the DOTS server <bcp14>MUST</bcp14> rely on the same procedure | |||
| <xref target="I-D.ietf-dots-signal-channel"></xref>.</t> | to | |||
| unambiguously identify a DOTS client as discussed in | ||||
| <xref target="RFC8782" section="4.4.1" sectionFormat="of" format="defaul | ||||
| t"/>.</t> | ||||
| <t>The DOTS server indicates the result of processing the POST request | <t>The DOTS server indicates the result of processing the POST request | |||
| using status-line codes. Status codes in the range "2xx" codes are | using status-line codes. Status codes in the "2xx" range are | |||
| success, "4xx" codes are some sort of invalid requests and "5xx" codes | success, "4xx" codes are some sort of invalid requests and "5xx" codes | |||
| are returned if the DOTS server has erred or is incapable of accepting | are returned if the DOTS server has erred or is incapable of accepting | |||
| the creation of the 'dots-client' resource. In particular, <list | the creation of the 'dots-client' resource. In particular, </t> | |||
| style="symbols"> | <ul spacing="normal"> | |||
| <t>"201 Created" status-line is returned in the response, if the | <li>"201 Created" status-line is returned in the response if the | |||
| DOTS server has accepted the request.</t> | DOTS server has accepted the request.</li> | |||
| <li>"400 Bad Request" status-line is returned by the DOTS server | ||||
| <t>"400 Bad Request" status-line is returned by the DOTS server, | ||||
| if the request does not include a 'cuid' parameter. The error-tag | if the request does not include a 'cuid' parameter. The error-tag | |||
| "missing-attribute" is used in this case.</t> | "missing-attribute" is used in this case.</li> | |||
| <li>"409 Conflict" status-line is returned to the requesting DOTS | ||||
| <t>"409 Conflict" status-line is returned to the requesting DOTS | client if the data resource already exists. The error-tag | |||
| client, if the data resource already exists. The error-tag | "resource-denied" is used in this case.</li> | |||
| "resource-denied" is used in this case.</t> | </ul> | |||
| </list></t> | <t>Once a DOTS client registers itself with a DOTS server, it can | |||
| create/delete/retrieve aliases (<xref target="identifier" format="defaul | ||||
| <t>Once a DOTS client registers itself to a DOTS server, it can | t"/>) and | |||
| create/delete/retrieve aliases (<xref target="identifier"></xref>) and | filtering rules (<xref target="filter" format="default"/>).</t> | |||
| filtering rules (<xref target="filter"></xref>).</t> | <t>A DOTS client <bcp14>MAY</bcp14> use the PUT request | |||
| (<xref target="RFC8040" section="4.5" sectionFormat="of" format="default | ||||
| <t>A DOTS client MAY use the PUT request (Section 4.5 in <xref | "/>) | |||
| target="RFC8040"></xref>) to register a DOTS client within the DOTS | to register a DOTS client within the DOTS | |||
| server. An example is shown in <xref target="putregister"></xref>.</t> | server. An example is shown in <xref target="putregister" format="defaul | |||
| t"/>.</t> | ||||
| <t><figure anchor="putregister" title="PUT to Register"> | <figure anchor="putregister"> | |||
| <artwork align="center"><![CDATA[ PUT /restconf/data/ietf-dots-data- | <name>PUT to Register</name> | |||
| channel:dots-data\ | <sourcecode type=""><![CDATA[ | |||
| PUT /restconf/data/ietf-dots-data-channel:dots-data\ | ||||
| /dots-client=dz6pHjaADkaFTbjr0JGBpw HTTP/1.1 | /dots-client=dz6pHjaADkaFTbjr0JGBpw HTTP/1.1 | |||
| Host: example.com | Host: example.com | |||
| Content-Type: application/yang-data+json | Content-Type: application/yang-data+json | |||
| { | { | |||
| "ietf-dots-data-channel:dots-client": [ | "ietf-dots-data-channel:dots-client": [ | |||
| { | { | |||
| "cuid": "dz6pHjaADkaFTbjr0JGBpw" | "cuid": "dz6pHjaADkaFTbjr0JGBpw" | |||
| } | } | |||
| ] | ] | |||
| }]]></artwork> | } | |||
| </figure></t> | ]]></sourcecode> | |||
| </figure> | ||||
| <t>The DOTS gateway that inserted a 'cdid' in a PUT request MUST strip | <t>The DOTS gateway that inserted a 'cdid' in a PUT request <bcp14>MUST< | |||
| /bcp14> strip | ||||
| the 'cdid' parameter in the corresponding response before forwarding | the 'cdid' parameter in the corresponding response before forwarding | |||
| the response to the DOTS client.</t> | the response to the DOTS client.</t> | |||
| </section> | </section> | |||
| <section anchor="unregistering" numbered="true" toc="default"> | ||||
| <section anchor="unregistering" title="Unregistering DOTS Clients"> | <name>De-registering DOTS Clients</name> | |||
| <t>A DOTS client de-registers from its DOTS server(s) by deleting the | <t>A DOTS client de-registers from its DOTS server(s) by deleting the | |||
| 'cuid' resource(s). Resources bound to this DOTS client will be | 'cuid' resource(s). Resources bound to this DOTS client will be | |||
| deleted by the DOTS server. An example of a de-register request is | deleted by the DOTS server. An example of a de-register request is | |||
| shown in <xref target="derigister"></xref>.</t> | shown in <xref target="derigister" format="default"/>.</t> | |||
| <figure anchor="derigister"> | ||||
| <t><figure align="center" anchor="derigister" | <name>De-register a DOTS Client</name> | |||
| title="De-register a DOTS Client"> | <sourcecode type=""><![CDATA[ | |||
| <artwork><![CDATA[ DELETE /restconf/data/ietf-dots-data-channel:dots | DELETE /restconf/data/ietf-dots-data-channel:dots-data\ | |||
| -data\ | ||||
| /dots-client=dz6pHjaADkaFTbjr0JGBpw HTTP/1.1 | /dots-client=dz6pHjaADkaFTbjr0JGBpw HTTP/1.1 | |||
| Host: example.com | Host: example.com | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure></t> | </figure> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="identifier" numbered="true" toc="default"> | ||||
| <section anchor="identifier" title="Managing DOTS Aliases"> | <name>Managing DOTS Aliases</name> | |||
| <t>The following sub-sections define means for a DOTS client to create | <t>The following subsections define the means for a DOTS client to create | |||
| aliases (<xref target="calias"></xref>), retrieve one or a list of | aliases (<xref target="calias" format="default"/>), to retrieve one or a l | |||
| aliases (<xref target="ralias"></xref>), and delete an alias (<xref | ist of | |||
| target="dalias"></xref>).</t> | aliases (<xref target="ralias" format="default"/>), and to delete an alias | |||
| (<xref target="dalias" format="default"/>).</t> | ||||
| <section anchor="calias" title="Create Aliases"> | <section anchor="calias" numbered="true" toc="default"> | |||
| <t>A POST or PUT request is used by a DOTS client to create aliases, | <name>Creating Aliases</name> | |||
| <t>A POST or PUT request is used by a DOTS client to create aliases | ||||
| for resources for which a mitigation may be requested. Such aliases | for resources for which a mitigation may be requested. Such aliases | |||
| may be used in subsequent DOTS signal channel exchanges to refer more | may be used in subsequent DOTS signal channel exchanges to refer more | |||
| efficiently to the resources under attack.</t> | efficiently to the resources under attack.</t> | |||
| <t>DOTS clients within the same domain can create different aliases | <t>DOTS clients within the same domain can create different aliases | |||
| for the same resource.</t> | for the same resource.</t> | |||
| <t>The structure of POST requests used to create aliases is shown in | <t>The structure of POST requests used to create aliases is shown in | |||
| <xref target="createalias"></xref>.</t> | <xref target="createalias" format="default"/>.</t> | |||
| <figure anchor="createalias"> | ||||
| <t><figure anchor="createalias" | <name>POST to Create Aliases (Request Schema)</name> | |||
| title="POST to Create Aliases (Request Schema)"> | <sourcecode type=""><![CDATA[ | |||
| <artwork align="left"><![CDATA[ POST /restconf/data/ietf-dots-data-c | POST /restconf/data/ietf-dots-data-channel:dots-data\ | |||
| hannel:dots-data\ | ||||
| /dots-client=cuid HTTP/1.1 | /dots-client=cuid HTTP/1.1 | |||
| Host: {host}:{port} | Host: {host}:{port} | |||
| Content-Type: application/yang-data+json | Content-Type: application/yang-data+json | |||
| { | { | |||
| "ietf-dots-data-channel:aliases": { | "ietf-dots-data-channel:aliases": { | |||
| "alias": [ | "alias": [ | |||
| { | { | |||
| "name": "string", | "name": "string", | |||
| "target-prefix": [ | "target-prefix": [ | |||
| skipping to change at line 1993 ¶ | skipping to change at line 1902 ¶ | |||
| ], | ], | |||
| "target-fqdn": [ | "target-fqdn": [ | |||
| "string" | "string" | |||
| ], | ], | |||
| "target-uri": [ | "target-uri": [ | |||
| "string" | "string" | |||
| ] | ] | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| }]]></artwork> | } | |||
| </figure></t> | ]]></sourcecode> | |||
| </figure> | ||||
| <t>The parameters are described below:</t> | <t>The parameters are described below:</t> | |||
| <dl newline="false" spacing="normal"> | ||||
| <t><list style="hanging"> | <dt>name:</dt> | |||
| <t hangText="name:">Name of the alias. <vspace | <dd> | |||
| blankLines="1" />This is a mandatory attribute.</t> | <t>Name of the alias. </t> | |||
| <t>This is a mandatory attribute.</t> | ||||
| <t hangText="target-prefix: ">Prefixes are separated by commas. | </dd> | |||
| <dt>target-prefix: </dt> | ||||
| <dd> | ||||
| <t>Prefixes are separated by commas. | ||||
| Prefixes are represented using Classless Inter-domain Routing | Prefixes are represented using Classless Inter-domain Routing | |||
| (CIDR) notation <xref target="RFC4632"></xref>. As a reminder, the | (CIDR) notation <xref target="RFC4632" format="default"/>. As a remi | |||
| prefix length must be less than or equal to 32 (resp. 128) for | nder, the | |||
| IPv4 (resp. IPv6).<vspace blankLines="1" />The prefix list MUST | prefix length must be less than or equal to 32 for | |||
| NOT include broadcast, loopback, or multicast addresses. These | IPv4 or 128 for IPv6.</t> | |||
| <t>The prefix list <bcp14>MUST | ||||
| NOT</bcp14> include broadcast, loopback, or multicast addresses. The | ||||
| se | ||||
| addresses are considered as invalid values. In addition, the DOTS | addresses are considered as invalid values. In addition, the DOTS | |||
| server MUST validate that these prefixes are within the scope of | server <bcp14>MUST</bcp14> validate that these prefixes are within t he scope of | |||
| the DOTS client domain. Other validation checks may be supported | the DOTS client domain. Other validation checks may be supported | |||
| by DOTS servers.<vspace blankLines="1" />This is an optional | by DOTS servers.</t> | |||
| <t>This is an optional | ||||
| attribute.</t> | attribute.</t> | |||
| </dd> | ||||
| <t hangText="target-port-range: ">A range of port numbers. <vspace | <dt>target-port-range: </dt> | |||
| blankLines="1" />The port range is defined by two bounds, a lower | <dd> | |||
| port number (lower-port) and an upper port number (upper-port). | <t>A range of port numbers. </t> | |||
| <t>The port range is defined by two bounds, a lower | ||||
| port number ('lower-port') and an upper port number ('upper-port'). | ||||
| The range is considered to include both the lower and upper | The range is considered to include both the lower and upper | |||
| bounds.<vspace blankLines="1" />When only 'lower-port' is present, | bounds.</t> | |||
| it represents a single port number. <vspace blankLines="1" />For | <t>When only 'lower-port' is present, | |||
| TCP, UDP, Stream Control Transmission Protocol (SCTP) <xref | it represents a single port number. </t> | |||
| target="RFC4960"></xref>, or Datagram Congestion Control Protocol | <t>For TCP, UDP, Stream Control Transmission Protocol (SCTP) <xref t | |||
| (DCCP) <xref target="RFC4340"></xref>, the range of port numbers | arget="RFC4960" format="default"/>, | |||
| can be, for example, 1024-65535. <vspace blankLines="1" />This is | or Datagram Congestion Control Protocol (DCCP) <xref target="RFC4340 | |||
| an optional attribute.</t> | " format="default"/>, | |||
| the range of port numbers can be, for example, 1024-65535. </t> | ||||
| <t hangText="target-protocol: ">A list of protocols. Values are | <t>This is an optional attribute.</t> | |||
| taken from the IANA protocol registry <xref | </dd> | |||
| target="proto_numbers"></xref>. <vspace blankLines="1" />If | <dt>target-protocol: </dt> | |||
| <dd> | ||||
| <t>A list of protocols. Values are | ||||
| taken from the IANA protocol registry <xref target="IANA-PROTO" form | ||||
| at="default"/>. </t> | ||||
| <t>If | ||||
| 'target-protocol' is not specified, then the request applies to | 'target-protocol' is not specified, then the request applies to | |||
| any protocol. <vspace blankLines="1" />This is an optional | any protocol. </t> | |||
| <t>This is an optional | ||||
| attribute.</t> | attribute.</t> | |||
| </dd> | ||||
| <t hangText="target-fqdn: ">A list of Fully Qualified Domain Names | <dt>target-fqdn: </dt> | |||
| (FQDNs) identifying resources under attack <xref | <dd> | |||
| target="RFC8499"></xref>.<vspace blankLines="1" />How a name is | <t>A list of Fully Qualified Domain Names | |||
| passed to an underlying name resolution library is implementation- | (FQDNs) identifying resources under attack <xref target="RFC8499" fo | |||
| and deployment-specific. Nevertheless, once the name is resolved | rmat="default"/>.</t> | |||
| into one or multiple IP addresses, DOTS servers MUST apply the | <t>How a name is | |||
| same validation checks as those for 'target-prefix'.<vspace | passed to an underlying name resolution library is | |||
| blankLines="1" />The use of FQDNs may be suboptimal because it | implementation and deployment specific. Nevertheless, once the name i | |||
| s resolved | ||||
| into one or multiple IP addresses, DOTS servers <bcp14>MUST</bcp14> | ||||
| apply the | ||||
| same validation checks as those for 'target-prefix'.</t> | ||||
| <t>The use of FQDNs may be suboptimal because it | ||||
| does not guarantee that the DOTS server will resolve a name to the | does not guarantee that the DOTS server will resolve a name to the | |||
| same IP addresses that the DOTS client does.<vspace | same IP addresses that the DOTS client does.</t> | |||
| blankLines="1" />This is an optional attribute.</t> | <t>This is an optional attribute.</t> | |||
| </dd> | ||||
| <t hangText="target-uri: ">A list of Uniform Resource Identifiers | <dt>target-uri: </dt> | |||
| (URIs) <xref target="RFC3986"></xref>. <vspace | <dd> | |||
| blankLines="1" />The same validation checks used for 'target-fqdn' | <t>A list of Uniform Resource Identifiers | |||
| MUST be followed by DOTS servers to validate a target URI. <vspace | (URIs) <xref target="RFC3986" format="default"/>. </t> | |||
| blankLines="1" />This is an optional attribute.</t> | <t>The same validation checks used for 'target-fqdn' | |||
| </list></t> | <bcp14>MUST</bcp14> be followed by DOTS servers to validate a target | |||
| URI. </t> | ||||
| <t>This is an optional attribute.</t> | ||||
| </dd> | ||||
| </dl> | ||||
| <t>In POST or PUT requests, at least one of the 'target-prefix', | <t>In POST or PUT requests, at least one of the 'target-prefix', | |||
| 'target-fqdn', or 'target-uri' attributes MUST be present. DOTS agents | 'target-fqdn', or 'target-uri' attributes <bcp14>MUST</bcp14> be present | |||
| can safely ignore Vendor-Specific parameters they don't | . DOTS agents | |||
| can safely ignore vendor-specific parameters they don't | ||||
| understand.</t> | understand.</t> | |||
| <t>If more than one 'target-*' scope types (e.g., 'target-prefix' and | <t>If more than one 'target-*' scope types (e.g., 'target-prefix' and | |||
| 'target-fqdn' or 'target-fqdn' and 'target-uri') are included in a | 'target-fqdn' or 'target-fqdn' and 'target-uri') are included in a | |||
| POST or PUT request, the DOTS server binds all resulting IP | POST or PUT request, the DOTS server binds all resulting IP | |||
| addresses/prefixes to the same resource.</t> | addresses/prefixes to the same resource.</t> | |||
| <t><xref target="Figure2" format="default"/> shows a POST request to cre | ||||
| <t><xref target="Figure2"></xref> shows a POST request to create an | ate an | |||
| alias called "https1" for HTTPS servers with IP addresses | alias called "https1" for HTTPS servers with IP addresses | |||
| 2001:db8:6401::1 and 2001:db8:6401::2 listening on TCP port number | 2001:db8:6401::1 and 2001:db8:6401::2 listening on TCP port number | |||
| 443.</t> | 443.</t> | |||
| <figure anchor="Figure2"> | ||||
| <t><figure anchor="Figure2" | <name>Example of a POST to Create an Alias</name> | |||
| title="Example of a POST to Create an Alias"> | <sourcecode type=""><![CDATA[ | |||
| <artwork align="left"><![CDATA[POST /restconf/data/ietf-dots-data-ch | POST /restconf/data/ietf-dots-data-channel:dots-data\ | |||
| annel:dots-data\ | ||||
| /dots-client=dz6pHjaADkaFTbjr0JGBpw HTTP/1.1 | /dots-client=dz6pHjaADkaFTbjr0JGBpw HTTP/1.1 | |||
| Host: www.example.com | Host: example.com | |||
| Content-Type: application/yang-data+json | Content-Type: application/yang-data+json | |||
| { | { | |||
| "ietf-dots-data-channel:aliases": { | "ietf-dots-data-channel:aliases": { | |||
| "alias": [ | "alias": [ | |||
| { | { | |||
| "name": "https1", | "name": "https1", | |||
| "target-protocol": [ | "target-protocol": [ | |||
| 6 | 6 | |||
| ], | ], | |||
| skipping to change at line 2094 ¶ | skipping to change at line 2015 ¶ | |||
| "2001:db8:6401::2/128" | "2001:db8:6401::2/128" | |||
| ], | ], | |||
| "target-port-range": [ | "target-port-range": [ | |||
| { | { | |||
| "lower-port": 443 | "lower-port": 443 | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| }]]></artwork> | } | |||
| </figure></t> | ]]></sourcecode> | |||
| </figure> | ||||
| <t>"201 Created" status-line MUST be returned in the response if the | <t>A "201 Created" status-line <bcp14>MUST</bcp14> be returned in the re | |||
| sponse if the | ||||
| DOTS server has accepted the alias.</t> | DOTS server has accepted the alias.</t> | |||
| <t>A "409 Conflict" status-line <bcp14>MUST</bcp14> be returned to the r | ||||
| <t>"409 Conflict" status-line MUST be returned to the requesting DOTS | equesting DOTS | |||
| client, if the request is conflicting with an existing alias name. The | client, if the request is conflicting with an existing alias name. The | |||
| error-tag "resource-denied" is used in this case.</t> | error-tag "resource-denied" is used in this case.</t> | |||
| <t>If the request is missing a mandatory attribute or it contains an | <t>If the request is missing a mandatory attribute or it contains an | |||
| invalid or unknown parameter, "400 Bad Request" status-line MUST be | invalid or unknown parameter, a "400 Bad Request" status-line <bcp14>MUS T</bcp14> be | |||
| returned by the DOTS server. The error-tag is set to | returned by the DOTS server. The error-tag is set to | |||
| "missing-attribute", "invalid-value", or "unknown-element" as a | "missing-attribute", "invalid-value", or "unknown-element" as a | |||
| function of the encountered error.</t> | function of the encountered error.</t> | |||
| <t>If the request is received via a server-domain DOTS gateway, but | <t>If the request is received via a server-domain DOTS gateway, but | |||
| the DOTS server does not maintain a 'cdid' for this 'cuid' while a | the DOTS server does not maintain a 'cdid' for this 'cuid' while a | |||
| 'cdid' is expected to be supplied, the DOTS server MUST reply with | 'cdid' is expected to be supplied, the DOTS server <bcp14>MUST</bcp14> r | |||
| "403 Forbidden" status-line and the error-tag "access-denied". Upon | eply with | |||
| receipt of this message, the DOTS client MUST register (<xref | a "403 Forbidden" status-line and the error-tag "access-denied". Upon | |||
| target="registering"></xref>).</t> | receipt of this message, the DOTS client <bcp14>MUST</bcp14> register (< | |||
| xref target="registering" format="default"/>).</t> | ||||
| <t>A DOTS client uses the PUT request to modify the aliases in the | <t>A DOTS client uses the PUT request to modify the aliases in the | |||
| DOTS server. In particular, a DOTS client MUST update its alias | DOTS server. In particular, a DOTS client <bcp14>MUST</bcp14> update its alias | |||
| entries upon change of the prefix indicated in the | entries upon change of the prefix indicated in the | |||
| 'target-prefix'.</t> | 'target-prefix'.</t> | |||
| <t>A DOTS server <bcp14>MUST</bcp14> maintain an alias for at least 1008 | ||||
| <t>A DOTS server MUST maintain an alias for at least 10080 minutes (1 | 0 minutes (1 | |||
| week). If no refresh request is seen from the DOTS client, the DOTS | week). If no refresh request is seen from the DOTS client, the DOTS | |||
| server removes expired entries.</t> | server removes expired entries.</t> | |||
| </section> | </section> | |||
| <section anchor="ralias" numbered="true" toc="default"> | ||||
| <section anchor="ralias" title="Retrieve Installed Aliases"> | <name>Retrieving Installed Aliases</name> | |||
| <t>A GET request is used to retrieve one or all installed aliases by a | <t>A GET request is used to retrieve one or all installed aliases by a | |||
| DOTS client from a DOTS server (Section 3.3.1 in <xref | DOTS client from a DOTS server (<xref target="RFC8040" section="3.3.1" s | |||
| target="RFC8040"></xref>). If no 'name' is included in the request, | ectionFormat="of" format="default"/>). If no 'name' is included in the request, | |||
| this is an indication that the request is about retrieving all aliases | this indicates that the request is about retrieving all aliases | |||
| instantiated by the DOTS client.</t> | instantiated by the DOTS client.</t> | |||
| <t><xref target="Figure4" format="default"/> shows an example to retriev | ||||
| <t><xref target="Figure4"></xref> shows an example to retrieve all the | e all the | |||
| aliases that were instantiated by the requesting DOTS client. The | aliases that were instantiated by the requesting DOTS client. The | |||
| "content" query parameter and its permitted values are defined in | "content" query parameter and its permitted values are defined in | |||
| Section 4.8.1 of <xref target="RFC8040"></xref>.</t> | <xref target="RFC8040" section="4.8.1" sectionFormat="of" format="defaul | |||
| t"/>.</t> | ||||
| <figure anchor="Figure4" title="GET to Retrieve All Installed Aliases"> | <figure anchor="Figure4"> | |||
| <artwork align="left"><![CDATA[ GET /restconf/data/ietf-dots-data-cha | <name>GET to Retrieve All Installed Aliases</name> | |||
| nnel:dots-data\ | <sourcecode type=""><![CDATA[ | |||
| GET /restconf/data/ietf-dots-data-channel:dots-data\ | ||||
| /dots-client=dz6pHjaADkaFTbjr0JGBpw\ | /dots-client=dz6pHjaADkaFTbjr0JGBpw\ | |||
| /aliases?content=all HTTP/1.1 | /aliases?content=all HTTP/1.1 | |||
| Host: example.com | Host: example.com | |||
| Accept: application/yang-data+json | Accept: application/yang-data+json | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | </figure> | |||
| <t><xref target="Figure6" format="default"/> shows an example of the res | ||||
| <t></t> | ponse | |||
| <t><xref target="Figure6"></xref> shows an example of the response | ||||
| message body that includes all the aliases that are maintained by the | message body that includes all the aliases that are maintained by the | |||
| DOTS server for the DOTS client identified by the 'cuid' | DOTS server for the DOTS client identified by the 'cuid' | |||
| parameter.</t> | parameter.</t> | |||
| <figure anchor="Figure6"> | ||||
| <t><figure anchor="Figure6" | <name>An Example of a Response Body Listing All Installed Aliases</nam | |||
| title="An Example of Response Body Listing All Installed Aliases"> | e> | |||
| <artwork align="left"><![CDATA[{ | <sourcecode type=""><![CDATA[ | |||
| { | ||||
| "ietf-dots-data-channel:aliases": { | "ietf-dots-data-channel:aliases": { | |||
| "alias": [ | "alias": [ | |||
| { | { | |||
| "name": "Server1", | "name": "Server1", | |||
| "target-protocol": [ | "target-protocol": [ | |||
| 6 | 6 | |||
| ], | ], | |||
| "target-prefix": [ | "target-prefix": [ | |||
| "2001:db8:6401::1/128", | "2001:db8:6401::1/128", | |||
| "2001:db8:6401::2/128" | "2001:db8:6401::2/128" | |||
| skipping to change at line 2194 ¶ | skipping to change at line 2105 ¶ | |||
| ], | ], | |||
| "target-port-range": [ | "target-port-range": [ | |||
| { | { | |||
| "lower-port": 80 | "lower-port": 80 | |||
| } | } | |||
| ], | ], | |||
| "pending-lifetime": 9869 | "pending-lifetime": 9869 | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| }]]></artwork> | } | |||
| </figure></t> | ]]></sourcecode> | |||
| </figure> | ||||
| <t><xref target="analias"></xref> shows an example of a GET request to | <t><xref target="analias" format="default"/> shows an example of a GET r | |||
| equest to | ||||
| retrieve the alias "Server2" that was instantiated by the DOTS client. | retrieve the alias "Server2" that was instantiated by the DOTS client. | |||
| <figure anchor="analias" title="GET to Retrieve an Alias"> | </t> | |||
| <artwork align="left"><![CDATA[ GET /restconf/data/ietf-dots-data-c | <figure anchor="analias"> | |||
| hannel:dots-data\ | <name>GET to Retrieve an Alias</name> | |||
| <sourcecode type=""><![CDATA[ | ||||
| GET /restconf/data/ietf-dots-data-channel:dots-data\ | ||||
| /dots-client=dz6pHjaADkaFTbjr0JGBpw\ | /dots-client=dz6pHjaADkaFTbjr0JGBpw\ | |||
| /aliases/alias=Server2?content=all HTTP/1.1 | /aliases/alias=Server2?content=all HTTP/1.1 | |||
| Host: example.com | Host: example.com | |||
| Accept: application/yang-data+json]]></artwork> | Accept: application/yang-data+json | |||
| </figure></t> | ]]></sourcecode> | |||
| </figure> | ||||
| <t>If an alias name ('name') is included in the request, but the DOTS | <t>If an alias name ('name') is included in the request, but the DOTS | |||
| server does not find that alias name for this DOTS client in its | server does not find that alias name for this DOTS client in its | |||
| configuration data, it MUST respond with a "404 Not Found" | configuration data, it <bcp14>MUST</bcp14> respond with a "404 Not Found " | |||
| status-line.</t> | status-line.</t> | |||
| </section> | </section> | |||
| <section anchor="dalias" numbered="true" toc="default"> | ||||
| <section anchor="dalias" title="Delete Aliases"> | <name>Deleting Aliases</name> | |||
| <t>A DELETE request is used to delete an alias maintained by a DOTS | <t>A DELETE request is used to delete an alias maintained by a DOTS | |||
| server.</t> | server.</t> | |||
| <t>If the DOTS server does not find the alias name that was conveyed in | ||||
| <t>If the DOTS server does not find the alias name, conveyed in the | the | |||
| DELETE request, in its configuration data for this DOTS client, it | DELETE request in its configuration data for this DOTS client, it | |||
| MUST respond with a "404 Not Found" status-line.</t> | <bcp14>MUST</bcp14> respond with a "404 Not Found" status-line.</t> | |||
| <t>The DOTS server successfully acknowledges a DOTS client's request | <t>The DOTS server successfully acknowledges a DOTS client's request | |||
| to remove the alias using "204 No Content" status-line in the | to remove the alias using "204 No Content" status-line in the | |||
| response.</t> | response.</t> | |||
| <t><xref target="Figure3" format="default"/> shows an example of a reque | ||||
| <t><xref target="Figure3"></xref> shows an example of a request to | st to | |||
| delete an alias.</t> | delete an alias.</t> | |||
| <figure anchor="Figure3"> | ||||
| <t><figure anchor="Figure3" title="Delete an Alias"> | <name>Delete an Alias</name> | |||
| <artwork align="left"><![CDATA[ DELETE /restconf/data/ietf-dots-dat | <sourcecode type=""><![CDATA[ | |||
| a-channel:dots-data\ | DELETE /restconf/data/ietf-dots-data-channel:dots-data\ | |||
| /dots-client=dz6pHjaADkaFTbjr0JGBpw\ | /dots-client=dz6pHjaADkaFTbjr0JGBpw\ | |||
| /aliases/alias=Server1 HTTP/1.1 | /aliases/alias=Server1 HTTP/1.1 | |||
| Host: example.com]]></artwork> | Host: example.com | |||
| </figure></t> | ]]></sourcecode> | |||
| </figure> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="filter" numbered="true" toc="default"> | ||||
| <section anchor="filter" title="Managing DOTS Filtering Rules"> | <name>Managing DOTS Filtering Rules</name> | |||
| <t>The following sub-sections define means for a DOTS client to retrieve | <t>The following subsections define the means for a DOTS client to retriev | |||
| DOTS filtering capabilities (<xref target="rcap"></xref>), create | e | |||
| filtering rules (<xref target="install"></xref>), retrieve active | DOTS filtering capabilities (<xref target="rcap" format="default"/>), to c | |||
| filtering rules (<xref target="rfilter"></xref>), and delete a filtering | reate | |||
| rule (<xref target="dfilter"></xref>).</t> | filtering rules (<xref target="install" format="default"/>), to retrieve a | |||
| ctive | ||||
| <section anchor="rcap" title="Retrieve DOTS Filtering Capabilities"> | filtering rules (<xref target="rfilter" format="default"/>), and to delete | |||
| <t>A DOTS client MAY send a GET request to retrieve the filtering | a filtering | |||
| capabilities supported by a DOTS server. <xref target="cap"></xref> | rule (<xref target="dfilter" format="default"/>).</t> | |||
| <section anchor="rcap" numbered="true" toc="default"> | ||||
| <name>Retrieving DOTS Filtering Capabilities</name> | ||||
| <t>A DOTS client <bcp14>MAY</bcp14> send a GET request to retrieve the f | ||||
| iltering | ||||
| capabilities supported by a DOTS server. <xref target="cap" format="defa | ||||
| ult"/> | ||||
| shows an example of such request.</t> | shows an example of such request.</t> | |||
| <figure anchor="cap"> | ||||
| <t><figure anchor="cap" | <name>GET to Retrieve the Capabilities of a DOTS Server</name> | |||
| title="GET to Retrieve the Capabilities of a DOTS Server"> | <sourcecode type=""><![CDATA[ | |||
| <artwork align="left"><![CDATA[ GET /restconf/data/ietf-dots-data-c | GET /restconf/data/ietf-dots-data-channel:dots-data\ | |||
| hannel:dots-data\ | ||||
| /capabilities HTTP/1.1 | /capabilities HTTP/1.1 | |||
| Host: example.com | Host: example.com | |||
| Accept: application/yang-data+json | Accept: application/yang-data+json | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure></t> | </figure> | |||
| <t>A DOTS client, which issued a GET request to retrieve the filtering | ||||
| <t>A DOTS client which issued a GET request to retrieve the filtering | capabilities supported by its DOTS server, <bcp14>SHOULD NOT</bcp14> req | |||
| capabilities supported by its DOTS server, SHOULD NOT request for | uest | |||
| filtering actions that are not supported by that DOTS server.</t> | filtering actions that are not supported by that DOTS server.</t> | |||
| <t><xref target="capex" format="default"/> shows an example of a respons | ||||
| <t><xref target="capex"></xref> shows an example of a response body | e body | |||
| received from a DOTS server which supports:<list style="symbols"> | received from a DOTS server which supports:</t> | |||
| <t>IPv4, IPv6, TCP, UDP, ICMP, and ICMPv6 mandatory match criteria | <ul spacing="normal"> | |||
| listed in <xref target="filf"></xref>.</t> | <li>IPv4, IPv6, TCP, UDP, ICMP, and ICMPv6 mandatory match criteria | |||
| listed in <xref target="filf" format="default"/>.</li> | ||||
| <t>'accept', 'drop', and 'rate-limit' actions.</t> | <li>'accept', 'drop', and 'rate-limit' actions.</li> | |||
| </list></t> | </ul> | |||
| <figure anchor="capex"> | ||||
| <t><figure anchor="capex" | <name>Reply to a GET Request with Filtering Capabilities (Message Body | |||
| title="Reply to a GET Request with Filtering Capabilities (Message B | )</name> | |||
| ody)"> | <sourcecode type=""><![CDATA[ | |||
| <artwork align="left"><![CDATA[ { | { | |||
| "ietf-dots-data-channel:capabilities": { | "ietf-dots-data-channel:capabilities": { | |||
| "address-family": ["ipv4", "ipv6"], | "address-family": ["ipv4", "ipv6"], | |||
| "forwarding-actions": ["drop", "accept"], | "forwarding-actions": ["drop", "accept"], | |||
| "rate-limit": true, | "rate-limit": true, | |||
| "transport-protocols": [1, 6, 17, 58], | "transport-protocols": [1, 6, 17, 58], | |||
| "ipv4": { | "ipv4": { | |||
| "length": true, | "length": true, | |||
| "protocol": true, | "protocol": true, | |||
| "destination-prefix": true, | "destination-prefix": true, | |||
| "source-prefix": true, | "source-prefix": true, | |||
| skipping to change at line 2309 ¶ | skipping to change at line 2220 ¶ | |||
| "length": true, | "length": true, | |||
| "source-port": true, | "source-port": true, | |||
| "destination-port": true, | "destination-port": true, | |||
| "port-range": true | "port-range": true | |||
| }, | }, | |||
| "icmp": { | "icmp": { | |||
| "type": true, | "type": true, | |||
| "code": true | "code": true | |||
| } | } | |||
| } | } | |||
| }]]></artwork> | } | |||
| </figure></t> | ]]></sourcecode> | |||
| </figure> | ||||
| </section> | </section> | |||
| <section anchor="install" numbered="true" toc="default"> | ||||
| <section anchor="install" title="Install Filtering Rules"> | <name>Installing Filtering Rules</name> | |||
| <t>A POST or PUT request is used by a DOTS client to communicate | <t>A POST or PUT request is used by a DOTS client to communicate | |||
| filtering rules to a DOTS server.</t> | filtering rules to a DOTS server.</t> | |||
| <t><xref target="Figure7" format="default"/> shows an example of a POST | ||||
| <t><xref target="Figure7"></xref> shows a POST request example to | request to | |||
| block traffic from 192.0.2.0/24 and destined to 198.51.100.0/24. Other | block traffic from 192.0.2.0/24 and destined to 198.51.100.0/24. Other | |||
| examples are discussed in <xref target="frag"></xref>.</t> | examples are discussed in <xref target="frag" format="default"/>.</t> | |||
| <figure anchor="Figure7"> | ||||
| <t><figure anchor="Figure7" title="POST to Install Filtering Rules"> | <name>POST to Install Filtering Rules</name> | |||
| <artwork align="left"><![CDATA[ POST /restconf/data/ietf-dots-data-c | <sourcecode type=""><![CDATA[ | |||
| hannel:dots-data\ | POST /restconf/data/ietf-dots-data-channel:dots-data\ | |||
| /dots-client=dz6pHjaADkaFTbjr0JGBpw HTTP/1.1 | /dots-client=dz6pHjaADkaFTbjr0JGBpw HTTP/1.1 | |||
| Host: example.com | Host: example.com | |||
| Content-Type: application/yang-data+json | Content-Type: application/yang-data+json | |||
| { | { | |||
| "ietf-dots-data-channel:acls": { | "ietf-dots-data-channel:acls": { | |||
| "acl": [ | "acl": [ | |||
| { | { | |||
| "name": "sample-ipv4-acl", | "name": "sample-ipv4-acl", | |||
| "type": "ipv4-acl-type", | "type": "ipv4-acl-type", | |||
| skipping to change at line 2353 ¶ | skipping to change at line 2265 ¶ | |||
| }, | }, | |||
| "actions": { | "actions": { | |||
| "forwarding": "drop" | "forwarding": "drop" | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| }]]></artwork> | } | |||
| </figure></t> | ]]></sourcecode> | |||
| </figure> | ||||
| <t>The meaning of these parameters is as follows:</t> | <t>The meaning of these parameters is as follows:</t> | |||
| <dl newline="false" spacing="normal"> | ||||
| <t><list style="hanging"> | <dt>name:</dt> | |||
| <t hangText="name:">The name of the access list. <vspace | <dd> | |||
| blankLines="1" />This is a mandatory attribute.</t> | <t>The name of the access list. </t> | |||
| <t>This is a mandatory attribute.</t> | ||||
| <t hangText="type:">Indicates the primary intended type of match | </dd> | |||
| <dt>type:</dt> | ||||
| <dd> | ||||
| <t>Indicates the primary intended type of match | ||||
| criteria (e.g., IPv4, IPv6). It is set to 'ipv4-acl-type' in the | criteria (e.g., IPv4, IPv6). It is set to 'ipv4-acl-type' in the | |||
| example of <xref target="Figure7"></xref>. <vspace | example of <xref target="Figure7" format="default"/>. </t> | |||
| blankLines="1" />This is an optional attribute.</t> | <t>This is an optional attribute.</t> | |||
| </dd> | ||||
| <t hangText="activation-type:">Indicates whether an ACL has to be | <dt>activation-type:</dt> | |||
| <dd> | ||||
| <t>Indicates whether an ACL has to be | ||||
| activated (immediately or during mitigation time) or instantiated | activated (immediately or during mitigation time) or instantiated | |||
| without being activated (deactivated). Deactivated ACLs can be | without being activated (deactivated). Deactivated ACLs can be | |||
| activated using a variety of means such as manual configuration on | activated using a variety of means, such as manual configuration on | |||
| a DOTS server or using the DOTS data channel. <vspace | a DOTS server or by using the DOTS data channel. </t> | |||
| blankLines="1" />If this attribute is not provided, the DOTS | <t>If this attribute is not provided, the DOTS | |||
| server MUST use 'activate-when-mitigating' as default | server <bcp14>MUST</bcp14> use 'activate-when-mitigating' as the def | |||
| value.<vspace blankLines="1" />When a mitigation is in progress, | ault | |||
| the DOTS server MUST only activate 'activate-when-mitigating' | value.</t> | |||
| <t>When a mitigation is in progress, | ||||
| the DOTS server <bcp14>MUST</bcp14> only activate 'activate-when-mit | ||||
| igating' | ||||
| filters that are bound to the DOTS client that triggered the | filters that are bound to the DOTS client that triggered the | |||
| mitigation. <vspace blankLines="1" />This is an optional | mitigation. </t> | |||
| <t>This is an optional | ||||
| attribute.</t> | attribute.</t> | |||
| </dd> | ||||
| <t hangText="matches:">Define criteria used to identify a flow on | <dt>matches:</dt> | |||
| <dd> | ||||
| <t>Defines criteria used to identify a flow on | ||||
| which to apply the rule. It can be "l3" (IPv4, IPv6) or "l4" (TCP, | which to apply the rule. It can be "l3" (IPv4, IPv6) or "l4" (TCP, | |||
| UDP, ..). The detailed match parameters are specified in <xref | UDP, ICMP). The detailed match parameters are specified in <xref tar | |||
| target="YANG"></xref>.<vspace blankLines="1" />In the example | get="YANG" format="default"/>.</t> | |||
| depicted in <xref target="Figure7"></xref>, an IPv4 matching | <t>In the example | |||
| criteria is used.<vspace blankLines="1" />This is an optional | depicted in <xref target="Figure7" format="default"/>, an IPv4 match | |||
| ing | ||||
| criteria is used.</t> | ||||
| <t>This is an optional | ||||
| attribute.</t> | attribute.</t> | |||
| </dd> | ||||
| <t hangText="destination-ipv4-network:">The destination IPv4 | <dt>destination-ipv4-network:</dt> | |||
| prefix. DOTS servers MUST validate that these prefixes are within | <dd> | |||
| <t>The destination IPv4 | ||||
| prefix. DOTS servers <bcp14>MUST</bcp14> validate that these prefixe | ||||
| s are within | ||||
| the scope of the DOTS client domain. Other validation checks may | the scope of the DOTS client domain. Other validation checks may | |||
| be supported by DOTS servers. If this attribute is not provided, | be supported by DOTS servers. If this attribute is not provided, | |||
| the DOTS server enforces the ACL on any destination IP address | the DOTS server enforces the ACL on any destination IP address | |||
| that belong to the DOTS client domain. <vspace | that belongs to the DOTS client domain. </t> | |||
| blankLines="1" />This is a mandatory attribute in requests with an | <t>This is a mandatory attribute in requests with an | |||
| 'activation-type' set to 'immediate'.</t> | 'activation-type' set to 'immediate'.</t> | |||
| </dd> | ||||
| <t hangText="source-ipv4-network:">The source IPv4 prefix. <vspace | <dt>source-ipv4-network:</dt> | |||
| blankLines="1" />This is an optional attribute.</t> | <dd> | |||
| <t>The source IPv4 prefix. </t> | ||||
| <t hangText="actions: ">Actions in the forwarding ACL category can | <t>This is an optional attribute.</t> | |||
| be "drop" or "accept". The "accept" action is used to accept-list | </dd> | |||
| traffic. The "drop" action is used to drop-list traffic. <vspace | <dt>actions: </dt> | |||
| blankLines="1" />Accepted traffic may be subject to "rate-limit"; | <dd> | |||
| <t>Actions in the forwarding ACL category can | ||||
| be 'drop' or 'accept'. The 'accept' action is used to accept-list | ||||
| traffic. The "drop" action is used to drop-list traffic. </t> | ||||
| <t>Accepted traffic may be subject to 'rate-limit'; | ||||
| the allowed traffic rate is represented in bytes per second. This | the allowed traffic rate is represented in bytes per second. This | |||
| unit is the same as the one used for "traffic-rate" in <xref | unit is the same as the one used for "traffic-rate" in <xref target= | |||
| target="RFC5575"></xref>.<vspace blankLines="1" />This is a | "RFC5575" format="default"/>.</t> | |||
| <t>This is a | ||||
| mandatory attribute.</t> | mandatory attribute.</t> | |||
| </list></t> | </dd> | |||
| </dl> | ||||
| <t>The DOTS server indicates the result of processing the POST request | <t>The DOTS server indicates the result of processing the POST request | |||
| using the status-line. Concretely, "201 Created" status-line MUST be | using the status-line. Concretely, a "201 Created" status-line <bcp14>MU ST</bcp14> be | |||
| returned in the response if the DOTS server has accepted the filtering | returned in the response if the DOTS server has accepted the filtering | |||
| rules. If the request is missing a mandatory attribute or contains an | rules. If the request is missing a mandatory attribute or contains an | |||
| invalid or unknown parameter (e.g., a match field not supported by the | invalid or unknown parameter (e.g., a match field not supported by the | |||
| DOTS server), "400 Bad Request" status-line MUST be returned by the | DOTS server), a "400 Bad Request" status-line <bcp14>MUST</bcp14> be ret urned by the | |||
| DOTS server in the response. The error-tag is set to | DOTS server in the response. The error-tag is set to | |||
| "missing-attribute", "invalid-value", or "unknown-element" as a | "missing-attribute", "invalid-value", or "unknown-element" as a | |||
| function of the encountered error.</t> | function of the encountered error.</t> | |||
| <t>If the request is received via a server-domain DOTS gateway, but | <t>If the request is received via a server-domain DOTS gateway, but | |||
| the DOTS server does not maintain a 'cdid' for this 'cuid' while a | the DOTS server does not maintain a 'cdid' for this 'cuid' while a | |||
| 'cdid' is expected to be supplied, the DOTS server MUST reply with | 'cdid' is expected to be supplied, the DOTS server <bcp14>MUST</bcp14> r | |||
| "403 Forbidden" status-line and the error-tag "access-denied". Upon | eply with | |||
| receipt of this message, the DOTS client MUST register (<xref | a "403 Forbidden" status-line and the error-tag "access-denied". Upon | |||
| target="register"></xref>).</t> | receipt of this message, the DOTS client <bcp14>MUST</bcp14> register (< | |||
| xref target="register" format="default"/>).</t> | ||||
| <t>If the request is conflicting with an existing filtering installed | <t>If the request is conflicting with an existing filtering installed | |||
| by another DOTS client of the domain, absent any local policy, the | by another DOTS client of the domain, absent any local policy, the | |||
| DOTS server returns "409 Conflict" status-line to the requesting DOTS | DOTS server returns a "409 Conflict" status-line to the requesting DOTS | |||
| client. The error-tag "resource-denied" is used in this case.</t> | client. The error-tag "resource-denied" is used in this case.</t> | |||
| <t>The "insert" query parameter (<xref target="RFC8040" section="4.8.5" | ||||
| <t>The "insert" query parameter (Section 4.8.5 of <xref | sectionFormat="of" format="default"/>) | |||
| target="RFC8040"></xref>) MAY be used to specify how an access control | <bcp14>MAY</bcp14> be used to specify how an access control | |||
| entry is inserted within an ACL and how an ACL is inserted within an | entry is inserted within an ACL and how an ACL is inserted within an | |||
| ACL set.</t> | ACL set.</t> | |||
| <t>The DOTS client uses the PUT request to modify its filtering rules | <t>The DOTS client uses the PUT request to modify its filtering rules | |||
| maintained by the DOTS server. In particular, a DOTS client MUST | maintained by the DOTS server. In particular, a DOTS client <bcp14>MUST< | |||
| update its filtering entries upon change of the destination-prefix. | /bcp14> | |||
| update its filtering entries upon change of the destination prefix. | ||||
| How such change is detected is out of scope.</t> | How such change is detected is out of scope.</t> | |||
| <t>A DOTS server <bcp14>MUST</bcp14> maintain a filtering rule for at le | ||||
| <t>A DOTS server MUST maintain a filtering rule for at least 10080 | ast 10080 | |||
| minutes (1 week). If no refresh request is seen from the DOTS client, | minutes (1 week). If no refresh request is seen from the DOTS client, | |||
| the DOTS server removes expired entries. Typically, a refresh request | the DOTS server removes expired entries. Typically, a refresh request | |||
| is a PUT request which echoes the content of a response to a GET | is a PUT request that echoes the content of a response to a GET | |||
| request with all of the read-only parameters stripped out (e.g., | request with all of the read-only parameters stripped out (e.g., | |||
| pending-lifetime).</t> | 'pending-lifetime').</t> | |||
| </section> | </section> | |||
| <section anchor="rfilter" numbered="true" toc="default"> | ||||
| <section anchor="rfilter" title="Retrieve Installed Filtering Rules "> | <name>Retrieving Installed Filtering Rules</name> | |||
| <t>A DOTS client periodically queries its DOTS server to check the | <t>A DOTS client periodically queries its DOTS server to check the | |||
| counters for installed filtering rules. A GET request is used to | counters for installed filtering rules. A GET request is used to | |||
| retrieve filtering rules from a DOTS server. In order to indicate | retrieve filtering rules from a DOTS server. In order to indicate | |||
| which type of data is requested in a GET request, the DOTS client sets | which type of data is requested in a GET request, the DOTS client sets | |||
| adequately the "content" query parameter.</t> | adequately the "content" query parameter.</t> | |||
| <t>If the DOTS server does not find the access list name conveyed in | <t>If the DOTS server does not find the access list name conveyed in | |||
| the GET request in its configuration data for this DOTS client, it | the GET request in its configuration data for this DOTS client, it | |||
| responds with a "404 Not Found" status-line.</t> | responds with a "404 Not Found" status-line.</t> | |||
| <t>In order to illustrate the intended behavior, consider the example | <t>In order to illustrate the intended behavior, consider the example | |||
| depicted in <xref target="PUTv6"></xref>. In reference to this | depicted in <xref target="PUTv6" format="default"/>. In reference to thi s | |||
| example, the DOTS client requests the creation of an immediate ACL | example, the DOTS client requests the creation of an immediate ACL | |||
| called "test-acl-ipv6-udp".</t> | called "test-acl-ipv6-udp".</t> | |||
| <figure anchor="PUTv6"> | ||||
| <t><figure anchor="PUTv6" | <name>Example of a PUT Request to Create a Filtering</name> | |||
| title="Example of a PUT Request to Create a Filtering"> | <sourcecode type=""><![CDATA[ | |||
| <artwork align="left"><![CDATA[PUT /restconf/data/ietf-dots-data-cha | PUT /restconf/data/ietf-dots-data-channel:dots-data\ | |||
| nnel:dots-data\ | ||||
| /dots-client=paL8p4Zqo4SLv64TLPXrxA/acls\ | /dots-client=paL8p4Zqo4SLv64TLPXrxA/acls\ | |||
| /acl=test-acl-ipv6-udp HTTP/1.1 | /acl=test-acl-ipv6-udp HTTP/1.1 | |||
| Host: example.com | Host: example.com | |||
| Content-Type: application/yang-data+json | Content-Type: application/yang-data+json | |||
| { | { | |||
| "ietf-dots-data-channel:acls": { | "ietf-dots-data-channel:acls": { | |||
| "acl": [ | "acl": [ | |||
| { | { | |||
| "name": "test-acl-ipv6-udp", | "name": "test-acl-ipv6-udp", | |||
| skipping to change at line 2493 ¶ | skipping to change at line 2413 ¶ | |||
| { | { | |||
| "name": "my-test-ace", | "name": "my-test-ace", | |||
| "matches": { | "matches": { | |||
| "ipv6": { | "ipv6": { | |||
| "destination-ipv6-network": "2001:db8:6401::2/127", | "destination-ipv6-network": "2001:db8:6401::2/127", | |||
| "source-ipv6-network": "2001:db8:1234::/96", | "source-ipv6-network": "2001:db8:1234::/96", | |||
| "protocol": 17, | "protocol": 17, | |||
| "flow-label": 10000 | "flow-label": 10000 | |||
| }, | }, | |||
| "udp": { | "udp": { | |||
| "source-port": { | "source-port-range-or-operator": { | |||
| "operator": "lte", | "operator": "lte", | |||
| "port": 80 | "port": 80 | |||
| }, | }, | |||
| "destination-port": { | "destination-port-range-or-operator": { | |||
| "operator": "neq", | "operator": "neq", | |||
| "port": 1010 | "port": 1010 | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "actions": { | "actions": { | |||
| "forwarding": "accept" | "forwarding": "accept" | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| }]]></artwork> | } | |||
| </figure></t> | ]]></sourcecode> | |||
| </figure> | ||||
| <t>The peer DOTS server follows the procedure specified in <xref | <t>The peer DOTS server follows the procedure specified in | |||
| target="install"></xref> to process the request. We consider in the | <xref target="install" format="default"/> to process the request. We con | |||
| sider in the | ||||
| following that a positive response is sent back to the requesting DOTS | following that a positive response is sent back to the requesting DOTS | |||
| client to confirm that the "test-acl-ipv6-udp" ACL is successfully | client to confirm that the "test-acl-ipv6-udp" ACL is successfully | |||
| installed by the DOTS server.</t> | installed by the DOTS server.</t> | |||
| <t>The DOTS client can issue a GET request to retrieve all its | <t>The DOTS client can issue a GET request to retrieve all its | |||
| filtering rules and the number of matches for the installed filtering | filtering rules and the number of matches for the installed filtering | |||
| rules as illustrated in <xref target="Get"></xref>. The "content" | rules as illustrated in <xref target="Get" format="default"/>. The "cont ent" | |||
| query parameter is set to 'all'. The message body of the response to | query parameter is set to 'all'. The message body of the response to | |||
| this GET request is shown in <xref target="Getr"></xref>.</t> | this GET request is shown in <xref target="Getr" format="default"/>.</t> | |||
| <figure anchor="Get"> | ||||
| <figure anchor="Get" | <name>Retrieve the Configuration Data and State Data for the Filtering | |||
| title="Retrieve the Configuration Data and State Data for the Fi | Rules (GET Request)</name> | |||
| ltering Rules (GET Request)"> | <sourcecode type=""><![CDATA[ | |||
| <artwork align="left"><![CDATA[ GET /restconf/data/ietf-dots-data-cha | GET /restconf/data/ietf-dots-data-channel:dots-data\ | |||
| nnel:dots-data\ | ||||
| /dots-client=dz6pHjaADkaFTbjr0JGBpw\ | /dots-client=dz6pHjaADkaFTbjr0JGBpw\ | |||
| /acls?content=all HTTP/1.1 | /acls?content=all HTTP/1.1 | |||
| Host: example.com | Host: example.com | |||
| Accept: application/yang-data+json | Accept: application/yang-data+json | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | </figure> | |||
| <figure anchor="Getr"> | ||||
| <t></t> | <name>Retrieve the Configuration Data and State Data for the Filtering | |||
| Rules (Response Message Body)</name> | ||||
| <t><figure anchor="Getr" | <sourcecode type=""><![CDATA[ | |||
| title="Retrieve the Configuration Data and State Data for the Filter | { | |||
| ing Rules (Response Message Body)"> | ||||
| <artwork align="left"><![CDATA[{ | ||||
| "ietf-dots-data-channel:acls": { | "ietf-dots-data-channel:acls": { | |||
| "acl": [ | "acl": [ | |||
| { | { | |||
| "name": "test-acl-ipv6-udp", | "name": "test-acl-ipv6-udp", | |||
| "type": "ipv6-acl-type", | "type": "ipv6-acl-type", | |||
| "activation-type": "immediate", | "activation-type": "immediate", | |||
| "pending-lifetime":9080, | "pending-lifetime":9080, | |||
| "aces": { | "aces": { | |||
| "ace": [ | "ace": [ | |||
| { | { | |||
| "name": "my-test-ace", | "name": "my-test-ace", | |||
| "matches": { | "matches": { | |||
| "ipv6": { | "ipv6": { | |||
| "destination-ipv6-network": "2001:db8:6401::2/127", | "destination-ipv6-network": "2001:db8:6401::2/127", | |||
| "source-ipv6-network": "2001:db8:1234::/96", | "source-ipv6-network": "2001:db8:1234::/96", | |||
| "protocol": 17, | "protocol": 17, | |||
| "flow-label": 10000 | "flow-label": 10000 | |||
| }, | }, | |||
| "udp": { | "udp": { | |||
| "source-port": { | "source-port-range-or-operator": { | |||
| "operator": "lte", | "operator": "lte", | |||
| "port": 80 | "port": 80 | |||
| }, | }, | |||
| "destination-port": { | "destination-port-range-or-operator": { | |||
| "operator": "neq", | "operator": "neq", | |||
| "port": 1010 | "port": 1010 | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "actions": { | "actions": { | |||
| "forwarding": "accept" | "forwarding": "accept" | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| }]]></artwork> | } | |||
| </figure></t> | ]]></sourcecode> | |||
| </figure> | ||||
| <t>Also, a DOTS client can issue a GET request to retrieve only | <t>Also, a DOTS client can issue a GET request to retrieve only | |||
| configuration data related to an ACL as shown in <xref | configuration data related to an ACL as shown in <xref target="GEtc" for | |||
| target="GEtc"></xref>. It does so by setting the "content" query | mat="default"/>. It does so by setting the "content" query | |||
| parameter to 'config'.</t> | parameter to 'config'.</t> | |||
| <figure anchor="GEtc"> | ||||
| <t><figure anchor="GEtc" | <name>Retrieve the Configuration Data for a Filtering Rule (GET Reques | |||
| title="Retrieve the Configuration Data for a Filtering Rule (GET Req | t)</name> | |||
| uest)"> | <sourcecode type=""><![CDATA[ | |||
| <artwork align="left"><![CDATA[ GET /restconf/data/ietf-dots-data-c | GET /restconf/data/ietf-dots-data-channel:dots-data\ | |||
| hannel:dots-data\ | ||||
| /dots-client=paL8p4Zqo4SLv64TLPXrxA/acls\ | /dots-client=paL8p4Zqo4SLv64TLPXrxA/acls\ | |||
| /acl=test-acl-ipv6-udp?content=config HTTP/1.1 | /acl=test-acl-ipv6-udp?content=config HTTP/1.1 | |||
| Host: example.com | Host: example.com | |||
| Accept: application/yang-data+json]]></artwork> | Accept: application/yang-data+json | |||
| </figure></t> | ]]></sourcecode> | |||
| </figure> | ||||
| <t>A response to this GET request is shown in <xref | <t>A response to this GET request is shown in <xref target="GEtcr" forma | |||
| target="GEtcr"></xref>.</t> | t="default"/>.</t> | |||
| <figure anchor="GEtcr"> | ||||
| <t><figure anchor="GEtcr" | <name>Retrieve the Configuration Data for a Filtering Rule (Response M | |||
| title="Retrieve the Configuration Data for a Filtering Rule (Respons | essage Body)</name> | |||
| e Message Body)"> | <sourcecode type=""><![CDATA[ | |||
| <artwork align="left"><![CDATA[{ | { | |||
| "ietf-dots-data-channel:acls": { | "ietf-dots-data-channel:acls": { | |||
| "acl": [ | "acl": [ | |||
| { | { | |||
| "name": "test-acl-ipv6-udp", | "name": "test-acl-ipv6-udp", | |||
| "type": "ipv6-acl-type", | "type": "ipv6-acl-type", | |||
| "activation-type": "immediate", | "activation-type": "immediate", | |||
| "aces": { | "aces": { | |||
| "ace": [ | "ace": [ | |||
| { | { | |||
| "name": "my-test-ace", | "name": "my-test-ace", | |||
| "matches": { | "matches": { | |||
| "ipv6": { | "ipv6": { | |||
| "destination-ipv6-network": "2001:db8:6401::2/127", | "destination-ipv6-network": "2001:db8:6401::2/127", | |||
| "source-ipv6-network": "2001:db8:1234::/96", | "source-ipv6-network": "2001:db8:1234::/96", | |||
| "protocol": 17, | "protocol": 17, | |||
| "flow-label": 10000 | "flow-label": 10000 | |||
| }, | }, | |||
| "udp": { | "udp": { | |||
| "source-port": { | "source-port-range-or-operator": { | |||
| "operator": "lte", | "operator": "lte", | |||
| "port": 80 | "port": 80 | |||
| }, | }, | |||
| "destination-port": { | "destination-port-range-or-operator": { | |||
| "operator": "neq", | "operator": "neq", | |||
| "port": 1010 | "port": 1010 | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "actions": { | "actions": { | |||
| "forwarding": "accept" | "forwarding": "accept" | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| }]]></artwork> | } | |||
| </figure></t> | ]]></sourcecode> | |||
| </figure> | ||||
| <t>A DOTS client can also issue a GET request with a "content" query | <t>A DOTS client can also issue a GET request with a "content" query | |||
| parameter set to 'non-config' to exclusively retrieve | parameter set to 'non-config' to exclusively retrieve | |||
| non-configuration data bound to a given ACL as shown in <xref | non-configuration data bound to a given ACL as shown in <xref target="GE | |||
| target="GEtnc"></xref>. A response to this GET request is shown in | tnc" format="default"/>. A response to this GET request is shown in | |||
| <xref target="GEtncr"></xref>.</t> | <xref target="GEtncr" format="default"/>.</t> | |||
| <figure anchor="GEtnc"> | ||||
| <t><figure anchor="GEtnc" | <name>Retrieve the Non-Configuration Data for a Filtering Rule (GET Re | |||
| title="Retrieve the Non-Configuration Data for a Filtering Rule (GET | quest)</name> | |||
| Request)"> | <sourcecode type=""><![CDATA[ | |||
| <artwork align="left"><![CDATA[ GET /restconf/data/ietf-dots-data-c | GET /restconf/data/ietf-dots-data-channel:dots-data\ | |||
| hannel:dots-data\ | ||||
| /dots-client=paL8p4Zqo4SLv64TLPXrxA/acls\ | /dots-client=paL8p4Zqo4SLv64TLPXrxA/acls\ | |||
| /acl=test-acl-ipv6-udp?content=non-config HTTP/1.1 | /acl=test-acl-ipv6-udp?content=non-config HTTP/1.1 | |||
| Host: example.com | Host: example.com | |||
| Accept: application/yang-data+json]]></artwork> | Accept: application/yang-data+json | |||
| </figure></t> | ]]></sourcecode> | |||
| </figure> | ||||
| <t><figure anchor="GEtncr" | <figure anchor="GEtncr"> | |||
| title="Retrieve the Non-Configuration Data for a Filtering Rule (Res | <name>Retrieve the Non-Configuration Data for a Filtering Rule (Respon | |||
| ponse Message Body)"> | se Message Body)</name> | |||
| <artwork align="left"><![CDATA[{ | <sourcecode type=""><![CDATA[ | |||
| { | ||||
| "ietf-dots-data-channel:acls": { | "ietf-dots-data-channel:acls": { | |||
| "acl": [ | "acl": [ | |||
| { | { | |||
| "name": "test-acl-ipv6-udp", | "name": "test-acl-ipv6-udp", | |||
| "pending-lifetime": 8000, | "pending-lifetime": 8000, | |||
| "aces": { | "aces": { | |||
| "ace": [ | "ace": [ | |||
| { | { | |||
| "name": "my-test-ace" | "name": "my-test-ace" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure></t> | </figure> | |||
| </section> | </section> | |||
| <section anchor="dfilter" numbered="true" toc="default"> | ||||
| <section anchor="dfilter" title="Remove Filtering Rules"> | <name>Removing Filtering Rules</name> | |||
| <t>A DELETE request is used by a DOTS client to delete filtering rules | <t>A DELETE request is used by a DOTS client to delete filtering rules | |||
| from a DOTS server.</t> | from a DOTS server.</t> | |||
| <t>If the DOTS server does not find the access list name carried in | <t>If the DOTS server does not find the access list name carried in | |||
| the DELETE request in its configuration data for this DOTS client, it | the DELETE request in its configuration data for this DOTS client, it | |||
| MUST respond with a "404 Not Found" status-line. The DOTS server | <bcp14>MUST</bcp14> respond with a "404 Not Found" status-line. The DOTS server | |||
| successfully acknowledges a DOTS client's request to withdraw the | successfully acknowledges a DOTS client's request to withdraw the | |||
| filtering rules using "204 No Content" status-line, and removes the | filtering rules using a "204 No Content" status-line, and removes the | |||
| filtering rules accordingly.</t> | filtering rules accordingly.</t> | |||
| <t><xref target="Figure9" format="default"/> shows an example of a reque | ||||
| <t><xref target="Figure9"></xref> shows an example of a request to | st to | |||
| remove the IPv4 ACL "sample-ipv4-acl" created in <xref | remove the IPv4 ACL "sample-ipv4-acl" created in <xref target="install" | |||
| target="install"></xref>.</t> | format="default"/>.</t> | |||
| <figure anchor="Figure9"> | ||||
| <figure anchor="Figure9" | <name>Remove a Filtering Rule (DELETE Request)</name> | |||
| title="Remove a Filtering Rule (DELETE Request)"> | <sourcecode type=""><![CDATA[ | |||
| <artwork align="left"><![CDATA[ DELETE /restconf/data/ietf-dots-data | DELETE /restconf/data/ietf-dots-data-channel:dots-data\ | |||
| -channel:dots-data\ | ||||
| /dots-client=dz6pHjaADkaFTbjr0JGBpw/acls\ | /dots-client=dz6pHjaADkaFTbjr0JGBpw/acls\ | |||
| /acl=sample-ipv4-acl HTTP/1.1 | /acl=sample-ipv4-acl HTTP/1.1 | |||
| Host: example.com]]></artwork> | Host: example.com]]> | |||
| </sourcecode> | ||||
| </figure> | </figure> | |||
| <t/> | ||||
| <t></t> | <t><xref target="Figure9a" format="default"/> shows an example of a resp | |||
| onse | ||||
| <t><xref target="Figure9a"></xref> shows an example of a response | ||||
| received from the DOTS server to confirm the deletion of | received from the DOTS server to confirm the deletion of | |||
| "sample-ipv4-acl".</t> | "sample-ipv4-acl".</t> | |||
| <figure anchor="Figure9a"> | ||||
| <t><figure anchor="Figure9a" | <name>Remove a Filtering Rule (Response)</name> | |||
| title="Remove a Filtering Rule (Response)"> | <sourcecode type=""><![CDATA[ | |||
| <artwork align="left"><![CDATA[ HTTP/1.1 204 No Content | HTTP/1.1 204 No Content | |||
| Server: Apache | Server: Apache | |||
| Date: Fri, 27 Jul 2018 10:05:15 GMT | Date: Fri, 27 Jul 2018 10:05:15 GMT | |||
| Cache-Control: no-cache | Cache-Control: no-cache | |||
| Content-Type: application/yang-data+json | Content-Type: application/yang-data+json | |||
| Content-Length: 0 | Content-Length: 0 | |||
| Connection: Keep-Alive]]></artwork> | Connection: Keep-Alive | |||
| </figure></t> | ]]></sourcecode> | |||
| </figure> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="operational" numbered="true" toc="default"> | ||||
| <section anchor="operational" title="Operational Considerations"> | <name>Operational Considerations</name> | |||
| <t>The following operational considerations should be taken into | <t>The following operational considerations should be taken into | |||
| account:</t> | account:</t> | |||
| <ul spacing="normal"> | ||||
| <t><list style="symbols"> | <li>DOTS servers <bcp14>MUST NOT</bcp14> enable both DOTS data channel a | |||
| <t>DOTS servers MUST NOT enable both DOTS data channel and direct | nd direct | |||
| configuration, to avoid race conditions and inconsistent | configuration, to avoid race conditions and inconsistent | |||
| configurations arising from simultaneous updates from multiple | configurations arising from simultaneous updates from multiple | |||
| sources.</t> | sources.</li> | |||
| <li>DOTS agents <bcp14>SHOULD</bcp14> enable the DOTS data channel to co | ||||
| <t>DOTS agents SHOULD enable the DOTS data channel to configure | nfigure | |||
| aliases and ACLs, and only use direct configuration as a stop-gap | aliases and ACLs, and only use direct configuration as a stop-gap | |||
| mechanism to test DOTS signal channel with aliases and ACLs. | mechanism to test DOTS signal channel with aliases and ACLs. | |||
| Further, direct configuration SHOULD only be used when the on-path | Further, direct configuration <bcp14>SHOULD</bcp14> only be used when | |||
| DOTS agents are within the same domain.</t> | the on-path | |||
| DOTS agents are within the same domain.</li> | ||||
| <t>If a DOTS server has enabled direct configuration, it can reject | <li>If a DOTS server has enabled direct configuration, it can reject | |||
| the DOTS data channel connection using hard ICMP error <xref | the DOTS data channel connection using hard ICMP error <xref target="R | |||
| target="RFC1122"></xref> or RST (Reset) bit in the TCP header or | FC1122" format="default"/> or RST (Reset) bit in the TCP header or | |||
| reject the RESTCONF request using an error response containing a | reject the RESTCONF request using an error response containing a | |||
| "503 Service Unavailable" status-line.</t> | "503 Service Unavailable" status-line.</li> | |||
| </list></t> | </ul> | |||
| </section> | </section> | |||
| <section title="IANA Considerations"> | <section numbered="true" toc="default"> | |||
| <t>This document requests IANA to register the following URI in the "ns" | <name>IANA Considerations</name> | |||
| subregistry within the "IETF XML Registry" <xref | <t>IANA has registered the following URI in the "ns" | |||
| target="RFC3688"></xref>: <figure> | subregistry within the "IETF XML Registry" <xref target="RFC3688" format=" | |||
| <artwork><![CDATA[ URI: urn:ietf:params:xml:ns:yang:ietf-dots- | default"/>: </t> | |||
| data-channel | <dl newline="false" spacing="compact"> | |||
| Registrant Contact: The IESG. | <dt>ID:</dt> <dd>yang:ietf-dots-data-channel</dd> | |||
| XML: N/A; the requested URI is an XML namespace. | <dt>URI:</dt> <dd>urn:ietf:params:xml:ns:yang:ietf-dots-data-cha | |||
| ]]></artwork> | nnel</dd> | |||
| </figure> This document requests IANA to register the following YANG | <dt>Registrant Contact:</dt> <dd>The IESG.</dd> | |||
| module in the "YANG Module Names" subregistry <xref | <dt>XML:</dt><dd>N/A; the requested URI is an XML namespace.</dd | |||
| target="RFC7950"></xref> within the "YANG Parameters" registry.<figure> | > | |||
| <artwork><![CDATA[ Name: ietf-dots-data-channel | <dt>Reference: </dt><dd>RFC 8783</dd> | |||
| Namespace: urn:ietf:params:xml:ns:yang:ietf-dots-data-channel | </dl> | |||
| Prefix: data-channel | <t>IANA has registered the following YANG | |||
| Reference: RFC XXXX]]></artwork> | module in the "YANG Module Names" subregistry <xref target="RFC7950" forma | |||
| </figure></t> | t="default"/> | |||
| within the "YANG Parameters" registry.</t> | ||||
| <dl newline="false" spacing="compact"> | ||||
| <dt>Name:</dt><dd>ietf-dots-data-channel</dd> | ||||
| <dt>Namespace: </dt><dd>urn:ietf:params:xml:ns:yang:ietf-dots-data-channel</d | ||||
| d> | ||||
| <dt>Prefix: </dt><dd>data-channel</dd> | ||||
| <dt>Reference: </dt><dd>RFC 8783</dd> | ||||
| </dl> | ||||
| <t>This module is not maintained by IANA.</t> | <t>This module is not maintained by IANA.</t> | |||
| </section> | </section> | |||
| <section anchor="security" numbered="true" toc="default"> | ||||
| <section anchor="security" title="Security Considerations"> | <name>Security Considerations</name> | |||
| <t>RESTCONF security considerations are discussed in <xref | <t>RESTCONF security considerations are discussed in <xref target="RFC8040 | |||
| target="RFC8040"></xref>. In particular, DOTS agents MUST follow the | " format="default"/>. | |||
| security recommendations in Sections 2 and 12 of <xref | In particular, DOTS agents <bcp14>MUST</bcp14> follow the | |||
| target="RFC8040"></xref>. Also, DOTS agents MUST support the mutual | security recommendations in Sections <xref target="RFC8040" section="2" se | |||
| authentication TLS profile discussed in Sections 7.1 and 8 of <xref | ctionFormat="bare" format="default"/> and | |||
| target="I-D.ietf-dots-signal-channel"></xref>.</t> | <xref target="RFC8040" section="12" sectionFormat="bare" format="default"/ | |||
| > | ||||
| <t>Authenticated encryption MUST be used for data confidentiality and | of <xref target="RFC8040" format="default"/>. | |||
| Also, DOTS agents <bcp14>MUST</bcp14> support the mutual | ||||
| authentication TLS profile discussed in | ||||
| Sections <xref target="RFC8782" section="7.1" sectionFormat="bare" format= | ||||
| "default"/> and | ||||
| <xref target="RFC8782" section="8" sectionFormat="bare" format="default"/> | ||||
| of <xref target="RFC8782" format="default"/>.</t> | ||||
| <t>Authenticated encryption <bcp14>MUST</bcp14> be used for data confident | ||||
| iality and | ||||
| message integrity. The interaction between the DOTS agents requires | message integrity. The interaction between the DOTS agents requires | |||
| Transport Layer Security (TLS) with a cipher suite offering | Transport Layer Security (TLS) with a cipher suite offering | |||
| confidentiality protection and the guidance given in <xref | confidentiality protection, and the guidance given in <xref target="RFC752 | |||
| target="RFC7525"></xref> MUST be followed to avoid attacks on TLS.</t> | 5" format="default"/> | |||
| <bcp14>MUST</bcp14> be followed to avoid attacks on TLS.</t> | ||||
| <t>The installation of drop- or accept-list rules using RESTCONF over | <t>The installation of drop-list or accept-list rules using RESTCONF over | |||
| TLS reveals the attacker IP addresses and legitimate IP addresses only | TLS reveals the attacker IP addresses and legitimate IP addresses only | |||
| to the DOTS server trusted by the DOTS client. The secure communication | to the DOTS server trusted by the DOTS client. The secure communication | |||
| channel between DOTS agents provides privacy and prevents a network | channel between DOTS agents provides privacy and prevents a network | |||
| eavesdropper from directly gaining access to the drop- and accept-listed | eavesdropper from directly gaining access to the drop-listed and accept-li sted | |||
| IP addresses.</t> | IP addresses.</t> | |||
| <t>An attacker may be able to inject RST packets, bogus application | <t>An attacker may be able to inject RST packets, bogus application | |||
| segments, etc., regardless of whether TLS authentication is used. | segments, etc., regardless of whether TLS authentication is used. | |||
| Because the application data is TLS protected, this will not result in | Because the application data is TLS protected, this will not result in | |||
| the application receiving bogus data, but it will constitute a DoS on | the application receiving bogus data, but it will constitute a DoS on | |||
| the connection. This attack can be countered by using TCP-AO <xref | the connection. This attack can be countered by using | |||
| target="RFC5925"></xref>. If TCP-AO is used, then any bogus packets | TCP Authentication Option (TCP-AO) <xref target="RFC5925" format="default" | |||
| />. If TCP-AO is used, then any bogus packets | ||||
| injected by an attacker will be rejected by the TCP-AO integrity check | injected by an attacker will be rejected by the TCP-AO integrity check | |||
| and therefore will never reach the TLS layer.</t> | and therefore will never reach the TLS layer.</t> | |||
| <t>In order to prevent leaking internal information outside a | <t>In order to prevent leaking internal information outside a | |||
| client-domain, client-side DOTS gateways SHOULD NOT reveal the identity | client domain, client-side DOTS gateways <bcp14>SHOULD NOT</bcp14> reveal the identity | |||
| of internal DOTS clients (e.g., source IP address, client's hostname) | of internal DOTS clients (e.g., source IP address, client's hostname) | |||
| unless explicitly configured to do so.</t> | unless explicitly configured to do so.</t> | |||
| <t>DOTS servers <bcp14>MUST</bcp14> verify that requesting DOTS clients ar | ||||
| <t>DOTS servers MUST verify that requesting DOTS clients are entitled to | e entitled to | |||
| enforce filtering rules on a given IP prefix. That is, only filtering | enforce filtering rules on a given IP prefix. That is, only filtering | |||
| rules on IP resources that belong to the DOTS client domain can be | rules on IP resources that belong to the DOTS client domain can be | |||
| authorized by a DOTS server. The exact mechanism for the DOTS servers to | authorized by a DOTS server. The exact mechanism for the DOTS servers to | |||
| validate that the target prefixes are within the scope of the DOTS | validate that the target prefixes are within the scope of the DOTS | |||
| client domain is deployment-specific.</t> | client domain is deployment specific.</t> | |||
| <t>Rate-limiting DOTS requests, including those with new 'cuid' values, | <t>Rate-limiting DOTS requests, including those with new 'cuid' values, | |||
| from the same DOTS client defends against DoS attacks that would result | from the same DOTS client defends against DoS attacks that would result | |||
| from varying the 'cuid' to exhaust DOTS server resources. Rate-limit | from varying the 'cuid' to exhaust DOTS server resources. Rate-limit | |||
| policies SHOULD be enforced on DOTS gateways (if deployed) and DOTS | policies <bcp14>SHOULD</bcp14> be enforced on DOTS gateways (if deployed) and DOTS | |||
| servers.</t> | servers.</t> | |||
| <t>Applying resources quota per DOTS client and/or per DOTS client | <t>Applying resources quota per DOTS client and/or per DOTS client | |||
| domain (e.g., limit the number of aliases and filters to be installed by | domain (e.g., limiting the number of aliases and filters to be installed b | |||
| DOTS clients) prevents DOTS server resources to be aggressively used by | y | |||
| some DOTS clients and ensures, therefore, DDoS mitigation usage | DOTS clients) prevents DOTS server resources from being aggressively used | |||
| by | ||||
| some DOTS clients and therefore ensures DDoS mitigation usage | ||||
| fairness. Additionally, DOTS servers may limit the number of DOTS | fairness. Additionally, DOTS servers may limit the number of DOTS | |||
| clients that can be enabled per domain.</t> | clients that can be enabled per domain.</t> | |||
| <t>When FQDNs are used as targets, the DOTS server <bcp14>MUST</bcp14> rel | ||||
| <t>When FQDNs are used as targets, the DOTS server MUST rely upon DNS | y upon DNS | |||
| privacy enabling protocols (e.g., DNS over TLS <xref | privacy enabling protocols (e.g., DNS over TLS <xref target="RFC7858" form | |||
| target="RFC7858"></xref> or DoH <xref target="RFC8484"></xref>) to | at="default"/> | |||
| or DNS over HTTPS (DoH) <xref target="RFC8484" format="default"/>) to | ||||
| prevent eavesdroppers from possibly identifying the target resources | prevent eavesdroppers from possibly identifying the target resources | |||
| protected by the DDoS mitigation service, and means to ensure the target | protected by the DDoS mitigation service, and means to ensure the target | |||
| FQDN resolution is authentic (e.g., DNSSEC <xref | FQDN resolution is authentic (e.g., DNSSEC <xref target="RFC4034" format=" | |||
| target="RFC4034"></xref>).</t> | default"/>).</t> | |||
| <t>The presence of DOTS gateways may lead to infinite forwarding loops, | <t>The presence of DOTS gateways may lead to infinite forwarding loops, | |||
| which is undesirable. To prevent and detect such loops, a mechanism is | which is undesirable. To prevent and detect such loops, a mechanism is | |||
| defined in <xref target="loops"></xref>.</t> | defined in <xref target="loops" format="default"/>.</t> | |||
| <t> | ||||
| <t>All data nodes defined in the YANG module which can be created, | The YANG module specified in this document defines a schema for data | |||
| modified, and deleted (i.e., config true, which is the default) are | that is designed to be accessed via network management protocols such | |||
| considered sensitive. Write operations applied to these data nodes | as NETCONF <xref target="RFC6241"/> or RESTCONF <xref target="RFC8040"/>. | |||
| without proper protection can negatively affect network operations. This | The lowest NETCONF layer is the secure transport layer, and the | |||
| module reuses YANG structures from <xref target="RFC8519"></xref>, and | mandatory-to-implement secure transport is Secure Shell (SSH) | |||
| the security considerations for those nodes continue to apply for this | <xref target="RFC6242"/>. The lowest RESTCONF layer is HTTPS, and the | |||
| usage. Appropriate security measures are recommended to prevent | mandatory-to-implement secure transport is TLS <xref target="RFC8446"/>. | |||
| illegitimate users from invoking DOTS data channel primitives. | </t> | |||
| Nevertheless, an attacker who can access a DOTS client is technically | <t> | |||
| capable of launching various attacks, such as:<list style="symbols"> | The Network Configuration Access Control Model (NACM) <xref target="RFC8341"/> | |||
| <t>Setting an arbitrarily low rate-limit, which may prevent | provides the means to restrict access for particular NETCONF or RESTCONF users | |||
| legitimate traffic from being forwarded (rate-limit).</t> | to a preconfigured subset of all available NETCONF or RESTCONF protocol | |||
| operations and content. | ||||
| <t>Setting an arbitrarily high rate-limit, which may lead to the | </t> | |||
| forwarding of illegitimate DDoS traffic (rate-limit).</t> | ||||
| <t>Communicating invalid aliases to the server (alias), which will | ||||
| cause the failure of associating both data and signal channels.</t> | ||||
| <t>Setting invalid ACL entries, which may prevent legitimate traffic | <t> | |||
| There are a number of data nodes defined in this YANG module that are | ||||
| writable/creatable/deletable (i.e., config true, which is the default). | ||||
| These data nodes may be considered sensitive or vulnerable in some network | ||||
| environments. Write operations (e.g., edit-config) to these data nodes | ||||
| without proper protection can have a negative effect on network operations. | ||||
| The DOTS data channel is responsible for exchanging configuration data | ||||
| that affect traffic filtering during DDoS attack mitigation, in particular. | ||||
| Appropriate security measures are recommended to prevent illegitimate users fr | ||||
| om | ||||
| invoking DOTS data channel primitives on writable data nodes. | ||||
| Nevertheless, an attacker who can access a DOTS client is technically | ||||
| capable of launching various attacks, such as: | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li>Setting an arbitrarily low rate-limit, which may prevent | ||||
| legitimate traffic from being forwarded (rate-limit).</li> | ||||
| <li>Setting an arbitrarily high rate-limit, which may lead to the | ||||
| forwarding of illegitimate DDoS traffic (rate-limit).</li> | ||||
| <li>Communicating invalid aliases to the server (alias), which will | ||||
| cause the failure of associating both data and signal channels.</li> | ||||
| <li>Setting invalid ACL entries, which may prevent legitimate traffic | ||||
| from being forwarded. Likewise, invalid ACL entries may lead to | from being forwarded. Likewise, invalid ACL entries may lead to | |||
| forward DDoS traffic.</t> | forward DDoS traffic.</li> | |||
| </list></t> | </ul> | |||
| </section> | <t> | |||
| This module reuses YANG structures from <xref target="RFC8519"/>, and the secu | ||||
| <section title="Contributing Authors"> | rity | |||
| <t>The following individuals co-authored this document:</t> | considerations for those nodes continue to apply for this usage. | |||
| </t> | ||||
| <t><figure> | ||||
| <artwork><![CDATA[ Kaname Nishizuka | ||||
| NTT Communications | ||||
| GranPark 16F 3-4-1 Shibaura, Minato-ku | ||||
| Tokyo 108-8118 | ||||
| Japan | ||||
| Email: kaname@nttv6.jp | ||||
| Liang Xia | ||||
| Huawei | ||||
| 101 Software Avenue, Yuhuatai District | ||||
| Nanjing, Jiangsu 210012 | ||||
| China | ||||
| Email: frank.xialiang@huawei.com | ||||
| Prashanth Patil | ||||
| Cisco Systems, Inc. | ||||
| Email: praspati@cisco.com | ||||
| Andrew Mortensen | ||||
| Arbor Networks, Inc. | ||||
| 2727 S. State St | ||||
| Ann Arbor, MI 48104 | ||||
| United States | ||||
| Email: andrew.mortensen@netscout.com | ||||
| Nik Teague | ||||
| Iron Mountain Data Centers | ||||
| United Kingdom | ||||
| Email: nteague@ironmountain.co.uk]]></artwork> | ||||
| </figure></t> | ||||
| </section> | ||||
| <section anchor="contr" title="Contributors"> | ||||
| <t>The following individuals have contributed to this document:<list | ||||
| style="symbols"> | ||||
| <t>Dan Wing, Email: dwing-ietf@fuggles.com</t> | ||||
| <t>Jon Shallow, NCC Group, Email: jon.shallow@nccgroup.com</t> | ||||
| </list></t> | ||||
| </section> | ||||
| <section anchor="ack" title="Acknowledgements"> | ||||
| <t>Thanks to Christian Jacquenet, Roland Dobbins, Roman Danyliw, Ehud | ||||
| Doron, Russ White, Gilbert Clark, Kathleen Moriarty, Nesredien Suleiman, | ||||
| Roni Even, and Brian Trammel for the discussion and comments.</t> | ||||
| <t>The authors would like to give special thanks to Kaname Nishizuka and | ||||
| Jon Shallow for their efforts in implementing the protocol and | ||||
| performing interop testing at IETF Hackathons.</t> | ||||
| <t>Many thanks to Ben Kaduk for the detailed AD review.</t> | ||||
| <t>Thanks to Martin Bjorklund for the guidance on RESTCONF.</t> | ||||
| <t>Thanks to Alexey Melnikov, Adam Roach, Suresh Krishnan, Mirja | ||||
| Kühlewind, and Warren Kumari for the review.</t> | ||||
| </section> | </section> | |||
| </middle> | </middle> | |||
| <back> | <back> | |||
| <references title="Normative References"> | <displayreference target="I-D.ietf-dots-architecture" to="DOTS-ARCH"/> | |||
| <?rfc include="reference.RFC.2119"?> | <displayreference target="I-D.ietf-dots-server-discovery" to="DOTS-SERVER-DI | |||
| SC"/> | ||||
| <?rfc include="reference.RFC.7525"?> | <displayreference target="I-D.ietf-netconf-restconf-client-server" to="RESTC | |||
| ONF-MODELS"/> | ||||
| <?rfc include="reference.RFC.8040"?> | <references> | |||
| <name>References</name> | ||||
| <?rfc include="reference.RFC.8519"?> | <references> | |||
| <name>Normative References</name> | ||||
| <?rfc include="reference.I-D.ietf-dots-signal-channel"?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| FC.2119.xml"/> | ||||
| <?rfc include="reference.RFC.7951"?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| FC.7525.xml"/> | ||||
| <?rfc include='reference.RFC.3688'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| FC.8040.xml"/> | ||||
| <?rfc include='reference.RFC.8174'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| FC.8519.xml"/> | ||||
| <?rfc include='reference.RFC.4632'?> | <reference anchor="RFC8782" target="https://www.rfc-editor.org/info/rfc8 | |||
| 782"> | ||||
| <?rfc include='reference.RFC.6991'?> | <front> | |||
| <title>Distributed Denial-of-Service Open Threat Signaling (DOTS) Si | ||||
| <?rfc include='reference.RFC.7230'?> | gnal Channel Specification</title> | |||
| <author initials="T" surname="Reddy.K" fullname="Tirumaleswar Reddy. | ||||
| <?rfc include="reference.RFC.7950"?> | K" role="editor"> | |||
| <organization/> | ||||
| <?rfc include="reference.RFC.8259"?> | </author> | |||
| <author initials="M" surname="Boucadair" fullname="Mohamed Boucadair | ||||
| <?rfc include='reference.RFC.6125'?> | " role="editor"> | |||
| </references> | <organization/> | |||
| </author> | ||||
| <references title="Informative References"> | <author initials="P" surname="Patil" fullname="Prashanth Patil"> | |||
| <?rfc include='reference.RFC.1122'?> | <organization/> | |||
| </author> | ||||
| <?rfc include="reference.I-D.ietf-dots-architecture"?> | <author initials="A" surname="Mortensen" fullname="Andrew Mortensen" | |||
| > | ||||
| <?rfc include='reference.RFC.8499'?> | <organization/> | |||
| </author> | ||||
| <?rfc include='reference.RFC.4034'?> | <author initials="N" surname="Teague" fullname="Nik Teague"> | |||
| <organization/> | ||||
| <?rfc include='reference.RFC.7858'?> | </author> | |||
| <date month="May" year="2020"/> | ||||
| <?rfc include='reference.RFC.8484'?> | </front> | |||
| <seriesInfo name="RFC" value="8782"/> | ||||
| <?rfc include='reference.RFC.4340'?> | <seriesInfo name="DOI" value="10.17487/RFC8782"/> | |||
| </reference> | ||||
| <?rfc include="reference.RFC.5925"?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| FC.7951.xml"/> | ||||
| <?rfc include="reference.RFC.6520"?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| FC.3688.xml"/> | ||||
| <?rfc include='reference.RFC.3986'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| FC.8174.xml"/> | ||||
| <?rfc include='reference.RFC.4960'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| FC.4632.xml"/> | ||||
| <?rfc include="reference.RFC.8612"?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| FC.6991.xml"/> | ||||
| <?rfc include='reference.RFC.8340'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| FC.7230.xml"/> | ||||
| <?rfc include='reference.RFC.5575'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| FC.7950.xml"/> | ||||
| <?rfc include='reference.I-D.ietf-dots-server-discovery'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| FC.8259.xml"/> | ||||
| <?rfc include='reference.I-D.ietf-netconf-restconf-client-server'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| FC.6125.xml"/> | ||||
| <reference anchor="proto_numbers" | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| target="http://www.iana.org/assignments/protocol-numbers"> | FC.8446.xml"/> | |||
| <front> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| <title>IANA, "Protocol Numbers"</title> | FC.6241.xml"/> | |||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| <author> | FC.6242.xml"/> | |||
| <organization></organization> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| </author> | FC.8341.xml"/> | |||
| </references> | ||||
| <date year="2011" /> | <references> | |||
| </front> | <name>Informative References</name> | |||
| </reference> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| FC.1122.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference. | ||||
| I-D.ietf-dots-architecture.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.8499.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.4034.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.7858.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.8484.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.4340.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.5925.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.6520.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.3986.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.4960.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.8612.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.8340.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.5575.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference. | ||||
| I-D.ietf-dots-server-discovery.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference. | ||||
| I-D.ietf-netconf-restconf-client-server.xml"/> | ||||
| <reference anchor="IANA-PROTO" target="http://www.iana.org/assignments/p | ||||
| rotocol-numbers"> | ||||
| <front> | ||||
| <title>Protocol Numbers</title> | ||||
| <author> | ||||
| <organization>IANA</organization> | ||||
| </author> | ||||
| <date></date> | ||||
| </front> | ||||
| </reference> | ||||
| </references> | ||||
| </references> | </references> | |||
| <section anchor="frag" numbered="true" toc="default"> | ||||
| <section anchor="frag" title="Sample Examples: Filtering Fragments"> | <name>Examples: Filtering Fragments</name> | |||
| <t>This specification strongly recommends the use of "fragment" for | <t>This specification strongly recommends the use of 'fragment' for | |||
| handling fragments.</t> | handling fragments.</t> | |||
| <t><xref target="fragdnsv4" format="default"/> shows the content of the PO | ||||
| <t><xref target="fragdnsv4"></xref> shows the content of the POST | ST | |||
| request to be issued by a DOTS client to its DOTS server to allow the | request to be issued by a DOTS client to its DOTS server to allow the | |||
| traffic destined to 198.51.100.0/24 and UDP port number 53, but to drop | traffic destined to 198.51.100.0/24 and UDP port number 53, but to drop | |||
| all fragmented packets. The following ACEs are defined (in this | all fragmented packets. The following ACEs are defined (in this | |||
| order):</t> | order):</t> | |||
| <ul spacing="normal"> | ||||
| <li>"drop-all-fragments" ACE: discards all fragments.</li> | ||||
| <li>"allow-dns-packets" ACE: accepts DNS packets destined to | ||||
| 198.51.100.0/24.</li> | ||||
| </ul> | ||||
| <figure anchor="fragdnsv4"> | ||||
| <name>Filtering IPv4 Fragmented Packets</name> | ||||
| <sourcecode type=""><![CDATA[ | ||||
| POST /restconf/data/ietf-dots-data-channel:dots-data\ | ||||
| /dots-client=dz6pHjaADkaFTbjr0JGBpw HTTP/1.1 | ||||
| Host: example.com | ||||
| Content-Type: application/yang-data+json | ||||
| <t><list style="symbols"> | { | |||
| <t>"drop-all-fragments" ACE: discards all fragments.</t> | ||||
| <t>"allow-dns-packets" ACE: accepts DNS packets destined to | ||||
| 198.51.100.0/24.</t> | ||||
| </list></t> | ||||
| <t><figure anchor="fragdnsv4" title="Filtering IPv4 Fragmented Packets"> | ||||
| <artwork align="left"><![CDATA[ POST /restconf/data/ietf-dots-data-cha | ||||
| nnel:dots-data\ | ||||
| /dots-client=dz6pHjaADkaFTbjr0JGBpw HTTP/1.1 | ||||
| Host: example.com | ||||
| Content-Type: application/yang-data+json | ||||
| { | ||||
| "ietf-dots-data-channel:acls": { | "ietf-dots-data-channel:acls": { | |||
| "acl": [ | "acl": [ | |||
| { | { | |||
| "name": "dns-fragments", | "name": "dns-fragments", | |||
| "type": "ipv4-acl-type", | "type": "ipv4-acl-type", | |||
| "aces": { | "aces": { | |||
| "ace": [ | "ace": [ | |||
| { | { | |||
| "name": "drop-all-fragments", | "name": "drop-all-fragments", | |||
| "matches": { | "matches": { | |||
| "ipv4": { | "ipv4": { | |||
| "fragment": { | "fragment": { | |||
| "operator": "match", | "operator": "match", | |||
| "type": "isf" | "type": "isf" | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "actions": { | "actions": { | |||
| "forwarding": "drop" | "forwarding": "drop" | |||
| } | } | |||
| } | }, | |||
| ] | ||||
| "ace": [ | ||||
| { | { | |||
| "name": "allow-dns-packets", | "name": "allow-dns-packets", | |||
| "matches": { | "matches": { | |||
| "ipv4": { | "ipv4": { | |||
| "destination-ipv4-network": "198.51.100.0/24" | "destination-ipv4-network": "198.51.100.0/24" | |||
| } | }, | |||
| "udp": { | "udp": { | |||
| "destination-port": { | "destination-port-range-or-operator": { | |||
| "operator": "eq", | "operator": "eq", | |||
| "port": 53 | "port": 53 | |||
| } | ||||
| }, | ||||
| "actions": { | ||||
| "forwarding": "accept" | ||||
| } | } | |||
| }, | ||||
| "actions": { | ||||
| "forwarding": "accept" | ||||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| }]]></artwork> | } | |||
| </figure></t> | ]]></sourcecode> | |||
| </figure> | ||||
| <t><xref target="fragdnsv6"></xref> shows a POST request example issued | <t><xref target="fragdnsv6" format="default"/> shows an example of a POST | |||
| request issued | ||||
| by a DOTS client to its DOTS server to allow the traffic destined to | by a DOTS client to its DOTS server to allow the traffic destined to | |||
| 2001:db8::/32 and UDP port number 53, but to drop all fragmented | 2001:db8::/32 and UDP port number 53, but to drop all fragmented | |||
| packets. The following ACEs are defined (in this order):</t> | packets. The following ACEs are defined (in this order):</t> | |||
| <ul spacing="normal"> | ||||
| <li>"drop-all-fragments" ACE: discards all fragments (including | ||||
| atomic fragments). That is, IPv6 packets that include a Fragment | ||||
| header (44) are dropped.</li> | ||||
| <li>"allow-dns-packets" ACE: accepts DNS packets destined to | ||||
| 2001:db8::/32.</li> | ||||
| </ul> | ||||
| <figure anchor="fragdnsv6"> | ||||
| <name>Filtering IPv6 Fragmented Packets</name> | ||||
| <sourcecode type=""><![CDATA[ | ||||
| POST /restconf/data/ietf-dots-data-channel:dots-data\ | ||||
| /dots-client=dz6pHjaADkaFTbjr0JGBpw HTTP/1.1 | ||||
| Host: example.com | ||||
| Content-Type: application/yang-data+json | ||||
| <t><list style="symbols"> | { | |||
| <t>"drop-all-fragments" ACE: discards all fragments (including | ||||
| atomic fragments). That is, IPv6 packets which include a Fragment | ||||
| header (44) are dropped.</t> | ||||
| <t>"allow-dns-packets" ACE: accepts DNS packets destined to | ||||
| 2001:db8::/32.</t> | ||||
| </list></t> | ||||
| <t><figure anchor="fragdnsv6" title="Filtering IPv6 Fragmented Packets"> | ||||
| <artwork align="left"><![CDATA[ POST /restconf/data/ietf-dots-data-cha | ||||
| nnel:dots-data\ | ||||
| /dots-client=dz6pHjaADkaFTbjr0JGBpw HTTP/1.1 | ||||
| Host: example.com | ||||
| Content-Type: application/yang-data+json | ||||
| { | ||||
| "ietf-dots-data-channel:acls": { | "ietf-dots-data-channel:acls": { | |||
| "acl": [ | "acl": [ | |||
| { | { | |||
| "name": "dns-fragments", | "name": "dns-fragments", | |||
| "type": "ipv6-acl-type", | "type": "ipv6-acl-type", | |||
| "aces": { | "aces": { | |||
| "ace": [ | "ace": [ | |||
| { | { | |||
| "name": "drop-all-fragments", | "name": "drop-all-fragments", | |||
| "matches": { | "matches": { | |||
| "ipv6": { | "ipv6": { | |||
| "fragment": { | "fragment": { | |||
| "operator": "match", | "operator": "match", | |||
| "type": "isf" | "type": "isf" | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "actions": { | "actions": { | |||
| "forwarding": "drop" | "forwarding": "drop" | |||
| } | } | |||
| } | }, | |||
| ] | ||||
| "ace": [ | ||||
| { | { | |||
| "name": "allow-dns-packets", | "name": "allow-dns-packets", | |||
| "matches": { | "matches": { | |||
| "ipv6": { | "ipv6": { | |||
| "destination-ipv6-network": "2001:db8::/32" | "destination-ipv6-network": "2001:db8::/32" | |||
| } | }, | |||
| "udp": { | "udp": { | |||
| "destination-port": { | "destination-port-range-or-operator": { | |||
| "operator": "eq", | "operator": "eq", | |||
| "port": 53 | "port": 53 | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "actions": { | "actions": { | |||
| "forwarding": "accept" | "forwarding": "accept" | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| ]]></artwork> | ]]> | |||
| </figure></t> | </sourcecode> | |||
| </figure> | ||||
| </section> | </section> | |||
| <section anchor="flags" numbered="true" toc="default"> | ||||
| <section anchor="flags" title="Sample Examples: Filtering TCP Messages"> | <name>Examples: Filtering TCP Messages</name> | |||
| <t>This section provides sample examples to illustrate TCP-specific | <t>This section provides examples to illustrate TCP-specific | |||
| filtering based on the flag bits. These examples should not be | filtering based on the flag bits. These examples should not be | |||
| interpreted as recommended filtering behaviors under specific DDoS | interpreted as recommended filtering behaviors under specific DDoS | |||
| attacks.</t> | attacks.</t> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Discard TCP Null Attack"> | <name>Discard TCP Null Attack</name> | |||
| <t><xref target="ex3"></xref> shows an example of a DOTS request sent | <t><xref target="ex3" format="default"/> shows an example of a DOTS requ | |||
| est sent | ||||
| by a DOTS client to install immediately a filter to discard incoming | by a DOTS client to install immediately a filter to discard incoming | |||
| TCP messages having all flags unset. The bitmask can be set to 255 to | TCP messages having all flags unset. The bitmask can be set to 255 to | |||
| check against the (CWR, ECE, URG, ACK, PSH, RST, SYN, FIN) flags.</t> | check against the (CWR, ECE, URG, ACK, PSH, RST, SYN, FIN) flags.</t> | |||
| <figure anchor="ex3"> | ||||
| <t><figure anchor="ex3" | <name>Example of a DOTS Request to Deny TCP Null Attack Messages</name | |||
| title="Example of a DOTS Request to Deny TCP Null Attack Messages"> | > | |||
| <artwork><![CDATA[PUT /restconf/data/ietf-dots-data-channel:dots-dat | <sourcecode type=""><![CDATA[ | |||
| a\ | PUT /restconf/data/ietf-dots-data-channel:dots-data\ | |||
| /dots-client=paL8p4Zqo4SLv64TLPXrxA/acls\ | /dots-client=paL8p4Zqo4SLv64TLPXrxA/acls\ | |||
| /acl=tcp-flags-example HTTP/1.1 | /acl=tcp-flags-example HTTP/1.1 | |||
| Host: example.com | Host: example.com | |||
| Content-Type: application/yang-data+json | Content-Type: application/yang-data+json | |||
| { | { | |||
| "ietf-dots-data-channel:acls": { | "ietf-dots-data-channel:acls": { | |||
| "acl": [{ | "acl": [{ | |||
| "name": "tcp-flags-example", | "name": "tcp-flags-example", | |||
| "activation-type": "immediate", | "activation-type": "immediate", | |||
| skipping to change at line 3191 ¶ | skipping to change at line 3044 ¶ | |||
| } | } | |||
| }, | }, | |||
| "actions": { | "actions": { | |||
| "forwarding": "drop" | "forwarding": "drop" | |||
| } | } | |||
| }] | }] | |||
| } | } | |||
| }] | }] | |||
| } | } | |||
| } | } | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure></t> | </figure> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Rate-Limit SYN Flooding"> | <name>Rate-Limit SYN Flooding</name> | |||
| <t><xref target="syn-rate"></xref> shows an ACL example to rate-limit | <t><xref target="syn-rate" format="default"/> shows an ACL example to ra | |||
| incoming SYNs during a SYN-flood attack.<figure anchor="syn-rate" | te-limit | |||
| title="Example of DOTS Request to Rate-Limit Incoming TCP SYNs"> | incoming SYNs during a SYN flood attack.</t> | |||
| <artwork><![CDATA[PUT /restconf/data/ietf-dots-data-channel:dots-dat | <figure anchor="syn-rate"> | |||
| a\ | <name>Example of DOTS Request to Rate-Limit Incoming TCP SYNs</name> | |||
| <sourcecode type=""><![CDATA[ | ||||
| PUT /restconf/data/ietf-dots-data-channel:dots-data\ | ||||
| /dots-client=paL8p4Zqo4SLv64TLPXrxA/acls\ | /dots-client=paL8p4Zqo4SLv64TLPXrxA/acls\ | |||
| /acl=tcp-flags-example HTTP/1.1 | /acl=tcp-flags-example HTTP/1.1 | |||
| Host: example.com | Host: example.com | |||
| Content-Type: application/yang-data+json | Content-Type: application/yang-data+json | |||
| { | { | |||
| "ietf-dots-data-channel:acls": { | "ietf-dots-data-channel:acls": { | |||
| "acl": [{ | "acl": [{ | |||
| "name": "tcp-flags-example", | "name": "tcp-flags-example", | |||
| "activation-type": "activate-when-mitigating", | "activation-type": "activate-when-mitigating", | |||
| skipping to change at line 3230 ¶ | skipping to change at line 3085 ¶ | |||
| }, | }, | |||
| "actions": { | "actions": { | |||
| "forwarding": "accept", | "forwarding": "accept", | |||
| "rate-limit": "20.00" | "rate-limit": "20.00" | |||
| } | } | |||
| }] | }] | |||
| } | } | |||
| }] | }] | |||
| } | } | |||
| } | } | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure></t> | </figure> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Rate-Limit ACK Flooding"> | <name>Rate-Limit ACK Flooding</name> | |||
| <t><xref target="ex1"></xref> shows an ACL example to rate-limit | <t><xref target="ex1" format="default"/> shows an ACL example to rate-li | |||
| incoming ACKs during an ACK-flood attack.</t> | mit | |||
| incoming ACKs during an ACK flood attack.</t> | ||||
| <t><figure anchor="ex1" | <figure anchor="ex1"> | |||
| title="Example of DOTS Request to Rate-Limit Incoming TCP ACKs"> | <name>Example of DOTS Request to Rate-Limit Incoming TCP ACKs</name> | |||
| <artwork><![CDATA[PUT /restconf/data/ietf-dots-data-channel:dots-dat | <sourcecode type=""><![CDATA[ | |||
| a\ | PUT /restconf/data/ietf-dots-data-channel:dots-data\ | |||
| /dots-client=paL8p4Zqo4SLv64TLPXrxA/acls\ | /dots-client=paL8p4Zqo4SLv64TLPXrxA/acls\ | |||
| /acl=tcp-flags-example HTTP/1.1 | /acl=tcp-flags-example HTTP/1.1 | |||
| Host: example.com | Host: example.com | |||
| Content-Type: application/yang-data+json | Content-Type: application/yang-data+json | |||
| { | { | |||
| "ietf-dots-data-channel:acls": { | "ietf-dots-data-channel:acls": { | |||
| "acl": [{ | "acl": [{ | |||
| "name": "tcp-flags-example", | "name": "tcp-flags-example", | |||
| "type": "ipv4-acl-type", | "type": "ipv4-acl-type", | |||
| skipping to change at line 3272 ¶ | skipping to change at line 3127 ¶ | |||
| }, | }, | |||
| "actions": { | "actions": { | |||
| "forwarding": "accept", | "forwarding": "accept", | |||
| "rate-limit": "20.00" | "rate-limit": "20.00" | |||
| } | } | |||
| }] | }] | |||
| } | } | |||
| }] | }] | |||
| } | } | |||
| } | } | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure></t> | </figure> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="ack" numbered="false" toc="default"> | ||||
| <name>Acknowledgements</name> | ||||
| <t>Thanks to <contact fullname="Christian Jacquenet"/>, | ||||
| <contact fullname="Roland Dobbins"/>, <contact fullname="Roman Danyliw"/>, | ||||
| <contact fullname="Ehud Doron"/>, <contact fullname="Russ White"/>, | ||||
| <contact fullname="Gilbert Clark"/>, <contact fullname="Kathleen Moriarty" | ||||
| />, | ||||
| <contact fullname="Nesredien Suleiman"/>, <contact fullname="Roni Even"/>, | ||||
| and | ||||
| <contact fullname="Brian Trammel"/> for the discussion and comments.</t> | ||||
| <t>The authors would like to give special thanks to <contact fullname="Kan | ||||
| ame Nishizuka"/> and | ||||
| <contact fullname="Jon Shallow"/> for their efforts in implementing the pr | ||||
| otocol and | ||||
| performing interop testing at IETF Hackathons.</t> | ||||
| <t>Many thanks to <contact fullname="Benjamin Kaduk"/> for the detailed AD | ||||
| review.</t> | ||||
| <t>Thanks to <contact fullname="Martin Björklund"/> for the guidance on RE | ||||
| STCONF.</t> | ||||
| <t>Thanks to <contact fullname="Alexey Melnikov"/>, <contact fullname="Ada | ||||
| m Roach"/>, | ||||
| <contact fullname="Suresh Krishnan"/>, <contact fullname="Mirja Kühlewind" | ||||
| />, and | ||||
| <contact fullname="Warren Kumari"/> for the review.</t> | ||||
| </section> | ||||
| <section numbered="false" toc="default"> | ||||
| <name>Contributors</name> | ||||
| <t>The following people contributed substantially to the content of this | ||||
| document and should be considered coauthors:</t> | ||||
| <contact fullname="Kaname Nishizuka" > | ||||
| <organization>NTT Communications</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <street>GranPark 16F 3-4-1 Shibaura, Minato-ku</street> | ||||
| <city></city> | ||||
| <region>Tokyo</region><code>108-8118</code> | ||||
| <country>Japan</country> | ||||
| </postal> | ||||
| <email>kaname@nttv6.jp</email> | ||||
| </address> | ||||
| </contact> | ||||
| <contact fullname="Liang Xia" > | ||||
| <organization>Huawei</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <street>101 Software Avenue, Yuhuatai District</street> | ||||
| <city>Nanjing</city> | ||||
| <region>Jiangsu</region><code>210012</code> | ||||
| <country>China</country> | ||||
| </postal> | ||||
| <email>frank.xialiang@huawei.com</email> | ||||
| </address> | ||||
| </contact> | ||||
| <contact fullname="Prashanth Patil" > | ||||
| <organization>Cisco Systems, Inc.</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <street></street> | ||||
| <city></city> | ||||
| <region></region><code></code> | ||||
| <country></country> | ||||
| </postal> | ||||
| <email>praspati@cisco.com</email> | ||||
| </address> | ||||
| </contact> | ||||
| <contact fullname="Andrew Mortensen" > | ||||
| <organization>Arbor Networks, Inc.</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <street>2727 S. State Street</street> | ||||
| <city>Ann Arbor</city> | ||||
| <region>Michigan</region><code>48104</code> | ||||
| <country>United States of America</country> | ||||
| </postal> | ||||
| <email>andrew@moretension.com</email> | ||||
| </address> | ||||
| </contact> | ||||
| <contact fullname="Nik Teague" > | ||||
| <organization>Iron Mountain Data Centers</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <street></street> | ||||
| <city></city> | ||||
| <region></region><code></code> | ||||
| <country>United Kingdom</country> | ||||
| </postal> | ||||
| <email>nteague@ironmountain.co.uk</email> | ||||
| </address> | ||||
| </contact> | ||||
| <t>The following individuals have contributed to this | ||||
| document:</t> | ||||
| <contact fullname="Dan Wing" > | ||||
| <organization></organization> | ||||
| <address> | ||||
| <postal> | ||||
| <street></street> | ||||
| <city></city> | ||||
| <region></region><code></code> | ||||
| <country></country> | ||||
| </postal> | ||||
| <email>dwing-ietf@fuggles.com</email> | ||||
| </address> | ||||
| </contact> | ||||
| <contact fullname="Jon Shallow" > | ||||
| <organization>NCC Group</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <street></street> | ||||
| <city></city> | ||||
| <region></region><code></code> | ||||
| <country></country> | ||||
| </postal> | ||||
| <email>jon.shallow@nccgroup.com</email> | ||||
| </address> | ||||
| </contact> | ||||
| </section> | ||||
| </back> | </back> | |||
| </rfc> | </rfc> | |||
| End of changes. 334 change blocks. | ||||
| 1555 lines changed or deleted | 1712 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||