rfc8828xml2.original.xml | rfc8828.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="us-ascii"?> | <?xml version='1.0' encoding='utf-8'?> | |||
<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | ||||
<!-- [rfced] updated by Chris /07/26/19 --> | ||||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd"> | ||||
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> | <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> | |||
<?rfc toc="yes" ?> | ||||
<?rfc symrefs="yes" ?> | ||||
<?rfc iprnotified="no" ?> | ||||
<?rfc strict="yes" ?> | ||||
<?rfc compact="yes" ?> | ||||
<?rfc sortrefs="yes" ?> | ||||
<?rfc colonspace="yes" ?> | ||||
<?rfc tocdepth="4"?> | ||||
<?rfc subcompact="no"?> | ||||
<rfc submissionType="IETF" category="std" consensus="yes" number="XXXX" ipr="tru | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" submissionType="IETF" | |||
st200902"> | category="std" consensus="true" number="8828" ipr="trust200902" | |||
obsoletes="" updates="" xml:lang="en" tocInclude="true" symRefs="true" | ||||
sortRefs="true" version="3" docName="draft-ietf-rtcweb-ip-handling-12"> | ||||
<!-- xml2rfc v2v3 conversion 2.34.0 --> | ||||
<front> | <front> | |||
<title abbrev="WebRTC IP Handling">WebRTC IP Address Handling | <title abbrev="WebRTC IP Handling">WebRTC IP Address Handling | |||
Requirements</title> | Requirements</title> | |||
<seriesInfo name="RFC" value="8828"/> | ||||
<author fullname="Justin Uberti" initials="J." surname="Uberti"> | <author fullname="Justin Uberti" initials="J." surname="Uberti"> | |||
<organization>Google</organization> | <organization>Google</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>747 6th St S</street> | <street>747 6th St S</street> | |||
<city>Kirkland</city> | <city>Kirkland</city> | |||
<region>WA</region> | <region>WA</region> | |||
<code>98033</code> | <code>98033</code> | |||
<country>USA</country> | <country>United States of America</country> | |||
</postal> | </postal> | |||
<email>justin@uberti.name</email> | <email>justin@uberti.name</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date year="2019" month="July" /> | <date month="July" year="2020"/> | |||
<area>RAI</area> | <area>RAI</area> | |||
<!-- [rfced] Please insert any keywords (beyond those that appear in | <!-- [rfced] Please insert any keywords (beyond those that appear in | |||
the title) for use on https://www.rfc-editor.org/search. --> | the title) for use on https://www.rfc-editor.org/search. --> | |||
<keyword>example</keyword> | ||||
<keyword>example</keyword> | ||||
<abstract> | <abstract> | |||
<t>This document provides information and requirements for how IP | <t>This document provides information and requirements for how IP | |||
addresses should be handled by WebRTC implementations.</t> | addresses should be handled by Web Real-Time Communication (WebRTC) implem entations.</t> | |||
</abstract> | </abstract> | |||
</front> | </front> | |||
<middle> | <middle> | |||
<section title="Introduction"> | <section numbered="true" toc="default"> | |||
<name>Introduction</name> | ||||
<t>One of WebRTC's key features is its support of peer-to-peer | <t>One of WebRTC's key features is its support of peer-to-peer | |||
connections. However, when establishing such a connection, which involves | connections. However, when establishing such a connection, which involves | |||
connection attempts from various IP addresses, WebRTC may allow a web | connection attempts from various IP addresses, WebRTC may allow a web | |||
application to learn additional information about the user compared to an | application to learn additional information about the user compared to an | |||
application that only uses the Hypertext Transfer Protocol (HTTP) | application that only uses the Hypertext Transfer Protocol (HTTP) | |||
<xref target="RFC7230" />. This may be problematic in certain cases. This | <xref target="RFC7230" format="default"/>. This may be problematic in | |||
document summarizes the concerns, and makes recommendations on how WebRTC | certain cases. This | |||
implementations should best handle the tradeoff between privacy and media | document summarizes the concerns and makes recommendations on how WebRTC | |||
performance.</t> | implementations should best handle the trade-off between privacy and medi | |||
</section> | a | |||
<section title="Terminology"> | performance.</t> | |||
</section> | ||||
<section numbered="true" toc="default"> | ||||
<name>Terminology</name> | ||||
<t> | ||||
The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | ||||
"<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14> | ||||
", | ||||
"<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", | ||||
"<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | ||||
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | ||||
be | ||||
interpreted as described in BCP 14 <xref target="RFC2119"/> <xref | ||||
target="RFC8174"/> when, and only when, they appear in all capitals, as | ||||
shown here. | ||||
</t> | ||||
<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | ||||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | ||||
"OPTIONAL" in this document are to be interpreted as described in BCP 14 | ||||
<xref target="RFC2119"></xref><xref target="RFC8174"></xref> | ||||
when, and only when, they appear in all capitals, as shown here.</t> | ||||
</section> | </section> | |||
<section title="Problem Statement"> | <section numbered="true" toc="default"> | |||
<name>Problem Statement</name> | ||||
<t>In order to establish a peer-to-peer connection, WebRTC | <t>In order to establish a peer-to-peer connection, WebRTC | |||
implementations use Interactive Connectivity Establishment (ICE) | implementations use Interactive Connectivity Establishment (ICE) | |||
<xref target="RFC8445" />, which attempts to discover multiple IP | <xref target="RFC8445" format="default"/>. ICE attempts to discover multip le IP | |||
addresses using techniques such as Session Traversal Utilities for NAT | addresses using techniques such as Session Traversal Utilities for NAT | |||
(STUN) | (STUN) | |||
<xref target="RFC5389" /> and Traversal Using Relays around NAT (TURN) | <xref target="RFC5389" format="default"/> and Traversal Using Relays | |||
<xref target="RFC5766" />, and then checks the connectivity of each | around NAT (TURN) | |||
<xref target="RFC5766" format="default"/> and then checks the | ||||
connectivity of each | ||||
local-address-remote-address pair in order to select the best one. The | local-address-remote-address pair in order to select the best one. The | |||
addresses that are collected usually consist of an endpoint's private | addresses that are collected usually consist of an endpoint's private | |||
physical or virtual addresses and its public Internet addresses.</t> | physical or virtual addresses and its public Internet addresses.</t> | |||
<t>These addresses are provided to the web application so that | <t>These addresses are provided to the web application so that | |||
they can be communicated to the remote endpoint for its checks. This | they can be communicated to the remote endpoint for its checks. This | |||
allows the application to learn more about the local network | allows the application to learn more about the local network | |||
configuration than it would from a typical HTTP scenario, in which the | configuration than it would from a typical HTTP scenario, in which the | |||
web server would only see a single public Internet address, i.e., the | web server would only see a single public Internet address, i.e., the | |||
address from which the HTTP request was sent.</t> | address from which the HTTP request was sent.</t> | |||
<t>The information revealed falls into three categories: | <t>The additional information revealed falls into three categories: | |||
<list style="numbers"> | </t> | |||
<ol spacing="normal" type="1"> | ||||
<t>If the client is multihomed, additional public IP addresses for the | <li>If the client is multihomed, additional public IP addresses for the | |||
client can be learned. In particular, if the client tries to hide its | client can be learned. In particular, if the client tries to hide its | |||
physical location through a Virtual Private Network (VPN), and the VPN | physical location through a Virtual Private Network (VPN), and the VPN | |||
and local OS support routing over multiple interfaces (a "split-tunnel" | and local OS support routing over multiple interfaces (a "split-tunnel" | |||
VPN), WebRTC can discover not only the public address for the VPN, but | VPN), WebRTC can discover not only the public address for the VPN, but | |||
also the ISP public address over which the VPN is running.</t> | also the ISP public address over which the VPN is running.</li> | |||
<li>If the client is behind a Network Address Translator (NAT), the | ||||
<t>If the client is behind a Network Address Translator (NAT), the | ||||
client's private IP addresses, often | client's private IP addresses, often | |||
<xref target="RFC1918" /> addresses, can be learned.</t> | <xref target="RFC1918" format="default"/> addresses, can be learned.</li | |||
> | ||||
<t>If the client is behind a proxy (a client-configured "classical | <li>If the client is behind a proxy (a client-configured "classical | |||
application proxy", as defined in | application proxy", as defined in | |||
<xref target="RFC1919" />, Section 3), but direct access to the | <xref target="RFC1919" format="default" sectionFormat="comma" | |||
section="3"/>), but direct access to the | ||||
Internet is permitted, WebRTC's STUN checks will bypass the proxy and | Internet is permitted, WebRTC's STUN checks will bypass the proxy and | |||
reveal the public IP address of the client. This concern also applies | reveal the public IP address of the client. This concern also applies | |||
to the "enterprise TURN server" scenario described in | to the "enterprise TURN server" scenario described in | |||
<xref target="RFC7478" />, Section 2.3.5.1, if, as above, direct | <xref target="RFC7478" format="default" sectionFormat="comma" | |||
section="2.3.5.1"/> if, as above, direct | ||||
Internet access is permitted. However, when the term "proxy" is used in | Internet access is permitted. However, when the term "proxy" is used in | |||
this document, it is always in reference to an | this document, it is always in reference to an | |||
<xref target="RFC1919" /> proxy server.</t> | <xref target="RFC1919" format="default"/> proxy server.</li> | |||
</list></t> | </ol> | |||
<t>Of these three concerns, the first is the most significant, because for some | <t>Of these three concerns, the first is the most significant, because for some | |||
users, the purpose of using a VPN is for anonymity. However, different | users, the purpose of using a VPN is for anonymity. However, different | |||
VPN users will have different needs, and some VPN users (e.g., corporate | VPN users will have different needs, and some VPN users (e.g., corporate | |||
VPN users) may in fact prefer WebRTC to send media traffic directly, | VPN users) may in fact prefer WebRTC to send media traffic directly -- | |||
i.e., not through the VPN.</t> | i.e., not through the VPN.</t> | |||
<t>The second concern is less significant but valid nonetheless. The core | <t>The second concern is less significant but valid nonetheless. The core | |||
issue is that web applications can learn about addresses that are not | issue is that web applications can learn about addresses that are not | |||
exposed to the internet; typically these address are IPv4, but they can | exposed to the Internet; typically, these address are IPv4, but they can | |||
also be IPv6, as in the case of NAT64 <xref target="RFC6146" />. | also be IPv6, as in the case of NAT64 <xref target="RFC6146" format="defau | |||
While disclosure of the <xref target="RFC4941" /> IPv6 addresses | lt"/>. | |||
recommended by <xref target="WEBRTC-TRANSPORTS" /> is fairly | While disclosure of the <xref target="RFC4941" format="default"/> IPv6 add | |||
resses | ||||
recommended by <xref target="RFC8835" | ||||
format="default"/> is fairly | ||||
benign due to their intentionally short lifetimes, IPv4 addresses present | benign due to their intentionally short lifetimes, IPv4 addresses present | |||
some challenges. Although private IPv4 addresses often contain minimal | some challenges. Although private IPv4 addresses often contain minimal | |||
entropy (e.g., 192.168.0.2, a fairly common address), in the worst case, | entropy (e.g., 192.168.0.2, a fairly common address), in the worst case, | |||
they can contain 24 bits of entropy with an indefinite lifetime. As such, | they can contain 24 bits of entropy with an indefinite lifetime. As such, | |||
they can be a fairly significant fingerprinting surface. In addition, | they can be a fairly significant fingerprinting surface. In addition, | |||
intranet web sites can be attacked more easily when their IPv4 address | intranet web sites can be attacked more easily when their IPv4 address | |||
range is externally known.</t> | range is externally known.</t> | |||
<t>Private IP addresses can also act as an identifier that allows | <t>Private IP addresses can also act as an identifier that allows | |||
web applications running in isolated browsing contexts (e.g., normal and | web applications running in isolated browsing contexts (e.g., normal and | |||
private browsing) to learn that they are running on the same device. This | private browsing) to learn that they are running on the same device. This | |||
could allow the application sessions to be correlated, defeating some of | could allow the application sessions to be correlated, defeating some of | |||
the privacy protections provided by isolation. It should be noted that | the privacy protections provided by isolation. It should be noted that | |||
private addresses are just one potential mechanism for this correlation | private addresses are just one potential mechanism for this correlation | |||
and this is an area for further study.</t> | and this is an area for further study.</t> | |||
<t>The third concern is the least common, as proxy administrators can alre ady | <t>The third concern is the least common, as proxy administrators can alre ady | |||
control this behavior through organizational firewall policy, and | control this behavior through organizational firewall policy, and | |||
generally, forcing WebRTC traffic through a proxy server will have | generally, forcing WebRTC traffic through a proxy server will have | |||
negative effects on both the proxy and on media quality.</t> | negative effects on both the proxy and media quality.</t> | |||
<t>Note also that these concerns predate WebRTC; Adobe Flash Player has | <t>Note also that these concerns predate WebRTC; Adobe Flash Player has | |||
provided similar functionality since the introduction of Real-Time | provided similar functionality since the introduction of Real-Time | |||
Media Flow Protocol (RTMFP) support | Media Flow Protocol (RTMFP) support | |||
<xref target="RFC7016" /> in 2008.</t> | <xref target="RFC7016" format="default"/> in 2008.</t> | |||
</section> | </section> | |||
<section title="Goals"> | <section numbered="true" toc="default"> | |||
<name>Goals</name> | ||||
<t>WebRTC's support of secure peer-to-peer connections facilitates | <t>WebRTC's support of secure peer-to-peer connections facilitates | |||
deployment of decentralized systems, which can have privacy benefits. As | deployment of decentralized systems, which can have privacy benefits. As | |||
a result, blunt solutions that disable WebRTC or make it significantly | a result, blunt solutions that disable WebRTC or make it significantly | |||
harder to use are undesirable. This document takes a more nuanced | harder to use are undesirable. This document takes a more nuanced | |||
approach, with the following goals: | approach, with the following goals: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal"> | ||||
<t>Provide a framework for understanding the problem so that controls | <li>Provide a framework for understanding the problem so that controls | |||
might be provided to make different tradeoffs regarding performance and | might be provided to make different trade-offs regarding performance and | |||
privacy concerns with WebRTC.</t> | privacy concerns with WebRTC.</li> | |||
<li>Using that framework, define settings that enable peer-to-peer | ||||
<t>Using that framework, define settings that enable peer-to-peer | ||||
communications, each with a different balance between performance and | communications, each with a different balance between performance and | |||
privacy.</t> | privacy.</li> | |||
<li>Finally, provide recommendations for default settings that provide | ||||
<t>Finally, provide recommendations for default settings that provide | ||||
reasonable performance without also exposing addressing information in | reasonable performance without also exposing addressing information in | |||
a way that might violate user expectations.</t> | a way that might violate user expectations.</li> | |||
</list></t> | </ul> | |||
</section> | </section> | |||
<section title="Detailed Design"> | <section numbered="true" toc="default"> | |||
<section title="Principles"> | <name>Detailed Design</name> | |||
<section numbered="true" toc="default"> | ||||
<name>Principles</name> | ||||
<t>The key principles for our framework are stated below: | <t>The key principles for our framework are stated below: | |||
<list style="numbers"> | </t> | |||
<ol spacing="normal" type="1"> | ||||
<t>By default, WebRTC traffic should follow typical IP routing, i.e., | <li>By default, WebRTC traffic should follow typical IP routing (i.e., | |||
WebRTC should use the same interface used for HTTP traffic, and only | WebRTC should use the same interface used for HTTP traffic) and only | |||
the system's 'typical' public addresses (or those of an enterprise | the system's 'typical' public addresses (or those of an enterprise | |||
TURN server, if present) should be visible to the application. | TURN server, if present) should be visible to the application. | |||
However, in the interest of optimal media quality, it should be | However, in the interest of optimal media quality, it should be | |||
possible to enable WebRTC to make use of all network interfaces to | possible to enable WebRTC to make use of all network interfaces to | |||
determine the ideal route.</t> | determine the ideal route.</li> | |||
<li>By default, WebRTC should be able to negotiate direct peer-to-peer | ||||
<t>By default, WebRTC should be able to negotiate direct peer-to-peer | ||||
connections between endpoints (i.e., without traversing a NAT or | connections between endpoints (i.e., without traversing a NAT or | |||
relay server) when such connections are possible. This ensures that | relay server) when such connections are possible. This ensures that | |||
applications that need true peer-to-peer routing for bandwidth or | applications that need true peer-to-peer routing for bandwidth or | |||
latency reasons can operate successfully.</t> | latency reasons can operate successfully.</li> | |||
<li>It should be possible to configure WebRTC to not disclose private | ||||
<t>It should be possible to configure WebRTC to not disclose private | ||||
local IP addresses, to avoid the issues associated with web | local IP addresses, to avoid the issues associated with web | |||
applications learning such addresses. This document does not require | applications learning such addresses. This document does not require | |||
this to be the default state, as there is no currently defined | this to be the default state, as there is no currently defined | |||
mechanism that can satisfy this requirement as well as the | mechanism that can satisfy this requirement as well as the | |||
aforementioned requirement to allow direct peer-to-peer | aforementioned requirement to allow direct peer-to-peer | |||
connections.</t> | connections.</li> | |||
<li>By default, WebRTC traffic should not be sent through proxy | ||||
<t>By default, WebRTC traffic should not be sent through proxy | servers, due to the media-quality problems associated with sending | |||
servers, due to the media quality problems associated with sending | ||||
WebRTC traffic over TCP, which is almost always used when | WebRTC traffic over TCP, which is almost always used when | |||
communicating with such proxies, as well as proxy performance issues | communicating with such proxies, as well as proxy performance issues | |||
that may result from proxying WebRTC's long-lived, high-bandwidth | that may result from proxying WebRTC's long-lived, high-bandwidth | |||
connections. However, it should be possible to force WebRTC to send | connections. However, it should be possible to force WebRTC to send | |||
its traffic through a configured proxy if desired.</t> | its traffic through a configured proxy if desired.</li> | |||
</list></t> | </ol> | |||
</section> | </section> | |||
<section title="Modes and Recommendations"> | <section numbered="true" toc="default"> | |||
<name>Modes and Recommendations</name> | ||||
<t>Based on these ideas, we define four specific modes of WebRTC | <t>Based on these ideas, we define four specific modes of WebRTC | |||
behavior, reflecting different media quality/privacy tradeoffs: | behavior, reflecting different media quality/privacy trade-offs: | |||
<list style="format Mode %d:"> | </t> | |||
<dl newline="true"> | ||||
<t>Enumerate all addresses: WebRTC MUST use all network interfaces to | <dt>Mode 1 - Enumerate all addresses:</dt> | |||
<dd>WebRTC <bcp14>MUST</bcp14> use all network interfaces to | ||||
attempt communication with STUN servers, TURN servers, or peers. This | attempt communication with STUN servers, TURN servers, or peers. This | |||
will converge on the best media path, and is ideal when media | will converge on the best media path and is ideal when media | |||
performance is the highest priority, but it discloses the most | performance is the highest priority, but it discloses the most | |||
information.</t> | information.</dd> | |||
<dt>Mode 2 - Default route + associated local addresses:</dt> | ||||
<t>Default route + associated local addresses: WebRTC MUST follow the | <dd>WebRTC | |||
<bcp14>MUST</bcp14> follow the | ||||
kernel routing table rules, which will typically cause media packets | kernel routing table rules, which will typically cause media packets | |||
to take the same route as the application's HTTP traffic. If an | to take the same route as the application's HTTP traffic. If an | |||
enterprise TURN server is present, the preferred route MUST be | enterprise TURN server is present, the preferred route <bcp14>MUST</bc p14> be | |||
through this TURN server. Once an interface has been chosen, the | through this TURN server. Once an interface has been chosen, the | |||
private IPv4 and IPv6 addresses associated with this interface MUST | private IPv4 and IPv6 addresses associated with this interface <bcp14> MUST</bcp14> | |||
be discovered and provided to the application as host candidates. | be discovered and provided to the application as host candidates. | |||
This ensures that direct connections can still be established in this | This ensures that direct connections can still be established in this | |||
mode.</t> | mode.</dd> | |||
<dt>Mode 3 - Default route only: </dt> | ||||
<t>Default route only: This is the the same as Mode 2, except that | <dd>This is the same as Mode 2, except that | |||
the associated private addresses MUST NOT be provided; the only IP | the associated private addresses <bcp14>MUST NOT</bcp14> be provided; | |||
the only IP | ||||
addresses gathered are those discovered via mechanisms like STUN and | addresses gathered are those discovered via mechanisms like STUN and | |||
TURN (on the default route). This may cause traffic to hairpin | TURN (on the default route). This may cause traffic to hairpin | |||
through a NAT, fall back to an application TURN server, or fail | through a NAT, fall back to an application TURN server, or fail | |||
altogether, with resulting quality implications.</t> | altogether, with resulting quality implications.</dd> | |||
<dt>Mode 4 - Force proxy:</dt> | ||||
<t>Force proxy: This is the same as Mode 3, but when the | <dd>This is the same as Mode 3, but when the | |||
application's HTTP traffic is sent through a proxy, WebRTC media | application's HTTP traffic is sent through a proxy, WebRTC media | |||
traffic MUST also be proxied. If the proxy does not support UDP (as | traffic <bcp14>MUST</bcp14> also be proxied. If the proxy does not sup port UDP (as | |||
is the case for all HTTP and most SOCKS | is the case for all HTTP and most SOCKS | |||
<xref target="RFC1928" /> proxies), or the WebRTC implementation does | <xref target="RFC1928" format="default"/> proxies), or the WebRTC impl ementation does | |||
not support UDP proxying, the use of UDP will be disabled, and TCP | not support UDP proxying, the use of UDP will be disabled, and TCP | |||
will be used to send and receive media through the proxy. Use of TCP | will be used to send and receive media through the proxy. Use of TCP | |||
will result in reduced media quality, in addition to any performance | will result in reduced media quality, in addition to any performance | |||
considerations associated with sending all WebRTC media through the | considerations associated with sending all WebRTC media through the | |||
proxy server.</t> | proxy server.</dd> | |||
</list></t> | </dl> | |||
<t>Mode 1 <bcp14>MUST NOT</bcp14> be used unless user consent has been p | ||||
<t>Mode 1 MUST NOT be used unless user consent has been provided. The | rovided. The | |||
details of this consent are left to the implementation; one potential | details of this consent are left to the implementation; one potential | |||
mechanism is to tie this consent to getUserMedia (device permissions) | mechanism is to tie this consent to getUserMedia (device permissions) | |||
consent, described in <xref target="WEBRTC-SECURITY" />, | consent, described in <xref target="RFC8827" | |||
Section 6.2. Alternatively, implementations can provide a specific | format="default" sectionFormat="comma" section="6.2"/>. | |||
Alternatively, implementations can provide a specific | ||||
mechanism to obtain user consent.</t> | mechanism to obtain user consent.</t> | |||
<t>In cases where user consent has not been obtained, Mode 2 <bcp14>SHOU | ||||
<t>In cases where user consent has not been obtained, Mode 2 SHOULD be | LD</bcp14> be | |||
used.</t> | used.</t> | |||
<t>These defaults provide a reasonable trade-off that permits trusted | ||||
<t>These defaults provide a reasonable tradeoff that permits trusted | WebRTC applications to achieve optimal network performance but gives | |||
WebRTC applications to achieve optimal network performance, but gives | applications without consent (e.g., 1-way streaming or data-channel | |||
applications without consent (e.g., 1-way streaming or data channel | ||||
applications) only the minimum information needed to achieve direct | applications) only the minimum information needed to achieve direct | |||
connections, as defined in Mode 2. However, implementations MAY choose | connections, as defined in Mode 2. However, implementations <bcp14>MAY</ bcp14> choose | |||
stricter modes if desired, e.g., if a user indicates they want all | stricter modes if desired, e.g., if a user indicates they want all | |||
WebRTC traffic to follow the default route.</t> | WebRTC traffic to follow the default route.</t> | |||
<t>Future documents may define additional modes and/or update the | <t>Future documents may define additional modes and/or update the | |||
recommended default modes.</t> | recommended default modes.</t> | |||
<t>Note that the suggested defaults can still be used even for | <t>Note that the suggested defaults can still be used even for | |||
organizations that want all external WebRTC traffic to traverse a proxy | organizations that want all external WebRTC traffic to traverse a proxy | |||
or enterprise TURN server, simply by setting an organizational firewall | or enterprise TURN server, simply by setting an organizational firewall | |||
policy that allows WebRTC traffic to only leave through the proxy or | policy that allows WebRTC traffic to only leave through the proxy or | |||
TURN server. This provides a way to ensure the proxy or TURN server is | TURN server. This provides a way to ensure the proxy or TURN server is | |||
used for any external traffic, but still allows direct connections | used for any external traffic but still allows direct connections | |||
(and, in the proxy case, avoids the performance issues associated with | (and, in the proxy case, avoids the performance issues associated with | |||
forcing media through said proxy) for intra-organization traffic.</t> | forcing media through said proxy) for intra-organization traffic.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section title="Implementation Guidance"> | <section numbered="true" toc="default"> | |||
<name>Implementation Guidance</name> | ||||
<t>This section provides guidance to WebRTC implementations on how to | <t>This section provides guidance to WebRTC implementations on how to | |||
implement the policies described above.</t> | implement the policies described above.</t> | |||
<section title="Ensuring Normal Routing"> | <section numbered="true" toc="default"> | |||
<name>Ensuring Normal Routing</name> | ||||
<t>When trying to follow typical IP routing, as required by Modes 2 | <t>When trying to follow typical IP routing, as required by Modes 2 | |||
and 3, the simplest approach is | and 3, the simplest approach is | |||
to bind() the sockets used for peer-to-peer connections to the wildcard | to bind() the sockets used for peer-to-peer connections to the wildcard | |||
addresses (0.0.0.0 for IPv4, :: for IPv6), which allows the OS to route | addresses (0.0.0.0 for IPv4, :: for IPv6), which allows the OS to route | |||
WebRTC traffic the same way as it would HTTP traffic. STUN and TURN | WebRTC traffic the same way as it would HTTP traffic. STUN and TURN | |||
will work as usual, and host candidates can still be determined as | will work as usual, and host candidates can still be determined as | |||
mentioned below.</t> | mentioned below.</t> | |||
</section> | </section> | |||
<section title="Determining Associated Local Addresses"> | <section numbered="true" toc="default"> | |||
<name>Determining Associated Local Addresses</name> | ||||
<t>When binding to a wildcard address, some extra work is needed to | <t>When binding to a wildcard address, some extra work is needed to | |||
determine the associated local address required by Mode 2, which we | determine the associated local address required by Mode 2, which we | |||
define as the source | define as the source | |||
address that would be used for any packets sent to the web application | address that would be used for any packets sent to the web application | |||
host (assuming that UDP and TCP get the same routing treatment). Use of | host (assuming that UDP and TCP get the same routing treatment). Use of | |||
the web application host as a destination ensures the right source | the web-application host as a destination ensures the right source | |||
address is selected, regardless of where the application resides (e.g., | address is selected, regardless of where the application resides (e.g., | |||
on an intranet).</t> | on an intranet).</t> | |||
<t>First, the appropriate remote IPv4/IPv6 address is obtained by | <t>First, the appropriate remote IPv4/IPv6 address is obtained by | |||
resolving the host component of the web application URI | resolving the host component of the web application URI | |||
<xref target="RFC3986" />. If the client is behind a proxy and cannot | <xref target="RFC3986" format="default"/>. If the client is behind a pro xy and cannot | |||
resolve these IPs via DNS, the address of the proxy can be used | resolve these IPs via DNS, the address of the proxy can be used | |||
instead. Or, if the web application was loaded from a file:// URI | instead. Or, if the web application was loaded from a file:// URI | |||
<xref target="RFC8089" />, rather than over the network, the | <xref target="RFC8089" format="default"/> rather than over the network, the | |||
implementation can fall back to a well-known DNS name or IP | implementation can fall back to a well-known DNS name or IP | |||
address.</t> | address.</t> | |||
<t>Once a suitable remote IP has been determined, the implementation | <t>Once a suitable remote IP has been determined, the implementation | |||
can create a UDP socket, bind() it to the appropriate wildcard address, | can create a UDP socket, bind() it to the appropriate wildcard address, | |||
and then connect() to the remote IP. Generally, this results in | and then connect() to the remote IP. Generally, this results in | |||
the socket being assigned a local address based on the kernel routing | the socket being assigned a local address based on the kernel routing | |||
table, without sending any packets over the network.</t> | table, without sending any packets over the network.</t> | |||
<t>Finally, the socket can be queried using getsockname() or the | <t>Finally, the socket can be queried using getsockname() or the | |||
equivalent to determine the appropriate local address.</t> | equivalent to determine the appropriate local address.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section title="Application Guidance"> | <section numbered="true" toc="default"> | |||
<name>Application Guidance</name> | ||||
<t>The recommendations mentioned in this document may cause certain | <t>The recommendations mentioned in this document may cause certain | |||
WebRTC applications to malfunction. In order to be robust in all | WebRTC applications to malfunction. In order to be robust in all | |||
scenarios, the following guidelines are provided for applications: | scenarios, the following guidelines are provided for applications: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal"> | ||||
<t>Applications SHOULD deploy a TURN server with support for both UDP | <li>Applications <bcp14>SHOULD</bcp14> deploy a TURN server with support | |||
for both UDP | ||||
and TCP connections to the server. This ensures that connectivity can | and TCP connections to the server. This ensures that connectivity can | |||
still be established, even when Mode 3 or 4 are in use, assuming the | still be established, even when Mode 3 or 4 is in use, assuming the | |||
TURN server can be reached.</t> | TURN server can be reached.</li> | |||
<li>Applications <bcp14>SHOULD</bcp14> detect when they don't have acces | ||||
<t>Applications SHOULD detect when they don't have access to the full | s to the full | |||
set of ICE candidates by checking for the presence of host candidates. | set of ICE candidates by checking for the presence of host candidates. | |||
If no host candidates are present, Mode 3 or 4 above is in use; this | If no host candidates are present, Mode 3 or 4 is in use; this | |||
knowledge can be useful for diagnostic purposes.</t> | knowledge can be useful for diagnostic purposes.</li> | |||
</list></t> | </ul> | |||
</section> | </section> | |||
<section title="Security Considerations"> | <section numbered="true" toc="default"> | |||
<name>Security Considerations</name> | ||||
<t>This document describes several potential privacy and security concerns | <t>This document describes several potential privacy and security concerns | |||
associated with WebRTC peer-to-peer connections, and provides mechanisms | associated with WebRTC peer-to-peer connections and provides mechanisms | |||
and recommendations for WebRTC implementations to address these concerns. | and recommendations for WebRTC implementations to address these concerns. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title="IANA Considerations"> | <section numbered="true" toc="default"> | |||
<name>IANA Considerations</name> | ||||
<t>This document requires no actions from IANA.</t> | <t>This document has no IANA actions.</t> | |||
</section> | ||||
<section title="Acknowledgements"> | ||||
<t>Several people provided input into this document, including Bernard | ||||
Aboba, Harald Alvestrand, Youenn Fablet, Ted Hardie, Matthew Kaufmann, | ||||
Eric Rescorla, Adam Roach, and Martin Thomson.</t> | ||||
</section> | </section> | |||
</middle> | </middle> | |||
<back> | <back> | |||
<references title="Normative References"> | ||||
<?rfc include='reference.RFC.2119.xml'?> | ||||
<?rfc include='reference.RFC.3986.xml'?> | ||||
<?rfc include='reference.RFC.5389.xml'?> | ||||
<?rfc include='reference.RFC.5766.xml'?> | ||||
<?rfc include='reference.RFC.8089.xml'?> | ||||
<?rfc include='reference.RFC.8174.xml'?> | ||||
<?rfc include='reference.RFC.8445.xml'?> | ||||
</references> | ||||
<references title="Informative References"> | ||||
<?rfc include='reference.RFC.1918.xml'?> | ||||
<?rfc include='reference.RFC.1919.xml'?> | ||||
<?rfc include='reference.RFC.1928.xml'?> | ||||
<?rfc include='reference.RFC.4941.xml'?> | ||||
<?rfc include='reference.RFC.6146.xml'?> | ||||
<?rfc include='reference.RFC.7016.xml'?> | ||||
<?rfc include='reference.RFC.7230.xml'?> | ||||
<?rfc include='reference.RFC.7478.xml'?> | ||||
<!-- <?rfc include='reference.I-D.ietf-rtcweb-security-arch'?>; In MISSREF as of | ||||
7/26/19 --> | ||||
<reference anchor='WEBRTC-SECURITY'> | ||||
<front> | ||||
<title>WebRTC Security Architecture</title> | ||||
<author initials='E' surname='Rescorla' fullname='Eric Rescorla'> | ||||
<organization /> | ||||
</author> | ||||
<date month='July' day='22' year='2019' /> | <references> | |||
<name>References</name> | ||||
<abstract><t>This document defines the security architecture for WebRTC, a proto | <references> | |||
col suite intended for use with real-time applications that can be deployed in b | <name>Normative References</name> | |||
rowsers - "real time communication on the Web".</t></abstract> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
ence.RFC.2119.xml"/> | ||||
</front> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
ence.RFC.3986.xml"/> | ||||
<seriesInfo name='Work in Progress,' value='draft-ietf-rtcweb-security-arch-20' | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
/> | ence.RFC.5389.xml"/> | |||
</reference> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
ence.RFC.5766.xml"/> | ||||
<!-- <?rfc include='reference.I-D.ietf-rtcweb-transports'?>; In MISSREF as of 7/ | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
26/19 --> | ence.RFC.8089.xml"/> | |||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.8174.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.8445.xml"/> | ||||
</references> | ||||
<references> | ||||
<name>Informative References</name> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.1918.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.1919.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.1928.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.4941.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.6146.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.7016.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.7230.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.7478.xml"/> | ||||
<reference anchor='WEBRTC-TRANSPORTS'> | <!--draft-ietf-rtcweb-security-arch: 8827 --> | |||
<front> | <reference anchor="RFC8827" target="https://www.rfc-editor.org/info/rfc8827"> | |||
<title>Transports for WebRTC</title> | <front> | |||
<title>WebRTC Security Architecture</title> | ||||
<author initials='E.' surname='Rescorla' fullname='Eric Rescorla'> | ||||
<organization/> | ||||
</author> | ||||
<date month='July' year='2020'/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8827"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8827"/> | ||||
</reference> | ||||
<author initials='H' surname='Alvestrand' fullname='Harald Alvestrand'> | <!-- draft-ietf-rtcweb-transports-17: 8835 --> | |||
<organization /> | <reference anchor="RFC8835" target="https://www.rfc-editor.org/info/rfc8835"> | |||
</author> | ||||
<date month='October' day='26' year='2016' /> | <front> | |||
<title>Transports for WebRTC</title> | ||||
<abstract><t>This document describes the data transport protocols used by WebRTC | <author initials="H." surname="Alvestrand" fullname="Harald Alvestrand"> | |||
, including the protocols used for interaction with intermediate boxes such as f | <organization /> | |||
irewalls, relays and NAT boxes.</t></abstract> | </author> | |||
</front> | <date month="July" year="2020" /> | |||
</front> | ||||
<seriesInfo name="RFC" value="8835" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8835"/> | ||||
<seriesInfo name='Work in Progress,' value='draft-ietf-rtcweb-transports-17' /> | ||||
</reference> | </reference> | |||
</references> | </references> | |||
<section title="Change log"> | </references> | |||
<t>Changes in draft -12: | <section numbered="false" toc="default"> | |||
<list style="symbols"> | <name>Acknowledgements</name> | |||
<t>Several people provided input into this document, including <contact fu | ||||
<t>Editorial updates from IETF LC review.</t> | llname="Bernard | |||
</list></t> | Aboba"/>, <contact fullname="Harald Alvestrand"/>, <contact fullname="Youe | |||
nn | ||||
<t>Changes in draft -11: | Fablet"/>, <contact fullname="Ted Hardie"/>, <contact fullname="Matthew Ka | |||
<list style="symbols"> | ufmann"/>, | |||
<contact fullname="Eric Rescorla"/>, <contact fullname="Adam Roach"/>, and | ||||
<t>Editorial updates from AD review.</t> | <contact fullname="Martin Thomson"/>.</t> | |||
</list></t> | ||||
<t>Changes in draft -10: | ||||
<list style="symbols"> | ||||
<t>Incorporate feedback from IETF 102 on the problem space.</t> | ||||
<t>Note that future versions of the document may define new modes.</t> | ||||
</list></t> | ||||
<t>Changes in draft -09: | ||||
<list style="symbols"> | ||||
<t>Fixed confusing text regarding enterprise TURN servers.</t> | ||||
</list></t> | ||||
<t>Changes in draft -08: | ||||
<list style="symbols"> | ||||
<t>Discuss how enterprise TURN servers should be handled.</t> | ||||
</list></t> | ||||
<t>Changes in draft -07: | ||||
<list style="symbols"> | ||||
<t>Clarify consent guidance.</t> | ||||
</list></t> | ||||
<t>Changes in draft -06: | ||||
<list style="symbols"> | ||||
<t>Clarify recommendations.</t> | ||||
<t>Split implementation guidance into two sections.</t> | ||||
</list></t> | ||||
<t>Changes in draft -05: | ||||
<list style="symbols"> | ||||
<t>Separated framework definition from implementation techniques.</t> | ||||
<t>Removed RETURN references.</t> | ||||
<t>Use origin when determining local IPs, rather than a well-known | ||||
IP.</t> | ||||
</list></t> | ||||
<t>Changes in draft -04: | ||||
<list style="symbols"> | ||||
<t>Rewording and cleanup in abstract, intro, and problem statement.</t> | ||||
<t>Added 2119 boilerplate.</t> | ||||
<t>Fixed weird reference spacing.</t> | ||||
<t>Expanded acronyms on first use.</t> | ||||
<t>Removed 8.8.8.8 mention.</t> | ||||
<t>Removed mention of future browser considerations.</t> | ||||
</list></t> | ||||
<t>Changes in draft -03: | ||||
<list style="symbols"> | ||||
<t>Clarified when to use which modes.</t> | ||||
<t>Added 2119 qualifiers to make normative statements.</t> | ||||
<t>Defined 'proxy'.</t> | ||||
<t>Mentioned split tunnels in problem statement.</t> | ||||
</list></t> | ||||
<t>Changes in draft -02: | ||||
<list style="symbols"> | ||||
<t>Recommendations -> Requirements</t> | ||||
<t>Updated text regarding consent.</t> | ||||
</list></t> | ||||
<t>Changes in draft -01: | ||||
<list style="symbols"> | ||||
<t>Incorporated feedback from Adam Roach; changes to discussion of | ||||
cam/mic permission, as well as use of proxies, and various editorial | ||||
changes.</t> | ||||
<t>Added several more references.</t> | ||||
</list></t> | ||||
<t>Changes in draft -00: | ||||
<list style="symbols"> | ||||
<t>Published as WG draft.</t> | ||||
</list></t> | ||||
</section> | </section> | |||
</back> | </back> | |||
</rfc> | </rfc> | |||
End of changes. 84 change blocks. | ||||
339 lines changed or deleted | 236 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/ |