gpt4 book ai didi

python - 如何从谷歌云转发规则IP地址绑定(bind)发送?

转载 作者:太空狗 更新时间:2023-10-29 18:07:36 26 4
gpt4 key购买 nike

我已按照 Using Protocol Forwarding 的说明进行操作在谷歌云平台上。所以我现在有这样的东西:

$ 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 地址中的任何一个访问它(1 个用于实例 + 5 个转发规则)。到目前为止,还不错。

我现在有兴趣将服务器绑定(bind)到这些外部 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()

现在我可以绑定(bind)“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 地址。

好的,现在我绑定(bind)实例的内部IP地址:

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

我再次可以通过其外部 IP 地址与服务器通信,“getsockname”方法返回实例的内部 IP 地址。这似乎有点奇怪。

此外,如果我尝试绑定(bind)实例的外部 IP 地址:

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

然后我得到一个错误。

但是,如果我尝试绑定(bind)转发规则使用的外部 IP 地址,然后发出请求:

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

有效。

最后我看看“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)

而且我只看到两个接口(interface)。显然,Google Cloud Platform Networking 的能力已经超出了我在大学计算机网络课上的内存。总结一下我的观察:

  1. 如果我想绑定(bind)实例的外部 IP 地址,则绑定(bind)其内部 IP 地址。
  2. 绑定(bind)到实例内部 IP 地址的进程无法区分实例内部或外部 IP 地址之间的目标 IP。
  3. 单个网络适配器“ens4”正在接收绑定(bind)到实例的 6 个外部 IP 地址中的任何一个的数据包。

这是我的问题:

  1. 为什么不能绑定(bind)实例的外网IP地址?
  2. 当我没有关联的网络适配器时,如何绑定(bind)转发规则使用的外部 IP 地址?
  3. 如果我想限制 SSH 访问实例的外部 IP 地址,我应该配置 SSH 绑定(bind)内部 IP 地址吗?
  4. 如果我在转发规则使用的外部 IP 地址之一上设置 HTTP 代理,代理请求的源 IP 是什么?
  5. 最后,这可能是一个错误,为什么在 https://console.cloud.google.com/networking/loadbalancing/advanced/forwardingRules/list?project=xxx 的 Web 界面中转发规则列表是空的?我什么时候可以通过“gcloud compute forwarding-rules list”看到它们?

最佳答案

  1. 它不在本地路由表中('ip route show table local')[ 你当然可以添加它(例如 'ip address add x.x.x.x/32 dev ens4'),但这样做对你没有多大好处,因为没有数据包会使用该地址作为目标地址交付给您的 VM - 请参阅下面...]
  2. 因为转发的地址已经添加到你的本地路由表中('ip route show table local')
  3. 您可以[但请注意,这会限制 ssh 访问以外部 IP 地址为目标的外部客户端,或以外部或内部 IP 地址为目标的虚拟网络中的客户端]。但是,如前所述 - 限制允许的客户端地址(而不是服务器地址)可能更为重要,为此防火墙会更有效。
  4. 这取决于代理请求的目的地。如果它在您的虚拟网络内部,则它将是 VM 的内部 IP 地址,否则它将通过 NAT(在您的 VM 外部)成为 VM 的外部 IP 地址。
  5. 该页面上有多个选项卡 - 其中两个列出了不同类别的转发规则(“全局转发规则”与“转发规则”)。诚然有些困惑 :P

另一件有点令人困惑的事情 - 当使用其外部 IP 作为目标地址向您的 VM 发送数据包时,VM 外部的实体(将其视为虚拟交换机/路由器/NAT 设备)会自动将目标修改为数据包到达虚拟 NIC 的 virtio 驱动程序之前的内部 IP - 因此您无法修改该行为。但是,发送到转发规则的 IP 的数据包未经过 NAT(如您所见)。

希望对您有所帮助!

关于python - 如何从谷歌云转发规则IP地址绑定(bind)发送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38858086/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com