Passa al contenuto principale

8. Esempi

Il proxy IP in HTTP abilita molti casi d'uso diversi che possono trarre vantaggio dal proxy e dal tunneling di pacchetti IP. Questi esempi sono forniti per aiutare a illustrare alcuni dei modi in cui il proxy IP in HTTP può essere utilizzato.

8.1. VPN di accesso remoto

Il seguente esempio mostra una configurazione VPN point-to-network, in cui un client riceve un insieme di indirizzi locali e può inviare a qualsiasi host remoto tramite il proxy IP. Tali configurazioni VPN possono essere full-tunnel o split-tunnel.

+--------+ IP A          IP B +--------+           +---> IP D
| +--------------------+ IP | IP C |
| Client | IP Subnet C <--> ? | Proxy +-----------+---> IP E
| +--------------------+ | |
+--------+ +--------+ +---> IP ...

Figura 14: Configurazione tunnel VPN

In questo caso, il client non specifica alcun ambito nella sua richiesta. Il proxy IP assegna al client un indirizzo IPv4 (192.0.2.11) e un percorso full-tunnel di tutti gli indirizzi IPv4 (0.0.0.0/0). Il client può quindi inviare a qualsiasi host IPv4 utilizzando il suo indirizzo assegnato come indirizzo di origine.

[[ Dal Client ]]              [[ Dal 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

Figura 15: Esempio VPN Full-Tunnel

Una configurazione per una VPN split-tunnel (il caso in cui il client può accedere solo a un insieme specifico di sottoreti private) è abbastanza simile. In questo caso, il percorso pubblicizzato è limitato a 192.0.2.0/24, piuttosto che 0.0.0.0/0.

[[ Dal Client ]]              [[ Dal 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

Figura 16: Esempio VPN Split-Tunnel

8.2. VPN site-to-site

Il seguente esempio mostra come connettere una rete di una filiale a una rete aziendale in modo che tutte le macchine su quelle reti possano comunicare. In questo esempio, il client proxy IP è collegato alla rete della filiale 192.0.2.0/24 e il proxy IP è collegato alla rete aziendale 203.0.113.0/24. Ci sono client legacy sulla rete della filiale che consentono solo richieste di manutenzione da macchine sulla loro sottorete, quindi il proxy IP è fornito con un indirizzo IP da quella sottorete.

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

Figura 17: Esempio VPN Site-to-Site

In questo caso, il client non specifica alcun ambito nella sua richiesta. Il proxy IP assegna al client un indirizzo IPv4 (203.0.113.100) e un percorso split-tunnel verso la rete aziendale (203.0.113.0/24). Il client assegna al proxy IP un indirizzo IPv4 (192.0.2.200) e un percorso split-tunnel verso la rete della filiale (192.0.2.0/24). Ciò consente agli host su entrambe le reti di comunicare tra loro e consente al proxy IP di eseguire la manutenzione sugli host legacy nella filiale. Si noti che gli endpoint proxy IP decrementeranno il conteggio dei salti IP (o TTL) quando incapsulano i pacchetti inoltrati, quindi i protocolli che richiedono che quel campo sia impostato su 255 non funzioneranno.

[[ Dal Client ]]              [[ Dal 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

Figura 18: Esempio capsula VPN Site-to-Site

8.3. Inoltro del flusso IP

Il seguente esempio mostra una configurazione di inoltro del flusso IP, in cui un client richiede di stabilire un tunnel di inoltro verso target.example.com utilizzando il protocollo SCTP (Stream Control Transmission Protocol) (protocollo IP 132) e riceve un singolo indirizzo locale e un indirizzo remoto che può utilizzare per la trasmissione di pacchetti. Un approccio simile potrebbe essere utilizzato per qualsiasi altro protocollo IP che non è facilmente inviato tramite proxy con i metodi HTTP esistenti, come ICMP, Encapsulating Security Payload (ESP), ecc.

+--------+ IP A         IP B +--------+
| +-------------------+ IP | IP C
| Client | IP C <--> D | Proxy +---------> IP D
| +-------------------+ |
+--------+ +--------+

Figura 19: Configurazione flusso proxy

In questo caso, il client specifica sia un nome host di destinazione che un numero di protocollo Internet nell'ambito della sua richiesta, indicando che deve comunicare solo con un singolo host. Il proxy IP è in grado di eseguire la risoluzione DNS per conto del client e allocare un socket in uscita specifico per il client invece di allocare un intero indirizzo IP al client. A questo proposito, la richiesta è simile a una normale richiesta proxy CONNECT.

Il proxy IP assegna un singolo indirizzo IPv6 al client (2001:db8🔢:a) e un percorso verso un singolo host IPv6 (2001:db8:3456::b) limitato a SCTP. Il client può inviare e ricevere pacchetti IP SCTP verso l'host remoto.

[[ Dal Client ]]              [[ Dal 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

Figura 20: Esempio flusso SCTP proxy

8.4. Corsa alla connessione proxy

Il seguente esempio mostra una configurazione in cui un client sta eseguendo il proxy di pacchetti UDP attraverso un proxy IP al fine di controllare la corsa allo stabilimento della connessione attraverso un proxy IP, come definito in Happy Eyeballs [HEv2]. Questo esempio è una variante del flusso proxy ma evidenzia come il proxy a livello IP possa abilitare nuove capacità, anche per TCP e UDP.

+--------+ IP A         IP B +--------+ IP C
| +-------------------+ |<------------> IP E
| Client | IP C <--> E | IP |
| | D <--> F | Proxy |
| +-------------------+ |<------------> IP F
+--------+ +--------+ IP D

Figura 21: Configurazione corsa alla connessione proxy

Come con i flussi proxy, il client specifica sia un nome host di destinazione che un numero di protocollo Internet nell'ambito della sua richiesta. Quando il proxy IP esegue la risoluzione DNS per conto del client, può inviare le varie opzioni di indirizzo remoto al client come percorsi separati. Può anche garantire che al client siano assegnati sia indirizzi IPv4 che IPv6.

Il proxy IP assegna sia un indirizzo IPv4 (192.0.2.3) che un indirizzo IPv6 (2001:db8🔢:a) al client, nonché un percorso IPv4 (198.51.100.2) e un percorso IPv6 (2001:db8:3456::b), che rappresentano gli indirizzi risolti del nome host di destinazione, limitati a UDP. Il client può inviare e ricevere pacchetti IP UDP a uno degli indirizzi proxy IP per abilitare Happy Eyeballs attraverso il proxy IP.

[[ Dal Client ]]              [[ Dal 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

Figura 22: Esempio corsa alla connessione proxy