单网卡绑定多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
配置生效步骤
- 保存上述配置到
/etc/netplan/目录下(比如/etc/netplan/01-netcfg.yaml) - 执行命令测试配置:
sudo netplan try(这个命令会临时应用配置,如果有问题会自动回滚,很安全) - 确认没问题后,执行
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




