如何绑定谷歌云转发规则IP地址并发送?

2024-04-16

我已按照说明进行操作使用协议转发 https://cloud.google.com/compute/docs/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 个转发规则)。到目前为止,一切都很好。

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

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

另外,如果我尝试绑定实例的外部 IP 地址:

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

然后我得到一个错误。

但是,如果我尝试绑定转发规则使用的外部 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)

我只看到两个接口。显然,Google Cloud Platform Networking 的能力已经超出了我在大学计算机网络课程中的记忆。总结一下我的观察:

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

这是我的问题:

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

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

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

希望有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何绑定谷歌云转发规则IP地址并发送? 的相关文章

随机推荐

  • iOS VoiceOver“找不到标题”

    我有一个 UITableView 其中每个 UITableViewCell 有 2 个 UILabels 1 个标题和 1 个内容 标头的 AccessibilityTrait 设置为 header 使用辅助功能检查器检查模拟器屏幕时 我能
  • 如何在React功能组件中添加事件

    我有一个关于 React 函数式组件的问题 特别是关于函数式组件中的函数的问题 例如 import React useEffect from react const Component props gt useEffect gt windo
  • 扫描新指纹时如何触发KeyPermanentlyInvalidatedException

    如上所述here https stackoverflow com a 44926774 3142611 我正在尝试触发KeyPermanentlyInvalidatedException当新的指纹添加到设备但未触发此异常时 MyCode F
  • Python 中可用和已使用的系统内存? [复制]

    这个问题在这里已经有答案了 如何从 Python 获取可用和当前使用的内存 它需要是跨平台的 并且至少可以在 Windows Mac OS X 和 Linux 上运行 我想向我的应用程序中的用户报告没有足够的可用内存来继续 你应该看看psu
  • 使用 XSLT 转换 XML 时保留实体引用?

    使用 XSLT 2 0 转换 XML 时如何保留实体引用 对于我尝试过的所有处理器 默认情况下都会解析实体 我可以用xsl character map处理字符实体 但是文本实体呢 例如 这个 XML gt
  • C# Datagridview 不对 Checkbox 列进行排序

    当我将 Linq to sql 查询绑定到 datagridview 在其间使用 BindingSource 时 默认情况下这些列是可排序的 然而 布尔类型似乎并非如此 对于这些 datagridview 使用复选框列 但是当我单击标题时没
  • .NET 多线程变量访问

    我有一个有 4 个线程的应用程序 GUI 控制器 生产者 消费者 GUI 是不言自明的 控制器在进行一些初始设置后启动生产者和消费者线程 生产者创建项目并将它们放置在 环形缓冲区 的空闲槽中 消费者从 环形缓冲区 中取出项目并将其写入磁盘
  • 当 Git 或 TortoiseGit 出现冲突时,正确的提交/推送方式是什么?

    我们正在使用 git 和合并工作流程 我们有很多 git 新手 包括 我 要么有 SVN 或 CVS 背景 要么没有版本控制背景 根本不 这是我们经常遇到的问题 许多团队成员都是 使用 TortoiseGit 由于并发 合并冲突经常发生 改
  • 什么是准备好的陈述?它们与动态sql有何不同?

    我没有看到任何重复的问题 但想知道是否有人可以提供一些很好的例子 特别是围绕这些问题的最佳实践 准备好的语句是预编译的您可以在数据库上多次运行的语句 并且 SQLServer 不会在您每次运行它时解析或生成不同的执行计划 通常 您在客户端上
  • Python - 将枚举转换为 Django models.CharField 选择元组 [重复]

    这个问题在这里已经有答案了 我有这个枚举 class Animal Enum DOG dog CAT cat 在 Django 模型中我有这个 possible animals DOG dog cat cat animal models C
  • Android menuitem onclick处理程序的返回值

    在 android 中 当我在 xml 中定义 menuitem 的 onclick 处理程序时
  • Notepad++ 将鼠标悬停在链接或颜色上进行预览?

    我想知道是否有一个选择或plugin 这使我们能够悬停预览要么是CSS颜色 or image 像这样 而且如果你将鼠标悬停在 img src 上 预览图片 尝试 Notepad 快速颜色选择器 双击十六进制颜色 会弹出一个颜色选择器以及预览
  • 如何使我的布局能够向下滚动?

    我无法向下滚动屏幕查看 回复者 部分中的数据 如何使我的布局可滚动 只需将所有内容包裹在一个ScrollView
  • 从具有重复值的 MySQL 结果创建多维嵌套数组 (PHP)

    我目前正在使用 PDO fetchAll 函数从数据库中提取菜单数据 这样做会将查询结果的每一行放入以下结构的数组中 Array 0 gt Array MenuId gt mmnlinlm08l6r7e8ju53n1f58 MenuName
  • 如何使用python比较两个html文件

    我想使用 python 来比较两个 html 文件 例子 html 1 p i love it p html 2 h2 i love it diff 文件将如下所示 diff html h2
  • 从 Hashicorp 金库存储和检索文件

    我不知道如何在 hashcorpVault 中存储文件 我们的 PoC 用例是将 SSL 证书存储在特定路径 然后通过 HTTP API 下载它 我尝试使用 kv 秘密引擎 这似乎是最合适的 似乎您可以指定一个包含数据的文件来存储为 Has
  • 如何使用 OAUTH2 从 Java 访问 Outlook.office365.com IMAP?

    由于 Microsoft 宣布很快将无法再通过基本身份验证访问 Outlook IMAP 邮箱 因此我正在尝试弄清楚如何在 Java 中使用 OAUTH2 正确打开 IMAP 邮箱 但我总是收到错误代码 A1 NO AUTHENTICATE
  • 将文本流从 NodeJS 传递到浏览器

    我正在尝试将 NodeJS 中处理的文本文件流式传输到浏览器 以下是处理前的文本文件 该文件名为 dbUsers json userId 443 email email protected cdn cgi l email protectio
  • 使用 RestSharp 根据请求添加证书

    我正在尝试与服务器通信 该服务器向我发送证书和私钥 以便成功执行我的请求 为了测试服务器 我使用Postman https www getpostman com 所以我在邮递员中填写了证书设置 并且我的请求工作正常 现在我想在 C 中做同样
  • 如何绑定谷歌云转发规则IP地址并发送?

    我已按照说明进行操作使用协议转发 https cloud google com compute docs protocol forwarding 在谷歌云平台上 所以我现在有这样的东西 gcloud compute forwarding r