Задать вопрос
@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;
  });
});
  • Вопрос задан
  • 270 просмотров
Подписаться 1 Средний 1 комментарий
Помогут разобраться в теме Все курсы
  • Skillbox
    JavaScript
    3 месяца
    Далее
  • Яндекс Практикум
    Фронтенд-разработчик расширенный
    13 месяцев
    Далее
  • Академия Eduson
    Fullstack-разработчик на JavaScript
    11 месяцев
    Далее
Пригласить эксперта
Ваш ответ на вопрос

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

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