Как настроить базовое селективное туннелирование для прокси-сервера?

Здравствуйте! Я создаю прокси для Яндекс браузера. Успешно реализовал сам рабочий прокси, но у меня возникли трудности с настройкой вайтлиста для доменов. Я хочу, чтобы домены, не входящие в вайтлист, не подвергались ограничению и проходили через сеть клиента. <br/><br/> У меня нет особых навыков в JavaScript и администрировании серверов, и после продолжительного общения с GPT я начинаю подозревать, что неправильно настроил pac-файл или сам VPS. Буду очень признателен за помощь. Если потребуется дополнительная информация, пожалуйста, дайте знать, я быстро отвечу. <br/><br/><b>proxy.pac</b><br/><pre><code class="javascript">function FindProxyForURL(url, host) {
    const whitelist = [
        "whoer.net",
        "google.com"
    ];
    for (let i = 0; i < whitelist.length; i++) {
        if (dnsDomainIs(host, whitelist[i])) {
            return "HTTPS proxyhost:0000"; // Прокси-сервер и порт
        }
    }
    return "DIRECT";
}</code></pre><br/><br/><b>background.js:</b><br/><pre><code class="javascript">chrome.runtime.onInstalled.addListener(() => {
  console.log("Proxy extension installed.");
});
function setProxyWithPac(pacUrl) {
  chrome.proxy.settings.set(
    {
      value: {
        mode: "pac_script",
        pacScript: {
          url: pacUrl
        }
      },
      scope: "regular"
    },
    () => {
      console.log(`PAC script set to ${pacUrl}`);
    }
  );
}

const pacUrl = chrome.runtime.getURL("proxy.pac");
setProxyWithPac(pacUrl);

function clearProxy() {
  chrome.proxy.settings.clear({ scope: "regular" }, () => {
    console.log("Proxy settings cleared.");
  });
}</code></pre><br/><br/><b>popup.js</b><br/><pre><code class="javascript">const proxyHost = "proxyhost"; 
const proxyPort = 0000; 

const proxyButton = document.getElemen
  • 5 декабря 2024 г. 14:43
Ответы на вопрос 1
Давайте разберемся с настройкой вашего PAC-файла для селективного туннелирования с использованием прокси-сервера. Код, который вы предоставили, в целом выглядит правильно, но давайте проверим некоторые моменты и попробуем убедиться, что все работает должным образом.

### Шаг 1: Поскольку вы используете `dnsDomainIs`, важно помнить, что это проверка доменов без учета изменений в поддоменах. Если вам нужны более сложные проверки, возможно, вам стоит использовать `shExpMatch`.

### Шаг 2: Убедитесь, что ваш PAC-файл правильно загружается. Также при загрузке PAC-файла убедитесь, что используется правильный URL в вашем `background.js`.

### Шаг 3: Убедитесь, что JavaScript в `popup.js` правильно завершен, и там нет синтаксических ошибок. На текущий момент `document.getElementById` не завершен, что может привести к ошибке при выполнении. 

Вот пример исправленного PAC-файла и `background.js`.

#### Пример PAC-файла (`proxy.pac`):
```javascript
function FindProxyForURL(url, host) {
    const whitelist = [
        "whoer.net",
        "google.com"
    ];
    
    // Проверка на наличие домена в вайтлисте
    for (let i = 0; i < whitelist.length; i++) {
        if (dnsDomainIs(host, whitelist[i])) {
            return "PROXY proxyhost:0000"; // Прокси-сервер и порт
        }
    }
    
    // Возвращаем настройку для не проксируемых доменов
    return "DIRECT";
}
```

#### Пример `background.js`:
```javascript
chrome.runtime.onInstalled.addListener(() => {
    console.log("Proxy extension installed.");
});

function setProxyWithPac(pacUrl) {
    chrome.proxy.settings.set(
        {
            value: {
                mode: "pac_script",
                pacScript: {
                    url: pacUrl
                }
            },
            scope: "regular"
        },
        () => {
            console.log(`PAC script set to ${pacUrl}`);
        }
    );
}

const pacUrl = chrome.runtime.getURL("proxy.pac");
setProxyWithPac(pacUrl);

function clearProxy() {
    chrome.proxy.settings.clear({ scope: "regular" }, () => {
        console.log("Proxy settings cleared.");
    });
}
```

#### Пример `popup.js` (с учетом завершенности):
```javascript
const proxyHost = "proxyhost"; 
const proxyPort = 0000; 

const proxyButton = document.getElementById("proxyButton"); // Убедитесь, что у вас есть элемент с ID 'proxyButton'

proxyButton.addEventListener("click", () => {
    const pacUrl = chrome.runtime.getURL("proxy.pac");
    setProxyWithPac(pacUrl);
});
```

### Дополнительные советы:
1. **Логи:** Добавьте больше `console.log` заявлений, чтобы отследить, где может происходить сбой в вашем коде.
2. **Проверка настройки:** После установки расширения проверьте, правильно ли применяется прокси в инструментах разработчика (вкладка "Network" в Chrome).
3. **Проверка адресов:** Убедитесь, что домены в вайтлисте точно соответствуют тем, которые вы хотите проксировать, включая правильные суффиксы и поддомены. 

Если после этого проблемы сохраняются, попробуйте обратиться к документации Chrome о прокси-расширениях и PAC-файлах, или уточните, что именно вызывает трудности.
Похожие вопросы