Как настроить простейшее селективное туннелирование для прокси?
Делаю прокси для Яндекс браузера. Сам рабочий прокси сделать получилось, но никак не могу настроить вайтлист для доменов так, чтобы домены вне вайтлиста не рестриктились и проходили через сеть клиента.
В 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;
});
});