Задать вопрос
@AlexAnalysist

Как настроить простейшее селективное туннелирование для прокси?

Добрый день! Делаю прокси для Яндекс браузера. Сам рабочий прокси сделать получилось, но никак не могу настроить вайтлист для доменов так, чтобы домены вне вайтлиста не рестриктились и проходили через сеть клиента.

В JS и работой в серверах я не силен от слова совсем, после часового диалога с gpt, подозреваю, что я неверно настроил pac-файл или сам vps. Буду дико благодарен за помощь. Если нужна дополнительная информация - пишите, сразу отправлю.

proxy.pac
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";
}


background.js:
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
const proxyHost = "proxyhost"; 
const proxyPort = 0000; 

const proxyButton = document.getElementById("proxyButton");

function updateButtonState(isConnected) {
  if (isConnected) {
    proxyButton.textContent = "Disconnect";
    proxyButton.dataset.state = "connected";
  } else {
    proxyButton.textContent = "Connect";
    proxyButton.dataset.state = "disconnected";
  }
}

function getProxyStatus(callback) {
  chrome.proxy.settings.get({ incognito: false }, (details) => {
    const isConnected =
      details.value &&
      details.value.rules &&
      details.value.rules.singleProxy &&
      details.value.rules.singleProxy.host === proxyHost &&
      details.value.rules.singleProxy.port === proxyPort;
    callback(isConnected);
  });
}

function setProxy() {
  chrome.proxy.settings.set(
    {
      value: {
        mode: "fixed_servers",
        rules: {
          singleProxy: {
            scheme: "https",
            host: proxyHost,
            port: proxyPort
          }
        }
      },
      scope: "regular"
    },
    () => {
      updateButtonState(true);
    }
  );
}

function clearProxy() {
  chrome.proxy.settings.clear({ scope: "regular" }, () => {
    updateButtonState(false);
  });
}

proxyButton.addEventListener("click", () => {
  if (proxyButton.dataset.state === "disconnected") {
    setProxy();
  } else if (proxyButton.dataset.state === "connected") {
    clearProxy();
  }
});

document.addEventListener("DOMContentLoaded", () => {
  proxyButton.textContent = "Загрузка...";
  proxyButton.disabled = true;
  getProxyStatus((isConnected) => {
    updateButtonState(isConnected);
    proxyButton.disabled = false;
  });
});
  • Вопрос задан
  • 272 просмотра
Подписаться 1 Средний 1 комментарий
Помогут разобраться в теме Все курсы
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
  • Академия Eduson
    Fullstack-разработчик на JavaScript
    11 месяцев
    Далее
  • Skillbox
    JavaScript
    3 месяца
    Далее
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы