Azure:一个 VM,在两个具有两个公共 IP 的 NIC 上提供两个服务

如何解决Azure:一个 VM,在两个具有两个公共 IP 的 NIC 上提供两个服务

设置

我正在设置 Azure VM(运行 Debian 10 的标准 E2as_v4)来提供多种服务。我想为每个服务使用单独的公共 IP 地址。为了测试我是否可以做到这一点,我设置了以下内容:

vm1
 - nic1
  - vnet1,subnet1
  - ipconfig1: 10.0.1.1 <-> p.0.0.1
  - nsg1
    - allow: ssh (22)
 - nic2
  - vnet1,subnet2
  - ipconfig2: 10.0.2.1 <-> p.0.0.2
  - nsg2
    - allow: http (80)

vnet1
 - subnet1: 10.0.1.0/24
 - subnet2: 10.0.2.0/24
 - address space: [10.0.1.0/24,10.0.2.0/24]

其中 10.x.x.x IP 是私有的,而 p.x.x.x IP 是公共的。

nic1(网络接口)及其附带的 nsg1(网络安全组)是在我创建 VM 时自动创建的;否则它们与 nic2nsg2 对称(除了 nsg2 允许 HTTP 而不是 SSH)。此外,两个 NIC 在 VM 上都可以正常注册。

问题

我可以通过 nic1 (p.0.0.1) 上的公共 IP 连接到 SSH。但是,我无法通过 nic2 (p.0.0.2) 上的公共 IP 连接到 HTTP。

我尝试过的事情

侦听 0.0.0.0。 为了检查我的服务器是否有问题,我让 HTTP 服务器侦听 0.0.0.0。然后我在 nsg1 上允许 HTTP,并在 nic1 上添加了一个辅助 IP 配置和另一个公共 IP(静态 10.0.1.101 <-> p.0.0.3)。我在 VM 的配置中手动添加了静态私有 IP 地址(/run/network/interfaces.d/eth0;可能不是要编辑的正确文件,但 IP 已正确注册)。我现在可以通过与 nic1p.0.0.1p.0.0.3)关联的两个公共 IP 进行连接,但仍然无法通过 nic2p.0.0.2)进行连接。 这意味着我成功地为 VM 上的两个不同服务设置了两个公共 IP,但它们共享同一个 NIC。

配置负载平衡器。我还尝试使用负载平衡器实现相同的设置。在本例中,我创建了一个负载均衡器,其中包含两个后端池 - backend-pool1 用于 nic1backend-pool2 用于 nic2。我将 SSH 流量转移到 backend-pool1,将 HTTP 流量转移到 backend-pool2。结果与上述类似(SSH 连接成功,HTTP 失败,除非我使用 backend-pool1 而不是 backend-pool2)。我还尝试了直接入站 NAT 规则 - 效果相同。

检查通过子网的通信是否正常。最后,我在 subnet2 上创建了一个 VM。无论 NSG 配置如何,我都可以使用私有 IP (10.0.2.1) 与服务通信(我尝试了 NSG 上不允许的端口,但它通过了)。但是,当我使用公共 IP (p.0.0.2) 时它不起作用。

问题

我错过了什么?有没有我没有考虑的设置?无法通过在附加 NIC 上配置的公共 IP 地址连接到我的 VM 的原因是什么?

相关问题

注意:如果信息不够,我可以尝试提供命令行来重新创建设置。我正在运行的 HTTP 服务器是:

sudo docker run -it --rm -p 10.0.2.1:80:80 nginx

然后我替换为在 0.0.0.0 上收听后续测试。

这是我用于测试的最终拓扑。

Topology I used for testing,described above

解决方法

要允许辅助接口(具有公共 IP)访问互联网或从互联网访问,我们不需要创建负载平衡器。相反,我们可以使用 iproute 来维护多个路由表。阅读http://www.rjsystems.nl/en/2100-adv-routing.phpthis SO answer了解更多详情。

经过我的验证,您可以添加以下配置,它在 Linux (ubuntu 18.04) VM 上运行。

  1. 在 Debian GNU/Linux 系统上激活 Linux 高级路由,安装 iproute 包:

    apt-get install iproute

  2. 配置两条默认路由

    echo 2 cheapskate >> /etc/iproute2/rt_tables

  3. 将新的默认路由添加到表cheapskate,然后显示:

    ~# ip route add default via 10.0.2.1 dev eth1 table cheapskate

    ~# ip route show table cheapskate

    default via 10.0.2.1 dev eth1

  4. 当数据包的发件人模式为 10.0.2.4 时添加规则,在这种情况下,应使用优先级为 1000 的路由表 cheapskate

    ip rule add from 10.0.2.4 lookup cheapskate prio 1000

内核搜索从最低优先级编号开始的 ip 规则列表,处理每个路由表,直到数据包被成功路由。

做完这一切,你可以用下面的命令检查一下,你会看到附加到二级接口的公网IP地址。

curl --interface eth1 api.ipify.org?format=json -w "\n"

请注意,您有足够的权限执行上述所有步骤。

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res