diff --git a/docs/configuration_fa.md b/docs/configuration_fa.md index 40c3885cc..923be8da3 100644 --- a/docs/configuration_fa.md +++ b/docs/configuration_fa.md @@ -173,11 +173,15 @@ > [!CAUTION] > اگر از طریق پنل Proxy IP رو اعمال کنید و اون IP از کار بیافته، باید یه IP جایگزین کنید و ساب رو آپدیت کنید. معنیش اینه که اگر کانفیگ اهدا کرده باشید و Proxy IP رو تغییر بدید دیگه فایده‌ای نداره چون یوزر ساب نداره که کانفیگ رو آپدیت کنه. بنابراین توصیه میشه از این روش فقط برای مصرف شخصی استفاده کنید. اما خوبی روش قدیمی اینه که نیازی به آپدیت کردن کانفیگ‌ها نداره. -برای مثال میتونید از لینک‌ زیر Proxy IP انتخاب کنید، یه تعدادی IP نشون میده که میتونید کشورشون رو هم چک کنید و یه دونه انتخاب کنید: +برای مثال میتونید از لینک‌ زیر Proxy IP انتخاب کنید، یه تعدادی IP نشون میده که میتونید کشورشون رو هم چک کنید و یک یا چندتا انتخاب کنید: >[Proxy IP](https://www.nslookup.io/domains/bpb.yousef.isegaro.com/dns-records/) یا میتونید از [این آموزش](https://github.com/bia-pain-bache/BPB-Worker-Panel/blob/main/docs/proxy-ip-scanner.md) برای خودتون اسکن کنید. البته در حال حاضر ممکنه اسکنر خوب جواب نده، میتونید امتحان کنید. + +> [!TIP] +> اگر خواستید چند Proxy IP داشته باشید میتونید با ویرگول وارد کنید، مثل `151.213.181.145`,`5.163.51.41`,`bpb.yousef.isegaro.com` +

### 1-3- تنظیمات Chain Proxy diff --git a/docs/pages_installation_fa.md b/docs/pages_installation_fa.md index 8ef64f712..92ee62324 100644 --- a/docs/pages_installation_fa.md +++ b/docs/pages_installation_fa.md @@ -120,7 +120,7 @@ یه بار `Add variable` بزنید و خونه اول رو بنویسید `UUID` با حروف بزرگ، بعد از [اینجا](https://www.uuidgenerator.net/) یه UUID بگیرید و بذارید خونه دوم. -حالا یه بار دیگه `Add variable` بزنید خونه اول `PROXYIP` با حروف بزرگ، IP رو هم میتونید از لینک‌ زیر بگیرید، اینا رو باز کنید یه تعدادی IP نشون میده که میتونید کشورشون رو هم چک کنید و یه دونه انتخاب کنید: +حالا یه بار دیگه `Add variable` بزنید خونه اول `PROXYIP` با حروف بزرگ، IP رو هم میتونید از لینک‌ زیر بگیرید، اینا رو باز کنید یه تعدادی IP نشون میده که میتونید کشورشون رو هم چک کنید و یک یا چندتا انتخاب کنید: >[Proxy IP](https://www.nslookup.io/domains/bpb.yousef.isegaro.com/dns-records/) @@ -128,6 +128,10 @@

+> [!TIP] +> اگر خواستید چند Proxy IP داشته باشید میتونید با ویرگول وارد کنید، مثل `151.213.181.145`,`5.163.51.41`,`bpb.yousef.isegaro.com` + + یه بار دیگه `Add variable` بزنید خونه اول `TROJAN_PASS` با حروف بزرگ، یه پسورد دلخواه بذارید. > [!TIP] diff --git a/docs/worker_installation_fa.md b/docs/worker_installation_fa.md index 02cbba86d..3b74ccddd 100644 --- a/docs/worker_installation_fa.md +++ b/docs/worker_installation_fa.md @@ -75,7 +75,7 @@ یه بار `Add variable` بزنید و خونه اول رو بنویسید `UUID` با حروف بزرگ، بعد از [اینجا](https://www.uuidgenerator.net/) یه UUID بگیرید و بذارید خونه دوم. -حالا یه بار دیگه `Add variable` بزنید خونه اول `PROXYIP` با حروف بزرگ، IP رو هم میتونید از لینک‌ زیر بگیرید، اینا رو باز کنید یه تعدادی IP نشون میده که میتونید کشورشون رو هم چک کنید و یه دونه انتخاب کنید: +حالا یه بار دیگه `Add variable` بزنید خونه اول `PROXYIP` با حروف بزرگ، IP رو هم میتونید از لینک‌ زیر بگیرید، اینا رو باز کنید یه تعدادی IP نشون میده که میتونید کشورشون رو هم چک کنید و یک یا چندتا انتخاب کنید: >[Proxy IP](https://www.nslookup.io/domains/bpb.yousef.isegaro.com/dns-records/) @@ -83,6 +83,10 @@

+> [!TIP] +> اگر خواستید چند Proxy IP داشته باشید میتونید با ویرگول وارد کنید، مثل `151.213.181.145`,`5.163.51.41`,`bpb.yousef.isegaro.com` + + یه بار دیگه `Add variable` بزنید خونه اول `TROJAN_PASS` با حروف بزرگ، یه پسورد دلخواه بذارید.

diff --git a/src/helpers/init.js b/src/helpers/init.js index f57525fc1..ec1a213d4 100644 --- a/src/helpers/init.js +++ b/src/helpers/init.js @@ -1,12 +1,13 @@ import { isValidUUID } from './helpers'; -const proxyIPs = ['bpb.yousef.isegaro.com']; +const defaultProxyIP = 'bpb.yousef.isegaro.com'; let userID, dohURL, proxyIP, trojanPassword, defaultHttpPorts, defaultHttpsPorts, panelVersion, hostName, origin, client, pathName; function initParams(request, env) { + const proxyIPs = env.PROXYIP?.split(',').map(proxyIP => proxyIP.trim()); userID = env.UUID || '89b3cbba-e6ac-485a-9481-976a0415eab9'; if (!isValidUUID(userID)) throw new Error(`Invalid UUID: ${userID}`); dohURL = env.DOH_URL || 'https://cloudflare-dns.com/dns-query'; - proxyIP = env.PROXYIP || proxyIPs[Math.floor(Math.random() * proxyIPs.length)]; + proxyIP = proxyIPs ? proxyIPs[Math.floor(Math.random() * proxyIPs.length)] : defaultProxyIP; trojanPassword = env.TROJAN_PASS || 'bpb-trojan'; defaultHttpPorts = ['80', '8080', '2052', '2082', '2086', '2095', '8880']; defaultHttpsPorts = ['443', '8443', '2053', '2083', '2087', '2096']; diff --git a/src/kv/handlers.js b/src/kv/handlers.js index 793956a39..0175e4a32 100644 --- a/src/kv/handlers.js +++ b/src/kv/handlers.js @@ -79,7 +79,7 @@ export async function updateDataset (request, env) { resolvedRemoteDNS: resolvedRemoteDNS, localDNS: validateField('localDNS') ?? currentSettings?.localDNS ?? '8.8.8.8', vlessTrojanFakeDNS: validateField('vlessTrojanFakeDNS') ?? currentSettings?.vlessTrojanFakeDNS ?? false, - proxyIP: validateField('proxyIP')?.trim() ?? currentSettings?.proxyIP ?? '', + proxyIP: validateField('proxyIP')?.replaceAll(' ', '') ?? currentSettings?.proxyIP ?? '', outProxy: validateField('outProxy') ?? currentSettings?.outProxy ?? '', outProxyParams: extractChainProxyParams(validateField('outProxy')) ?? currentSettings?.outProxyParams ?? {}, cleanIPs: validateField('cleanIPs')?.replaceAll(' ', '') ?? currentSettings?.cleanIPs ?? '', diff --git a/src/pages/home.js b/src/pages/home.js index 39fd5fd0a..8e5b85775 100644 --- a/src/pages/home.js +++ b/src/pages/home.js @@ -413,7 +413,7 @@ export async function renderHomePage (request, env, proxySettings, isPassSet) {
- +
@@ -1144,7 +1144,7 @@ export async function renderHomePage (request, env, proxySettings, isPassSet) { const lengthMax = getValue('fragmentLengthMax'); const intervalMin = getValue('fragmentIntervalMin'); const intervalMax = getValue('fragmentIntervalMax'); - const proxyIP = document.getElementById('proxyIP').value?.trim(); + const proxyIP = document.getElementById('proxyIP'); const cleanIP = document.getElementById('cleanIPs'); const customCdnAddrs = document.getElementById('customCdnAddrs').value?.split(',').filter(addr => addr !== ''); const customCdnHost = document.getElementById('customCdnHost').value; @@ -1158,6 +1158,7 @@ export async function renderHomePage (request, env, proxySettings, isPassSet) { const noiseDelayMin = getValue('noiseDelayMin'); const noiseDelayMax = getValue('noiseDelayMax'); const cleanIPs = cleanIP.value?.split(','); + const proxyIPs = proxyIP.value?.split(','); const chainProxy = document.getElementById('outProxy').value?.trim(); const formData = new FormData(configForm); const isVless = /vless:\\/\\/[^\s@]+@[^\\s:]+:[^\\s]+/.test(chainProxy); @@ -1178,7 +1179,7 @@ export async function renderHomePage (request, env, proxySettings, isPassSet) { !formData.has(checkbox.name) && formData.append(checkbox.name, 'false'); }); - const invalidIPs = [...cleanIPs, proxyIP, ...customCdnAddrs, customCdnHost, customCdnSni]?.filter(value => { + const invalidIPs = [...cleanIPs, ...proxyIPs, ...customCdnAddrs, customCdnHost, customCdnSni]?.filter(value => { if (value) { const trimmedValue = value.trim(); return !validIPDomain.test(trimmedValue); @@ -1241,6 +1242,7 @@ export async function renderHomePage (request, env, proxySettings, isPassSet) { console.error(errorMessage, response.status); alert('⚠️ Session expired! Please login again.'); window.location.href = '/login'; + return; } alert('✅ Parameters applied successfully 😎'); window.location.reload(); diff --git a/src/protocols/trojan.js b/src/protocols/trojan.js index cc9da1080..ab2571a7b 100644 --- a/src/protocols/trojan.js +++ b/src/protocols/trojan.js @@ -200,9 +200,10 @@ async function handleTCPOutBound( // if the cf connect tcp socket have no incoming data, we retry to redirect ip async function retry() { - let panelProxyIP = pathName.split('/')[2]; - panelProxyIP = panelProxyIP ? atob(panelProxyIP) : undefined; - const tcpSocket = await connectAndWrite(panelProxyIP || proxyIP || addressRemote, portRemote); + const panelProxyIP = pathName.split('/')[2]; + const panelProxyIPs = panelProxyIP ? atob(panelProxyIP).split(',') : undefined; + const finalProxyIP = panelProxyIPs ? panelProxyIPs[Math.floor(Math.random() * panelProxyIPs.length)] : proxyIP || addressRemote; + const tcpSocket = await connectAndWrite(finalProxyIP, portRemote); // no matter retry success or not, close websocket tcpSocket.closed .catch((error) => { diff --git a/src/protocols/vless.js b/src/protocols/vless.js index 1d4f3c1a7..04612f8dc 100644 --- a/src/protocols/vless.js +++ b/src/protocols/vless.js @@ -176,9 +176,10 @@ async function handleTCPOutBound( // if the cf connect tcp socket have no incoming data, we retry to redirect ip async function retry() { - let panelProxyIP = pathName.split('/')[2]; - panelProxyIP = panelProxyIP ? atob(panelProxyIP) : undefined; - const tcpSocket = await connectAndWrite(panelProxyIP || proxyIP || addressRemote, portRemote); + const panelProxyIP = pathName.split('/')[2]; + const panelProxyIPs = panelProxyIP ? atob(panelProxyIP).split(',') : undefined; + const finalProxyIP = panelProxyIPs ? panelProxyIPs[Math.floor(Math.random() * panelProxyIPs.length)] : proxyIP || addressRemote; + const tcpSocket = await connectAndWrite(finalProxyIP, portRemote); // no matter retry success or not, close websocket tcpSocket.closed .catch((error) => {