Python 如何绑定和发送来自谷歌云转发规则的IP地址?
我已经按照谷歌云平台上的说明进行了操作。所以我现在有这样的东西:Python 如何绑定和发送来自谷歌云转发规则的IP地址?,python,networking,google-compute-engine,google-cloud-platform,Python,Networking,Google Compute Engine,Google Cloud Platform,我已经按照谷歌云平台上的说明进行了操作。所以我现在有这样的东西: $ 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.?.??
$ 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
(注意:姓名已更改,问号已替换。我不确定是否需要将这些信息保密,但最好是安全的。)
我的实例“x”在“x-target-instance”中,有五条转发规则“x-fr-1”到“x-fr-5”。我在“x”上运行nginx,我可以从它的6个外部IP地址中的任何一个访问它(实例+5转发规则为1)。到目前为止,一切顺利
我现在感兴趣的是将服务器绑定到这些外部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()
现在我可以绑定“0.0.0.0”,并得到一些有趣的结果:
>>> serve("0.0.0.0")
('173.228.???.??', 57288) ('10.240.?.?', 80)
('173.228.???.??', 57286) ('104.198.?.??', 80)
当我在服务器的外部IP地址上与服务器通信时,“getsockname”方法返回实例的内部IP地址。但是,当我使用转发规则使用的外部IP地址与服务器通信时,“getsockname”方法返回外部IP地址
好的,现在我绑定实例的内部IP地址:
>>> serve("10.240.?.?")
('173.228.???.??', 57295) ('10.240.?.?', 80)
>>> serve("104.198.?.??")
error: [Errno 99] Cannot assign requested address
同样,我可以通过服务器的外部IP地址与服务器通信,“getsockname”方法返回实例的内部IP地址。这似乎有点奇怪
另外,如果我尝试绑定实例的外部IP地址:
>>> serve("10.240.?.?")
('173.228.???.??', 57295) ('10.240.?.?', 80)
>>> serve("104.198.?.??")
error: [Errno 99] Cannot assign requested address
然后我得到一个错误
但是,如果我尝试绑定转发规则使用的外部IP地址,然后发出请求:
>>> serve("104.198.??.???")
('173.228.???.??', 57313) ('104.198.??.???', 80)
它起作用了
最后我看一下“ifconfig”:
我只看到两个接口。很明显,谷歌云平台联网的能力已经超过了我在大学计算机联网课上的记忆。总结我的观察:
希望有帮助 对于第三个问题,我们通常在tcp:22上创建一个防火墙,源IP范围为内部网络IP范围,这样只接受来自内部网络的连接。回答得很好,但外部IP和转发规则IP的实现方式不同的原因是什么?本地路由表是针对这台机器的IP目的地吗?因此,它应该转发到传输层(TCP/UDP),而不是转发到下一个跃点。我不能权威地解释为什么它们的实现方式不同——我只想说它们是这样,Google选择使用指定的外部IP地址为您进行NAT,但不使用转发规则IP。[事实上,它们没有NAT转发规则IP,这有助于区分给定客户机的目标]至于本地路由表-几乎是的。请注意,如果“ping”该表中的任何本地地址,它将被路由到环回接口。目前我能找到的最好的参考是Re:#5,无论是“全局转发规则”还是“转发规则”选项卡都没有列出任何规则。虽然我有六个,而且他们看起来都在工作。绝对是个虫子。你说得对。云控制台似乎列出了针对“目标池”的转发规则,而不是针对“目标实例”的转发规则。至少现在,如果您想让它们出现,请使用单个实例和target设置一个目标池