Задать вопрос
@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;
  });
});
  • Вопрос задан
  • 159 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
11 дек. 2024, в 17:18
999 руб./в час
11 дек. 2024, в 17:12
5000 руб./за проект
11 дек. 2024, в 17:10
20000 руб./за проект