You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

单网卡绑定多IP时无法响应多网关公网请求的问题求助

单网卡绑定多IP时无法响应多网关公网请求的问题求助

大家好,我最近遇到一个网络配置的难题,折腾了好几种Netplan配置都没解决,想请教下各位:

我的环境情况是这样的:

  • 网络里有两个网关:gw1(10.0.0.1)和gw2(11.0.0.1),两者都能提供互联网访问,并且都配置了NAT端口转发规则,把80和443端口转发到我的服务器
  • 我的服务器是Ubuntu 20.04,单网卡eth0绑定了两个IP:10.0.0.55/24(标记为eth0:gw1)和11.0.0.55/24(标记为eth0:gw2)
  • 服务器上的Nginx已经配置好能响应这两个IP的请求,内网访问一切正常,但公网访问的时候,只有默认网关对应的那个IP能正常响应,另一个会出现连接超时(我单独切换过默认网关,确认两个网关本身都是可用的)

我按照Netplan文档试了好几十种配置,始终没法让两个公网IP都正常响应,每次只有默认网关的那个能工作。我不是网络工程师,甚至不确定这种场景到底能不能实现?

下面是我当前的Netplan配置:

network:
  version: 2
  ethernets:
    eth0:
      dhcp4: false
      optional: true
      addresses:
        - 10.0.0.55/24:
            label: "eth0:gw1"
        - 11.0.0.55/24:
            label: "eth0:gw2"
      nameservers:
        addresses:
          - 1.1.1.1
          - 1.0.0.1
          - 8.8.8.8
          - 8.8.4.4
      routes:
        - to: default
          via: 10.0.0.1
        - to: default
          via: 10.0.0.1
          metric: 200
          table: 101
        - to: default
          via: 11.0.0.1
          metric: 200
          table: 102
      routing-policy:
        - to: 10.0.0.0/24
          from: 10.0.0.0/24
          table: 101
        - to: 11.0.0.0/24
          from: 11.0.0.0/24
          table: 102

问题原因分析

你的问题核心是缺少针对公网流量的源地址路由策略

当前的路由策略只针对内网段(10.0.0.0/24和11.0.0.0/24)的流量做了规则,但公网过来的请求,服务器在响应时会使用默认网关的路由,导致回程路径和请求进来的路径不匹配(比如从gw2过来的请求,服务器响应时走gw1回去),这种不对称路由会被网关的NAT规则拦截,最终出现连接超时。

简单来说:要让公网请求正常响应,必须保证从哪个IP进来的流量,就从哪个IP出去,走对应的网关

解决办法(修改Netplan配置)

你需要调整routing-policy部分,添加针对服务器自身两个IP的源路由规则,同时修正路由表的配置:

修改后的Netplan配置如下:

network:
  version: 2
  ethernets:
    eth0:
      dhcp4: false
      optional: true
      addresses:
        - 10.0.0.55/24:
            label: "eth0:gw1"
        - 11.0.0.55/24:
            label: "eth0:gw2"
      nameservers:
        addresses:
          - 1.1.1.1
          - 1.0.0.1
          - 8.8.8.8
          - 8.8.4.4
      routes:
        # 保留主路由表的默认网关(可选,作为 fallback 路由)
        - to: default
          via: 10.0.0.1
          metric: 100
        # 为gw1的IP配置专属路由表
        - to: 0.0.0.0/0
          via: 10.0.0.1
          table: 101
        # 为gw2的IP配置专属路由表
        - to: 0.0.0.0/0
          via: 11.0.0.1
          table: 102
      routing-policy:
        # 当源IP是10.0.0.55时,强制使用路由表101
        - from: 10.0.0.55
          table: 101
          priority: 100
        # 当源IP是11.0.0.55时,强制使用路由表102
        - from: 11.0.0.55
          table: 102
          priority: 100
        # 保留内网段的路由规则(可选,确保内网流量也走对应网关)
        - to: 10.0.0.0/24
          from: 10.0.0.0/24
          table: 101
          priority: 200
        - to: 11.0.0.0/24
          from: 11.0.0.0/24
          table: 102
          priority: 200

配置生效步骤

  1. 保存上述配置到/etc/netplan/目录下(比如/etc/netplan/01-netcfg.yaml
  2. 执行命令测试配置:sudo netplan try(这个命令会临时应用配置,如果有问题会自动回滚,很安全)
  3. 确认没问题后,执行sudo netplan apply永久生效

原理说明

  • 我们为每个服务器IP创建了专属的路由表(101对应gw1,102对应gw2),每个路由表都指向对应的网关
  • 路由策略(routing-policy)指定:当服务器以10.0.0.55作为源IP发送响应时,必须走路由表101(即gw1);以11.0.0.55作为源IP时走路由表102(即gw2)
  • 这样公网请求进来时,Nginx使用对应的IP响应,响应流量会走对应的网关回去,保证了路径对称,网关的NAT规则就能正常匹配,请求也就不会超时了

备注:内容来源于stack exchange,提问作者fox91

火山引擎 最新活动