Ubuntu 22.04多静态IP配置失效,Python多IP爬虫请求无法正常发送
Ubuntu 22.04多静态IP配置失效,Python多IP爬虫请求无法正常发送
看起来你在给Ubuntu 22.04配置多静态IP用于Python爬虫时,遇到了网络连通性的问题——不管是用mtr测试指定源IP,还是用Python代码发送请求都没法正常工作。我来帮你一步步排查和解决这个问题。
问题根源分析
从你提供的ip route输出和Netplan配置来看,核心问题出在路由规则冲突和缺少策略路由配置:
- 你之前的配置里多个网卡都设置了默认路由,但没有指定
metric(优先级),导致系统不知道该用哪个网关转发流量; - 没有配置策略路由规则,系统无法识别“来自某个源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
然后验证配置是否正确:
- 查看所有路由表,确认每个源IP对应的路由存在:
ip route show table all - 查看策略路由规则,确认每个源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
相关产品推荐
相关产品推荐

