Skip to content

Commit

Permalink
Added multiple proxy IP support, fixed UI bug.
Browse files Browse the repository at this point in the history
  • Loading branch information
bia-pain-bache committed Nov 12, 2024
1 parent 6233db0 commit 60f1d83
Show file tree
Hide file tree
Showing 8 changed files with 32 additions and 15 deletions.
6 changes: 5 additions & 1 deletion docs/configuration_fa.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`
<br><br>

### 1-3- تنظیمات Chain Proxy
Expand Down
6 changes: 5 additions & 1 deletion docs/pages_installation_fa.md
Original file line number Diff line number Diff line change
Expand Up @@ -120,14 +120,18 @@

یه بار `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/)
<p align="center">
<img src="assets/images/Proxy_ips.jpg">
</p>

> [!TIP]
> اگر خواستید چند Proxy IP داشته باشید میتونید با ویرگول وارد کنید، مثل `151.213.181.145`,`5.163.51.41`,`bpb.yousef.isegaro.com`

یه بار دیگه `Add variable` بزنید خونه اول `TROJAN_PASS` با حروف بزرگ، یه پسورد دلخواه بذارید.

> [!TIP]
Expand Down
6 changes: 5 additions & 1 deletion docs/worker_installation_fa.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,14 +75,18 @@

یه بار `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/)
<p align="center">
<img src="assets/images/Proxy_ips.jpg">
</p>

> [!TIP]
> اگر خواستید چند Proxy IP داشته باشید میتونید با ویرگول وارد کنید، مثل `151.213.181.145`,`5.163.51.41`,`bpb.yousef.isegaro.com`

یه بار دیگه `Add variable` بزنید خونه اول `TROJAN_PASS` با حروف بزرگ، یه پسورد دلخواه بذارید.
<br><br>

Expand Down
5 changes: 3 additions & 2 deletions src/helpers/init.js
Original file line number Diff line number Diff line change
@@ -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'];
Expand Down
2 changes: 1 addition & 1 deletion src/kv/handlers.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 ?? '',
Expand Down
8 changes: 5 additions & 3 deletions src/pages/home.js
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ export async function renderHomePage (request, env, proxySettings, isPassSet) {
</div>
<div class="form-control">
<label for="proxyIP">📍 Proxy IP</label>
<input type="text" id="proxyIP" name="proxyIP" value="${proxyIP}">
<input type="text" id="proxyIP" name="proxyIP" value="${proxyIP.replaceAll(",", " , ")}">
</div>
<div class="form-control">
<label for="outProxy">✈️ Chain Proxy</label>
Expand Down Expand Up @@ -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;
Expand All @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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();
Expand Down
7 changes: 4 additions & 3 deletions src/protocols/trojan.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand Down
7 changes: 4 additions & 3 deletions src/protocols/vless.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand Down

0 comments on commit 60f1d83

Please sign in to comment.