Zum Hauptinhalt springen

8. Beispiele

IP-Proxying in HTTP ermöglicht viele verschiedene Anwendungsfälle, die von IP-Paket-Proxying und -Tunneling profitieren können. Diese Beispiele sollen helfen, einige der Möglichkeiten zu veranschaulichen, wie IP-Proxying in HTTP verwendet werden kann.

8.1. Remote-Access-VPN

Das folgende Beispiel zeigt eine Point-to-Network-VPN-Einrichtung, bei der ein Client einen Satz lokaler Adressen empfängt und über den IP-Proxy an jeden beliebigen Remote-Host senden kann. Solche VPN-Einrichtungen können entweder Full-Tunnel oder Split-Tunnel sein.

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

Abbildung 14: VPN-Tunnel-Einrichtung

In diesem Fall gibt der Client keinen Bereich in seiner Anfrage an. Der IP-Proxy weist dem Client eine IPv4-Adresse (192.0.2.11) und eine Full-Tunnel-Route aller IPv4-Adressen (0.0.0.0/0) zu. Der Client kann dann unter Verwendung seiner zugewiesenen Adresse als Quelladresse an jeden beliebigen IPv4-Host senden.

[[ Vom Client ]]              [[ Vom IP-Proxy ]]

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

Abbildung 15: VPN-Full-Tunnel-Beispiel

Eine Einrichtung für ein Split-Tunnel-VPN (der Fall, in dem der Client nur auf einen bestimmten Satz privater Subnetze zugreifen kann) ist sehr ähnlich. In diesem Fall ist die angekündigte Route auf 192.0.2.0/24 beschränkt, anstatt auf 0.0.0.0/0.

[[ Vom Client ]]              [[ Vom IP-Proxy ]]

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

Abbildung 16: VPN-Split-Tunnel-Beispiel

8.2. Site-to-Site-VPN

Das folgende Beispiel zeigt, wie ein Zweigstellennetzwerk so mit einem Unternehmensnetzwerk verbunden wird, dass alle Maschinen in diesen Netzwerken kommunizieren können. In diesem Beispiel ist der IP-Proxying-Client an das Zweigstellennetzwerk 192.0.2.0/24 angeschlossen, und der IP-Proxy ist an das Unternehmensnetzwerk 203.0.113.0/24 angeschlossen. Es gibt Legacy-Clients im Zweigstellennetzwerk, die nur Wartungsanfragen von Maschinen in ihrem Subnetz zulassen, daher wird dem IP-Proxy eine IP-Adresse aus diesem Subnetz bereitgestellt.

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

Abbildung 17: Site-to-Site-VPN-Beispiel

In diesem Fall gibt der Client keinen Bereich in seiner Anfrage an. Der IP-Proxy weist dem Client eine IPv4-Adresse (203.0.113.100) und eine Split-Tunnel-Route zum Unternehmensnetzwerk (203.0.113.0/24) zu. Der Client weist dem IP-Proxy eine IPv4-Adresse (192.0.2.200) und eine Split-Tunnel-Route zum Zweigstellennetzwerk (192.0.2.0/24) zu. Dies ermöglicht es Hosts in beiden Netzwerken, miteinander zu kommunizieren, und ermöglicht es dem IP-Proxy, Wartungsarbeiten an Legacy-Hosts in der Zweigstelle durchzuführen. Beachten Sie, dass IP-Proxying-Endpunkte den IP-Hop-Count (oder TTL) verringern, wenn sie weitergeleitete Pakete kapseln, sodass Protokolle, die erfordern, dass dieses Feld auf 255 gesetzt ist, nicht funktionieren.

[[ Vom Client ]]              [[ Vom IP-Proxy ]]

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

Abbildung 18: Site-to-Site-VPN-Kapselbeispiel

8.3. IP-Flow-Weiterleitung

Das folgende Beispiel zeigt eine IP-Flow-Weiterleitungseinrichtung, bei der ein Client anfordert, einen Weiterleitungstunnel zu target.example.com unter Verwendung des Stream Control Transmission Protocol (SCTP) (IP-Protokoll 132) aufzubauen, und eine einzelne lokale Adresse und eine Remote-Adresse erhält, die er zum Übertragen von Paketen verwenden kann. Ein ähnlicher Ansatz könnte für jedes andere IP-Protokoll verwendet werden, das mit vorhandenen HTTP-Methoden nicht einfach per Proxy übertragen werden kann, wie z. B. ICMP, Encapsulating Security Payload (ESP) usw.

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

Abbildung 19: Proxy-Flow-Einrichtung

In diesem Fall gibt der Client sowohl einen Zielhostnamen als auch eine Internetprotokollnummer im Bereich seiner Anfrage an, was darauf hinweist, dass er nur mit einem einzelnen Host kommunizieren muss. Der IP-Proxy ist in der Lage, eine DNS-Auflösung im Namen des Clients durchzuführen und dem Client einen bestimmten ausgehenden Socket zuzuweisen, anstatt dem Client eine ganze IP-Adresse zuzuweisen. In dieser Hinsicht ähnelt die Anfrage einer regulären CONNECT-Proxy-Anfrage.

Der IP-Proxy weist dem Client eine einzelne IPv6-Adresse (2001:db8🔢:a) und eine Route zu einem einzelnen IPv6-Host (2001:db8:3456::b) zu, der auf SCTP beschränkt ist. Der Client kann SCTP-IP-Pakete an den Remote-Host senden und von diesem empfangen.

[[ Vom Client ]]              [[ Vom IP-Proxy ]]

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

Abbildung 20: Beispiel für einen per Proxy übertragenen SCTP-Flow

8.4. Proxied Connection Racing

Das folgende Beispiel zeigt eine Einrichtung, bei der ein Client UDP-Pakete über einen IP-Proxy per Proxy überträgt, um das Wettrennen um den Verbindungsaufbau über einen IP-Proxy zu steuern, wie in Happy Eyeballs [HEv2] definiert. Dieses Beispiel ist eine Variante des per Proxy übertragenen Flows, hebt jedoch hervor, wie Proxying auf IP-Ebene neue Funktionen ermöglichen kann, sogar für TCP und UDP.

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

Abbildung 21: Proxied Connection Racing Einrichtung

Wie bei per Proxy übertragenen Flows gibt der Client sowohl einen Zielhostnamen als auch eine Internetprotokollnummer im Bereich seiner Anfrage an. Wenn der IP-Proxy eine DNS-Auflösung im Namen des Clients durchführt, kann er die verschiedenen Remote-Adressoptionen als separate Routen an den Client senden. Er kann auch sicherstellen, dass dem Client sowohl IPv4- als auch IPv6-Adressen zugewiesen sind.

Der IP-Proxy weist dem Client sowohl eine IPv4-Adresse (192.0.2.3) als auch eine IPv6-Adresse (2001:db8🔢:a) sowie eine IPv4-Route (198.51.100.2) und eine IPv6-Route (2001:db8:3456::b) zu, die die aufgelösten Adressen des Zielhostnamens darstellen, beschränkt auf UDP. Der Client kann UDP-IP-Pakete an eine der IP-Proxy-Adressen senden und von dieser empfangen, um Happy Eyeballs über den IP-Proxy zu aktivieren.

[[ Vom Client ]]              [[ Vom IP-Proxy ]]

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

Abbildung 22: Beispiel für Proxied Connection Racing