8. 例
HTTPでのIPプロキシは、IPパケットのプロキシとトンネリングから恩恵を受けることができる多くの異なるユースケースを可能にする。これらの例は、HTTPでのIPプロキシを使用できるいくつかの方法を説明するために提供されている。
8.1. リモートアクセスVPN
以下の例は、クライアントが一連のローカルアドレスを受信し、IPプロキシを介して任意のリモートホストに送信できるポイントツーネットワークVPN設定を示している。このようなVPN設定は、フルトンネルまたはスプリットトンネルのいずれかになる。
+--------+ IP A IP B +--------+ +---> IP D
| +--------------------+ IP | IP C |
| Client | IP Subnet C <--> ? | Proxy +-----------+---> IP E
| +--------------------+ | |
+--------+ +--------+ +---> IP ...
図14: VPNトンネル設定
この場合、クライアントは要求でスコープを指定しない。IPプロキシは、クライアントにIPv4アドレス(192.0.2.11)とすべてのIPv4アドレス(0.0.0.0/0)のフルトンネルルートを割り当てる。その後、クライアントは、割り当てられたアドレスを送信元アドレスとして使用して、任意のIPv4ホストに送信できる。
[[ クライアントから ]] [[ 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
図15: VPNフルトンネルの例
スプリットトンネルVPNの設定(クライアントが特定のプライベートサブネットのセットにのみアクセスできる場合)も非常に似ている。この場合、広告されるルートは0.0.0.0/0ではなく192.0.2.0/24に制限される。
[[ クライアントから ]] [[ 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
図16: VPNスプリットトンネルの例
8.2. サイト間VPN
以下の例は、ブランチオフィスのネットワークを企業ネットワークに接続して、それらのネットワーク上のすべてのマシンが通信できるようにする方法を示している。この例では、IPプロキシクライアントはブランチオフィスネットワーク192.0.2.0/24に接続され、IPプロキシは企業ネットワーク203.0.113.0/24に接続されている。ブランチオフィスネットワークには、サブネット上のマシンからのメンテナンス要求のみを許可するレガシークライアントがあるため、IPプロキシはそのサブネットからのIPアドレスでプロビジョニングされる。
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
図17: サイト間VPNの例
この場合、クライアントは要求でスコープを指定しない。IPプロキシは、クライアントにIPv4アドレス(203.0.113.100)と企業ネットワーク(203.0.113.0/24)へのスプリットトンネルルートを割り当てる。クライアントは、IPプロキシにIPv4アドレス(192.0.2.200)とブランチオフィスネットワーク(192.0.2.0/24)へのスプリットトンネルルートを割り当てる。これにより、両方のネットワーク上のホストが互いに通信できるようになり、IPプロキシがブランチオフィスのレガシーホストでメンテナンスを実行できるようになる。IPプロキシエンドポイントは、転送されたパケットをカプセル化するときにIPホップカウント(またはTTL)を減らすため、そのフィールドを255に設定する必要があるプロトコルは機能しないことに注意すること。
[[ クライアントから ]] [[ 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
図18: サイト間VPNカプセルの例
8.3. IPフロールーティング
以下の例は、IPフロールーティング設定を示している。クライアントは、Stream Control Transmission Protocol (SCTP)(IPプロトコル132)を使用してtarget.example.comへの転送トンネルの確立を要求し、パケットの送信に使用できる単一のローカルアドレスとリモートアドレスを受信する。ICMP、Encapsulating Security Payload (ESP)など、既存のHTTPメソッドでは簡単にプロキシできない他のIPプロトコルにも同様のアプローチを使用できる。
+--------+ IP A IP B +--------+
| +-------------------+ IP | IP C
| Client | IP C <--> D | Proxy +---------> IP D
| +-------------------+ |
+--------+ +--------+
図19: プロキシされたフロー設定
この場合、クライアントは要求のスコープでターゲットホスト名とインターネットプロトコル番号の両方を指定し、単一のホストとのみ通信する必要があることを示す。IPプロキシは、クライアントに代わってDNS解決を実行し、IPアドレス全体をクライアントに割り当てる代わりに、クライアントに特定のアウトバウンドソケットを割り当てることができる。この点において、要求は通常のCONNECTプロキシ要求に似ている。
IPプロキシは、クライアントに単一のIPv6アドレス(2001:db8🔢:a)と、SCTPにスコープされた単一のIPv6ホスト(2001:db8:3456::b)へのルートを割り当てる。クライアントは、リモートホストとの間でSCTP IPパケットを送受信できる。
[[ クライアントから ]] [[ 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
図20: プロキシされたSCTPフローの例
8.4. プロキシされた接続レーシング
以下の例は、Happy Eyeballs [HEv2] で定義されているように、IPプロキシを介した接続確立のレーシングを制御するために、クライアントがIPプロキシを介してUDPパケットをプロキシしている設定を示している。この例は、プロキシされたフローのバリエーションであるが、IPレベルのプロキシがTCPやUDPであっても新しい機能をどのように有効にできるかを強調している。
+--------+ IP A IP B +--------+ IP C
| +-------------------+ |<------------> IP E
| Client | IP C <--> E | IP |
| | D <--> F | Proxy |
| +-------------------+ |<------------> IP F
+--------+ +--------+ IP D
図21: プロキシされた接続レーシング設定
プロキシされたフローと同様に、クライアントは要求のスコープでターゲットホスト名とインターネットプロトコル番号の両方を指定する。IPプロキシがクライアントに代わってDNS解決を実行すると、さまざまなリモートアドレスオプションを個別のルートとしてクライアントに送信できる。また、クライアントにIPv4アドレスとIPv6アドレスの両方が割り当てられていることを確認することもできる。
IPプロキシは、IPv4アドレス(192.0.2.3)とIPv6アドレス(2001:db8🔢:a)の両方をクライアントに割り当て、UDPにスコープされたターゲットホスト名の解決されたアドレスを表すIPv4ルート(198.51.100.2)とIPv6ルート(2001:db8:3456::b)も割り当てる。クライアントは、IPプロキシアドレスのいずれかにUDP IPパケットを送受信して、IPプロキシを介してHappy Eyeballsを有効にすることができる。
[[ クライアントから ]] [[ 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
図22: プロキシされた接続レーシングの例