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

Selenium代码中IPv6代理失效,报ERR_TUNNEL_CONNECTION_FAILED错误求助

排查并修复Selenium Chrome IPv6代理认证的ERR_TUNNEL_CONNECTION_FAILED错误

核心问题分析

你遇到的错误核心原因是IPv6地址未按Chrome要求格式化,另外还有几处配置细节需要调整,导致代理隧道连接失败。

具体修复步骤

1. 修正IPv6代理地址格式

Chrome要求IPv6代理地址必须用方括号[]包裹,修改background_js中的host配置:

singleProxy: {
    scheme: "http", // 根据代理实际类型调整,如https
    host: "[%s]", // 给IPv6地址添加方括号
    port: parseInt(%s)
},

2. 匹配代理scheme与实际类型

如果你的IPv6代理是HTTPS类型,将scheme从"http"改为"https",否则会因协议不匹配导致隧道连接失败。

3. 适配新版Chrome的Manifest配置(推荐)

Manifest V2在Chrome 116+版本中已被限制使用,建议升级到Manifest V3,调整后的manifest_json如下:

{
    "version": "1.0.0",
    "manifest_version": 3,
    "name": "Chrome Proxy",
    "permissions": ["proxy", "storage", "webRequest"],
    "host_permissions": ["<all_urls>"],
    "background": {
        "service_worker": "background.js"
    },
    "minimum_chrome_version": "109.0.0"
}

对应的background_js同步调整为V3语法:

var config = {
        mode: "fixed_servers",
        rules: {
        singleProxy: {
            scheme: "http",
            host: "[%s]",
            port: parseInt(%s)
        },
        bypassList: ["localhost"]
        }
    };

chrome.proxy.settings.set({value: config, scope: "regular"}, () => {});

function callbackFn(details) {
    return {
        authCredentials: {
            username: "%s",
            password: "%s"
        }
    };
}

chrome.webRequest.onAuthRequired.addListener(
    callbackFn,
    {urls: ["<all_urls>"]},
    ['blocking']
);

4. 添加无头模式参数(若需启用)

既然你提到要使用无头模式,在get_chromedriver函数中添加对应参数:

chrome_options.add_argument('--headless=new') # 新版无头模式,替代旧的--headless
chrome_options.add_argument('--disable-gpu') # 避免无头模式下的GPU异常

5. 验证代理本身连通性

先通过命令行工具确认IPv6代理可正常访问目标站点,排除代理服务器故障:

curl -x http://[IPv6地址]:端口 -U 用户名:密码 https://test-ipv6.com

修复后的完整代码示例

import zipfile
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from time import sleep

# 替换为你的代理信息
PROXY_HOST = "2001:db8::1"
PROXY_PORT = "8080"
PROXY_USER = "your_username"
PROXY_PASS = "your_password"

manifest_json = """
{
    "version": "1.0.0",
    "manifest_version": 3,
    "name": "Chrome Proxy",
    "permissions": ["proxy", "storage", "webRequest"],
    "host_permissions": ["<all_urls>"],
    "background": {
        "service_worker": "background.js"
    },
    "minimum_chrome_version": "109.0.0"
}
"""

background_js = """
var config = {
        mode: "fixed_servers",
        rules: {
        singleProxy: {
            scheme: "http",
            host: "[%s]",
            port: parseInt(%s)
        },
        bypassList: ["localhost"]
        }
    };
chrome.proxy.settings.set({value: config, scope: "regular"}, () => {});
function callbackFn(details) {
    return {
        authCredentials: {
            username: "%s",
            password: "%s"
        }
    };
}
chrome.webRequest.onAuthRequired.addListener(
            callbackFn,
            {urls: ["<all_urls>"]},
            ['blocking']
);
""" % (PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS)


def get_chromedriver(use_proxy=False, user_agent=None):
    chrome_options = webdriver.ChromeOptions()

    if use_proxy:
        plugin_file = 'proxy_auth_plugin.zip'

        with zipfile.ZipFile(plugin_file, 'w') as zp:
            zp.writestr('manifest.json', manifest_json)
            zp.writestr('background.js', background_js)

        chrome_options.add_extension(plugin_file)

    if user_agent:
        chrome_options.add_argument(f'--user-agent={user_agent}')
    
    # 添加无头模式参数
    chrome_options.add_argument('--headless=new')
    chrome_options.add_argument('--disable-gpu')

    s = Service(
        executable_path='chromedriver.exe'
    )
    driver = webdriver.Chrome(
        service=s,
        options=chrome_options
    )

    return driver


def main():
    driver = get_chromedriver(use_proxy=True,
                              user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36')
    driver.get('https://test-ipv6.com')
    sleep(10)
    driver.quit()


if __name__ == '__main__':
    main()

内容的提问来源于stack exchange,提问作者Artik gnom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:50:29