Gra*_*ntJ 11 python networking google-compute-engine google-cloud-platform
我已按照Google云端平台上的使用协议转发的说明进行操作.所以我现在有这样的事情:
$ 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
Run Code Online (Sandbox Code Playgroud)
(注意:名称已被更改,问号已被替换.我不确定保持这些私密但更安全而不是遗憾.)
我的实例"x"在"x-target-instance"中,并且具有五个转发规则"x-fr-1"到"x-fr-5".我在"x"上运行nginx,我可以从它的6个外部IP地址中的任何一个访问它(1个用于实例+ 5个转发规则).到现在为止还挺好.
我现在感兴趣的是将服务器绑定到这些外部IP地址.为了探索,我尝试使用Python:
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()
Run Code Online (Sandbox Code Playgroud)
现在我可以绑定"0.0.0.0",我得到一些有趣的结果:
>>> serve("0.0.0.0")
('173.228.???.??', 57288) ('10.240.?.?', 80)
('173.228.???.??', 57286) ('104.198.?.??', 80)
Run Code Online (Sandbox Code Playgroud)
当我在服务器上使用其外部IP地址进行通信时,"getsockname"方法返回实例的内部IP地址.但是当我在转发规则使用的外部IP地址上与服务器通信时,"getsockname"方法返回外部IP地址.
好的,现在我绑定实例的内部IP地址:
>>> serve("10.240.?.?")
('173.228.???.??', 57295) ('10.240.?.?', 80)
Run Code Online (Sandbox Code Playgroud)
我再次可以通过其外部IP地址与服务器通信,"getsockname"方法返回实例的内部IP地址.这似乎有点奇怪.
此外,如果我尝试绑定实例的外部IP地址:
>>> serve("104.198.?.??")
error: [Errno 99] Cannot assign requested address
Run Code Online (Sandbox Code Playgroud)
然后我收到一个错误.
但是,如果我尝试绑定转发规则使用的外部IP地址,然后发出请求:
>>> serve("104.198.??.???")
('173.228.???.??', 57313) ('104.198.??.???', 80)
Run Code Online (Sandbox Code Playgroud)
有用.
最后我看看"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)
Run Code Online (Sandbox Code Playgroud)
我只看到两个接口.显然,Google Cloud Platform Networking的功能已经超出了我在大学的计算机网络课程中的记忆.总结一下我的观察:
这是我的问题:
另一件令人困惑的事情 - 当使用外部IP作为目标地址向VM发送数据包时,VM外部的实体(将其视为虚拟交换机/路由器/ NAT设备)会自动将目标修改为内部IP在数据包到达虚拟网卡的virtio驱动程序之前 - 因此您无法修改该行为.但是,寻址到转发规则的IP的数据包不是NAT(正如您所见).
希望有所帮助!