make dns query workable

This commit is contained in:
Emo-Damage
2023-05-29 11:04:57 +08:00
parent ae126f28a2
commit b3e4547e8f
2 changed files with 41 additions and 16 deletions

View File

@@ -82,13 +82,13 @@ async function vlessOverWSHandler(request) {
hasError, hasError,
message, message,
portRemote, portRemote,
addressRemote, addressRemote = '',
addressType, addressType = 2,
rawDataIndex, rawDataIndex,
vlessVersion = new Uint8Array([0, 0]), vlessVersion = new Uint8Array([0, 0]),
isUDP, isUDP = false,
} = processVlessHeader(chunk, userID); } = processVlessHeader(chunk, userID);
address = addressRemote || ''; address = addressRemote;
portWithRandomLog = `${portRemote}--${Math.random()} ${isUDP ? 'udp ' : 'tcp ' portWithRandomLog = `${portRemote}--${Math.random()} ${isUDP ? 'udp ' : 'tcp '
} `; } `;
// if UDP but port not DNS port, close it // if UDP but port not DNS port, close it
@@ -110,24 +110,21 @@ async function vlessOverWSHandler(request) {
// get remote address IP // get remote address IP
let redirectIp = ''; let redirectIp = '';
// due to cf connect method can't connect cf own ip, so we use proxy ip // due to cf connect method can't connect cf own ip, so we use proxy ip
const isCFIp = await isCloudFlareIP(addressType, addressRemote); redirectIp = await getRedirectIpForCFWebsite(isUDP, addressType, addressRemote, clientIP);
if(isCFIp) {
redirectIp = proxyIP || clientIP;
console.log(`is cf ip ${addressRemote} redirect to ${redirectIp || '<not found any redirectIp>'}`);
}
const tcpSocket = connect({ const tcpSocket = connect({
hostname: redirectIp || addressRemote, hostname: redirectIp || addressRemote,
port: portRemote, port: portRemote,
}); });
remoteSocket = tcpSocket; remoteSocket = tcpSocket;
log(`connected`); log(`connected to ${redirectIp || addressRemote}`);
const writer = tcpSocket.writable.getWriter(); const writer = tcpSocket.writable.getWriter();
await writer.write(rawClientData); // first write, nomal is tls client hello await writer.write(rawClientData); // first write, nomal is tls client hello
writer.releaseLock(); writer.releaseLock();
// when remoteSocket is ready, pass to websocket // when remoteSocket is ready, pass to websocket
// remote--> ws // remote--> ws
remoteSocketToWS(tcpSocket, webSocket, log, vlessResponseHeader) remoteSocketToWS(tcpSocket, webSocket, vlessResponseHeader, log)
// let remoteConnectionReadyResolve = null; // let remoteConnectionReadyResolve = null;
// remoteConnectionReadyResolve(tcpSocket); // remoteConnectionReadyResolve(tcpSocket);
}, },
@@ -339,9 +336,10 @@ function processVlessHeader(
* *
* @param {import("@cloudflare/workers-types").Socket} remoteSocket * @param {import("@cloudflare/workers-types").Socket} remoteSocket
* @param {import("@cloudflare/workers-types").WebSocket} webSocket * @param {import("@cloudflare/workers-types").WebSocket} webSocket
* @param {Uint8Array} vlessResponseHeader
* @param {*} log * @param {*} log
*/ */
function remoteSocketToWS(remoteSocket, webSocket, log, vlessResponseHeader) { function remoteSocketToWS(remoteSocket, webSocket, vlessResponseHeader, log) {
// remote--> ws // remote--> ws
let remoteChunkCount = 0; let remoteChunkCount = 0;
let chunks = []; let chunks = [];
@@ -431,8 +429,8 @@ function base64ToArrayBuffer(base64Str) {
* @returns * @returns
*/ */
function getClientIp(request) { function getClientIp(request) {
const isCN = request.headers.get('cf-ipcountry')?.toUpperCase() !== 'CN'; const isNotCN = request.headers.get('cf-ipcountry')?.toUpperCase() !== 'CN';
const clientIP = isCN ? request.headers.get('cf-connecting-ip') || '' : ''; const clientIP = isNotCN ? request.headers.get('cf-connecting-ip') || '' : '';
return clientIP; return clientIP;
} }
@@ -537,6 +535,29 @@ function stringify(arr, offset = 0) {
return uuid; return uuid;
} }
/**
*
* @param {boolean} isUDP
* @param {number} addressType
* @param {string} addressRemote
* @param {string} clientIP
* @returns
*/
async function getRedirectIpForCFWebsite(isUDP, addressType, addressRemote, clientIP) {
let redirectIp = '';
const isCFIp = await isCloudFlareIP(addressType, addressRemote);
if (isCFIp) {
redirectIp = proxyIP || clientIP;
// if is CF IP for DNS query, redirect to '8.8.8.8'
if (isUDP) {
redirectIp = '8.8.8.8';
}
console.log(`is cf ip ${addressRemote} redirect to ${redirectIp || '<not found any redirectIp>'}`);
}
return redirectIp;
}
/** /**
* *
* @param {string} ip * @param {string} ip

View File

@@ -6590,3 +6590,7 @@ for (const cidr of cidrList) {
console.log(convertIp2Num('162.159.137.0')); console.log(convertIp2Num('162.159.137.0'));
console.log(isIPv4InCFCIDR('162.159.137.0')); console.log(isIPv4InCFCIDR('162.159.137.0'));
console.log(convertIp2Num('1.1.1.1'));
console.log(isIPv4InCFCIDR('1.1.1.1'));