Wie binde und sende ich die IP-Adresse der Google Cloud-Weiterleitungsregel?

Ich habe die Anweisungen für @ befolVerwenden der Protokollweiterleitung auf der Google Cloud-Plattform. Also ich habe jetzt so etwas:

$ gcloud compute forwarding-rules list
NAME    REGION    IP_ADDRESS      IP_PROTOCOL  TARGET
x-fr-1  us-west1  104.198.?.??    TCP          us-west1-a/targetInstances/x-target-instance
x-fr-2  us-west1  104.198.?.??    TCP          us-west1-a/targetInstances/x-target-instance
x-fr-3  us-west1  104.198.??.???  TCP          us-west1-a/targetInstances/x-target-instance
x-fr-4  us-west1  104.198.??.???  TCP          us-west1-a/targetInstances/x-target-instance
x-fr-5  us-west1  104.198.?.???   TCP          us-west1-a/targetInstances/x-target-instance

(Hinweis: Namen wurden geändert und Fragezeichen wurden ersetzt. Ich bin mir nicht sicher, ob es wichtig ist, diese privat zu halten, aber besser geschützt als leid.)

Meine Instanz "x" befindet sich in der "x-Ziel-Instanz" und hat fünf Weiterleitungsregeln "x-fr-1" bis "x-fr-5". Ich starte nginx mit "x" und kann von einer der 6 externen IP-Adressen darauf zugreifen (1 für die Instanz + 5 Weiterleitungsregeln). So weit, ist es gut

Ich bin jetzt daran interessiert, einen Server an diese externen IP-Adressen zu binden. Zum Erkunden habe ich versucht, Python zu verwenden:

import socket
import time

def serve(ip_address, port=80):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind((ip_address, port))
    try:
        sock.listen(5)
        while True:
            con, _ = sock.accept()
            print con.getpeername(), con.getsockname()
            con.send(time.ctime())
            con.close()
    finally:
        sock.close()

Jetzt kann ich "0.0.0.0" binden und erhalte einige interessante Ergebnisse:

>>> serve("0.0.0.0")
('173.228.???.??', 57288) ('10.240.?.?', 80)
('173.228.???.??', 57286) ('104.198.?.??', 80)

Wenn ich über die externe IP-Adresse mit dem Server kommuniziere, gibt die Methode "getsockname" die interne IP-Adresse der Instanz zurück. Wenn ich jedoch mit dem Server über eine externe IP-Adresse kommuniziere, die von einer Weiterleitungsregel verwendet wird, geben die Methoden "getsockname" die externe IP-Adresse zurück.

Ok, jetzt binde ich die interne IP-Adresse der Instanz:

>>> serve("10.240.?.?")
('173.228.???.??', 57295) ('10.240.?.?', 80)

Again Ich kann über seine externe IP-Adresse mit dem Server kommunizieren, und die Methode "getsockname" gibt die interne IP-Adresse der Instanz zurück. Das scheint ein bisschen seltsam.

Auch, wenn ich versuche, die externe IP-Adresse der Instanz zu binden:

>>> serve("104.198.?.??")
error: [Errno 99] Cannot assign requested address

Dann erhalte ich eine Fehlermeldung.

Aber wenn ich versuche, die von den Weiterleitungsregeln verwendeten externen IP-Adressen zu binden und dann eine Anfrage zu stellen:

>>> serve("104.198.??.???")
('173.228.???.??', 57313) ('104.198.??.???', 80)

Es klappt

Zum Schluss schaue ich auf "ifconfig":

ens4      Link encap:Ethernet  HWaddr 42:01:0a:??:??:??  
          inet addr:10.240.?.?  Bcast:10.240.?.?  Mask:255.255.255.255
          inet6 addr: fe80::4001:???:????:2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
          RX packets:37554 errors:0 dropped:0 overruns:0 frame:0
          TX packets:32286 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:41201244 (41.2 MB)  TX bytes:3339072 (3.3 MB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:9403 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9403 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:3155046 (3.1 MB)  TX bytes:3155046 (3.1 MB)

Und ich sehe nur zwei Schnittstellen. Die Fähigkeiten von Google Cloud Platform Networking haben eindeutig das übertroffen, woran ich mich in meinem Computer Networking-Kurs am College erinnern kann. Um meine Beobachtungen zusammenzufassen:

Wenn ich die externe IP-Adresse der Instanz binden möchte, binde ich die interne IP-Adresse der Instanz. Ein an die interne IP-Adresse der Instanz gebundener Prozess kann die Ziel-IP nicht zwischen den internen oder externen IP-Adressen der Instanz unterscheiden. Der einzelne Netzwerkadapter "ens4" empfängt Pakete, die an eine der 6 externen IP-Adressen der Instanz gebunden sind.

nd hier sind meine Frage

Warum kann ich die externe IP-Adresse der Instanz nicht binden?Wie kann ich die von Weiterleitungsregeln verwendeten externen IP-Adressen binden, wenn mir keine Netzwerkadapter zugeordnet sind?Wenn ich den SSH-Zugriff auf die externe IP-Adresse der Instanz beschränken möchte, muss ich SSH so konfigurieren, dass die interne IP-Adresse gebunden wird?Wenn ich einen HTTP-Proxy für eine der von einer Weiterleitungsregel verwendeten externen IP-Adressen einrichte, welche Quell-IP-Adresse wird dann für die Proxy-Anforderung verwendet?Lastly, und dies kann ein Fehler sein, warum ist die Liste der Weiterleitungsregeln in der Webschnittstelle unter @ lehttps: //console.cloud.google.com/networking/loadbalancing/advanced/forwardingRules/list? project = xxx Wann kann ich sie mit "gcloud compute forwarding-rules list" sehen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage