8. Exemples
Le relais IP dans HTTP permet de nombreux cas d'utilisation différents qui peuvent bénéficier du relais et de la tunnelisation de paquets IP. Ces exemples sont fournis pour aider à illustrer certaines des façons dont le relais IP dans HTTP peut être utilisé.
8.1. VPN d'accès à distance
L'exemple suivant montre une configuration VPN point-à-réseau, où un client reçoit un ensemble d'adresses locales et peut envoyer vers n'importe quel hôte distant via le proxy IP. De telles configurations VPN peuvent être à tunnel complet ou à tunnel divisé.
+--------+ IP A IP B +--------+ +---> IP D
| +--------------------+ IP | IP C |
| Client | IP Subnet C <--> ? | Proxy +-----------+---> IP E
| +--------------------+ | |
+--------+ +--------+ +---> IP ...
Figure 14 : Configuration du tunnel VPN
Dans ce cas, le client ne spécifie aucune portée dans sa requête. Le proxy IP assigne au client une adresse IPv4 (192.0.2.11) et une route à tunnel complet de toutes les adresses IPv4 (0.0.0.0/0). Le client peut alors envoyer vers n'importe quel hôte IPv4 en utilisant son adresse assignée comme adresse source.
[[ Du client ]] [[ Du proxy IP ]]
SETTINGS
H3_DATAGRAM = 1
SETTINGS
ENABLE_CONNECT_PROTOCOL = 1
H3_DATAGRAM = 1
STREAM(44): HEADERS
:method = CONNECT
:protocol = connect-ip
:scheme = https
:path = /vpn
:authority = proxy.example.com
capsule-protocol = ?1
STREAM(44): HEADERS
:status = 200
capsule-protocol = ?1
STREAM(44): DATA
Capsule Type = ADDRESS_REQUEST
(Request ID = 1
IP Version = 4
IP Address = 0.0.0.0
IP Prefix Length = 32)
STREAM(44): DATA
Capsule Type = ADDRESS_ASSIGN
(Request ID = 1
IP Version = 4
IP Address = 192.0.2.11
IP Prefix Length = 32)
STREAM(44): DATA
Capsule Type = ROUTE_ADVERTISEMENT
(IP Version = 4
Start IP Address = 0.0.0.0
End IP Address = 255.255.255.255
IP Protocol = 0) // Any
DATAGRAM
Quarter Stream ID = 11
Context ID = 0
Payload = Encapsulated IP Packet
DATAGRAM
Quarter Stream ID = 11
Context ID = 0
Payload = Encapsulated IP Packet
Figure 15 : Exemple de VPN à tunnel complet
Une configuration pour un VPN à tunnel divisé (le cas où le client ne peut accéder qu'à un ensemble spécifique de sous-réseaux privés) est assez similaire. Dans ce cas, la route annoncée est restreinte à 192.0.2.0/24, plutôt qu'à 0.0.0.0/0.
[[ Du client ]] [[ Du proxy IP ]]
STREAM(44): DATA
Capsule Type = ADDRESS_ASSIGN
(Request ID = 0
IP Version = 4
IP Address = 192.0.2.42
IP Prefix Length = 32)
STREAM(44): DATA
Capsule Type = ROUTE_ADVERTISEMENT
(IP Version = 4
Start IP Address = 192.0.2.0
End IP Address = 192.0.2.41
IP Protocol = 0) // Any
(IP Version = 4
Start IP Address = 192.0.2.43
End IP Address = 192.0.2.255
IP Protocol = 0) // Any
Figure 16 : Exemple de VPN à tunnel divisé
8.2. VPN site à site
L'exemple suivant montre comment connecter un réseau de succursale à un réseau d'entreprise de telle sorte que toutes les machines sur ces réseaux puissent communiquer. Dans cet exemple, le client de relais IP est attaché au réseau de succursale 192.0.2.0/24, et le proxy IP est attaché au réseau d'entreprise 203.0.113.0/24. Il y a des clients hérités sur le réseau de succursale qui n'autorisent que les requêtes de maintenance provenant de machines sur leur sous-réseau, donc le proxy IP est approvisionné avec une adresse IP de ce sous-réseau.
192.0.2.1 <--+ +--------+ +-------+ +---> 203.0.113.9
| | +-------------+ IP | |
192.0.2.2 <--+---+ Client | IP Proxying | Proxy +---+---> 203.0.113.8
| | +-------------+ | |
192.0.2.3 <--+ +--------+ +-------+ +---> 203.0.113.7
Figure 17 : Exemple de VPN site à site
Dans ce cas, le client ne spécifie aucune portée dans sa requête. Le proxy IP assigne au client une adresse IPv4 (203.0.113.100) et une route à tunnel divisé vers le réseau d'entreprise (203.0.113.0/24). Le client assigne au proxy IP une adresse IPv4 (192.0.2.200) et une route à tunnel divisé vers le réseau de succursale (192.0.2.0/24). Cela permet aux hôtes sur les deux réseaux de communiquer entre eux et permet au proxy IP d'effectuer la maintenance sur les hôtes hérités dans la succursale. Notez que les points de terminaison de relais IP décrémenteront le nombre de sauts IP (ou TTL) lors de l'encapsulation des paquets transférés, donc les protocoles qui nécessitent que ce champ soit défini sur 255 ne fonctionneront pas.
[[ Du client ]] [[ Du proxy IP ]]
SETTINGS
H3_DATAGRAM = 1
SETTINGS
ENABLE_CONNECT_PROTOCOL = 1
H3_DATAGRAM = 1
STREAM(44): HEADERS
:method = CONNECT
:protocol = connect-ip
:scheme = https
:path = /corp
:authority = proxy.example.com
capsule-protocol = ?1
STREAM(44): HEADERS
:status = 200
capsule-protocol = ?1
STREAM(44): DATA
Capsule Type = ADDRESS_ASSIGN
(Request ID = 0
IP Version = 4
IP Address = 192.0.2.200
IP Prefix Length = 32)
STREAM(44): DATA
Capsule Type = ROUTE_ADVERTISEMENT
(IP Version = 4
Start IP Address = 192.0.2.0
End IP Address = 192.0.2.255
IP Protocol = 0) // Any
STREAM(44): DATA
Capsule Type = ADDRESS_ASSIGN
(Request ID = 0
IP Version = 4
IP Address = 203.0.113.100
IP Prefix Length = 32)
STREAM(44): DATA
Capsule Type = ROUTE_ADVERTISEMENT
(IP Version = 4
Start IP Address = 203.0.113.0
End IP Address = 203.0.113.255
IP Protocol = 0) // Any
DATAGRAM
Quarter Stream ID = 11
Context ID = 0
Payload = Encapsulated IP Packet
DATAGRAM
Quarter Stream ID = 11
Context ID = 0
Payload = Encapsulated IP Packet
Figure 18 : Exemple de capsule VPN site à site
8.3. Transfert de flux IP
L'exemple suivant montre une configuration de transfert de flux IP, où un client demande d'établir un tunnel de transfert vers target.example.com en utilisant le protocole SCTP (Stream Control Transmission Protocol) (protocole IP 132) et reçoit une seule adresse locale et une adresse distante qu'il peut utiliser pour transmettre des paquets. Une approche similaire pourrait être utilisée pour tout autre protocole IP qui n'est pas facilement relayé avec les méthodes HTTP existantes, telles que ICMP, Encapsulating Security Payload (ESP), etc.
+--------+ IP A IP B +--------+
| +-------------------+ IP | IP C
| Client | IP C <--> D | Proxy +---------> IP D
| +-------------------+ |
+--------+ +--------+
Figure 19 : Configuration de flux relayé
Dans ce cas, le client spécifie à la fois un nom d'hôte cible et un numéro de protocole Internet dans la portée de sa requête, indiquant qu'il a seulement besoin de communiquer avec un seul hôte. Le proxy IP est capable d'effectuer une résolution DNS pour le compte du client et d'allouer une prise sortante spécifique pour le client au lieu d'allouer une adresse IP entière au client. À cet égard, la requête est similaire à une requête de proxy CONNECT ordinaire.
Le proxy IP assigne une seule adresse IPv6 au client (2001:db8🔢:a) et une route vers un seul hôte IPv6 (2001:db8:3456::b) limitée à SCTP. Le client peut envoyer et recevoir des paquets IP SCTP vers l'hôte distant.
[[ Du client ]] [[ Du proxy IP ]]
SETTINGS
H3_DATAGRAM = 1
SETTINGS
ENABLE_CONNECT_PROTOCOL = 1
H3_DATAGRAM = 1
STREAM(44): HEADERS
:method = CONNECT
:protocol = connect-ip
:scheme = https
:path = /proxy?target=target.example.com&ipproto=132
:authority = proxy.example.com
capsule-protocol = ?1
STREAM(44): HEADERS
:status = 200
capsule-protocol = ?1
STREAM(44): DATA
Capsule Type = ADDRESS_ASSIGN
(Request ID = 0
IP Version = 6
IP Address = 2001:db8:1234::a
IP Prefix Length = 128)
STREAM(44): DATA
Capsule Type = ROUTE_ADVERTISEMENT
(IP Version = 6
Start IP Address = 2001:db8:3456::b
End IP Address = 2001:db8:3456::b
IP Protocol = 132)
DATAGRAM
Quarter Stream ID = 11
Context ID = 0
Payload = Encapsulated SCTP/IP Packet
DATAGRAM
Quarter Stream ID = 11
Context ID = 0
Payload = Encapsulated SCTP/IP Packet
Figure 20 : Exemple de flux SCTP relayé
8.4. Course de connexion relayée
L'exemple suivant montre une configuration où un client relaie des paquets UDP via un proxy IP afin de contrôler la course à l'établissement de connexion via un proxy IP, tel que défini dans Happy Eyeballs [HEv2]. Cet exemple est une variante du flux relayé mais met en évidence comment le relais au niveau IP peut permettre de nouvelles capacités, même pour TCP et UDP.
+--------+ IP A IP B +--------+ IP C
| +-------------------+ |<------------> IP E
| Client | IP C <--> E | IP |
| | D <--> F | Proxy |
| +-------------------+ |<------------> IP F
+--------+ +--------+ IP D
Figure 21 : Configuration de course de connexion relayée
Comme pour les flux relayés, le client spécifie à la fois un nom d'hôte cible et un numéro de protocole Internet dans la portée de sa requête. Lorsque le proxy IP effectue une résolution DNS pour le compte du client, il peut envoyer les différentes options d'adresse distante au client sous forme de routes séparées. Il peut également s'assurer que le client a à la fois des adresses IPv4 et IPv6 assignées.
Le proxy IP assigne à la fois une adresse IPv4 (192.0.2.3) et une adresse IPv6 (2001:db8🔢:a) au client, ainsi qu'une route IPv4 (198.51.100.2) et une route IPv6 (2001:db8:3456::b), qui représentent les adresses résolues du nom d'hôte cible, limitées à UDP. Le client peut envoyer et recevoir des paquets IP UDP vers l'une ou l'autre des adresses du proxy IP pour activer Happy Eyeballs via le proxy IP.
[[ Du client ]] [[ Du proxy IP ]]
SETTINGS
H3_DATAGRAM = 1
SETTINGS
ENABLE_CONNECT_PROTOCOL = 1
H3_DATAGRAM = 1
STREAM(44): HEADERS
:method = CONNECT
:protocol = connect-ip
:scheme = https
:path = /proxy?target=target.example.com&ipproto=17
:authority = proxy.example.com
capsule-protocol = ?1
STREAM(44): HEADERS
:status = 200
capsule-protocol = ?1
STREAM(44): DATA
Capsule Type = ADDRESS_ASSIGN
(Request ID = 0
IP Version = 4
IP Address = 192.0.2.3
IP Prefix Length = 32),
(Request ID = 0
IP Version = 6
IP Address = 2001:db8::1234:1234
IP Prefix Length = 128)
STREAM(44): DATA
Capsule Type = ROUTE_ADVERTISEMENT
(IP Version = 4
Start IP Address = 198.51.100.2
End IP Address = 198.51.100.2
IP Protocol = 17),
(IP Version = 6
Start IP Address = 2001:db8:3456::b
End IP Address = 2001:db8:3456::b
IP Protocol = 17)
...
DATAGRAM
Quarter Stream ID = 11
Context ID = 0
Payload = Encapsulated IPv6 Packet
DATAGRAM
Quarter Stream ID = 11
Context ID = 0
Payload = Encapsulated IPv4 Packet
Figure 22 : Exemple de course de connexion relayée