You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 22.04多静态IP配置失效,Python多IP爬虫请求无法正常发送

Ubuntu 22.04多静态IP配置失效,Python多IP爬虫请求无法正常发送

看起来你在给Ubuntu 22.04配置多静态IP用于Python爬虫时,遇到了网络连通性的问题——不管是用mtr测试指定源IP,还是用Python代码发送请求都没法正常工作。我来帮你一步步排查和解决这个问题。

问题根源分析

从你提供的ip route输出和Netplan配置来看,核心问题出在路由规则冲突和缺少策略路由配置:

  1. 你之前的配置里多个网卡都设置了默认路由,但没有指定metric(优先级),导致系统不知道该用哪个网关转发流量;
  2. 没有配置策略路由规则,系统无法识别“来自某个源IP的流量应该走对应的网卡网关”,所以即使你指定了源IP,流量也可能走了错误的路由。

解决方案:正确配置Netplan策略路由

我们需要给每个网卡分配独立的路由表,并添加策略规则让特定源IP的流量匹配对应路由。修改你的/etc/netplan/50-cloud-init.yaml为以下内容:

network:
  version: 2
  ethernets:
    eth0:
      addresses:
        - 5.34.201.22/22
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]
      routes:
        - to: default
          via: 5.34.200.1
          metric: 100
          table: 100
      routing-policy:
        - from: 5.34.201.22
          table: 100
    eth1:
      addresses:
        - 188.121.116.94/22
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]
      routes:
        - to: default
          via: 188.121.116.1
          metric: 101
          table: 101
      routing-policy:
        - from: 188.121.116.94
          table: 101
    eth2:
      addresses:
        - 5.34.201.218/22
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]
      routes:
        - to: default
          via: 5.34.200.1
          metric: 102
          table: 102
      routing-policy:
        - from: 5.34.201.218
          table: 102
    eth3:
      addresses:
        - 188.121.119.142/22
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]
      routes:
        - to: default
          via: 188.121.116.1
          metric: 103
          table: 103
      routing-policy:
        - from: 188.121.119.142
          table: 103

配置说明:

  • 每个网卡配置独立的静态IP,子网掩码保持和你原来的/22一致;
  • 给每个默认路由设置不同的metric(100-103),避免路由优先级冲突;
  • 每个路由绑定一个专属路由表(比如table:100对应eth0);
  • routing-policy规则告诉系统:来自某个源IP的流量必须使用对应的路由表,这样就能保证指定源IP的请求走正确的网卡网关。

应用配置并验证

执行以下命令让配置生效:

sudo netplan generate
sudo netplan apply

然后验证配置是否正确:

  1. 查看所有路由表,确认每个源IP对应的路由存在:
    ip route show table all
    
  2. 查看策略路由规则,确认每个源IP都绑定了对应的路由表:
    ip rule list
    

测试连通性

现在用mtr测试每个源IP的连通性:

mtr -a 5.34.201.22 example.com
mtr -a 188.121.116.94 example.com
mtr -a 5.34.201.218 example.com
mtr -a 188.121.119.142 example.com

如果还是不通,检查以下几点:

  • 确认服务器网卡物理连接正常(云服务器的话检查控制台是否已分配对应IP);
  • 检查防火墙是否允许出站流量:sudo ufw status,如果开启了防火墙,确保允许HTTP/HTTPS出站;
  • 联系服务商确认IP、子网、网关的正确性,比如IP是否属于对应的子网段,网关是否可达。

调整Python请求代码

给你的Python代码添加超时和错误处理,方便排查问题,同时确保源IP绑定正确:

import requests
from requests_toolbelt.adapters.source import SourceAddressAdapter

def send_request(source_ip):
    try:
        session = requests.Session()
        # 绑定指定源IP到适配器
        adapter = SourceAddressAdapter(source_ip)
        session.mount('http://', adapter)
        session.mount('https://', adapter)
        
        # 添加超时设置,避免请求卡住
        response = session.get('https://example.com/', timeout=10)
        response.raise_for_status()  # 抛出HTTP状态码错误
        print(f"源IP {source_ip} 请求成功!状态码: {response.status_code}")
        return response
    except Exception as e:
        print(f"源IP {source_ip} 请求失败: {str(e)}")

# 测试所有IP
send_request('5.34.201.22')
send_request('188.121.116.94')
send_request('5.34.201.218')
send_request('188.121.119.142')

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 10:49:35