Commit eeb559ec authored by nanahira's avatar nanahira

manual lookup

parent 16665cdc
Pipeline #21236 failed with stages
in 93 minutes and 56 seconds
...@@ -3,6 +3,8 @@ import { Server, createConnection } from 'net'; ...@@ -3,6 +3,8 @@ import { Server, createConnection } from 'net';
import { hashAddress } from './src/hash-address'; import { hashAddress } from './src/hash-address';
import { createLogger } from 'bunyan'; import { createLogger } from 'bunyan';
import { Socket } from 'net'; import { Socket } from 'net';
import Address from 'ipaddr.js';
import dns from 'dns';
declare module 'net' { declare module 'net' {
interface Server { interface Server {
...@@ -24,25 +26,39 @@ const log = createLogger({ name: 'switcher' }); ...@@ -24,25 +26,39 @@ const log = createLogger({ name: 'switcher' });
const server: Server = createProxyServer({ const server: Server = createProxyServer({
auth: true, auth: true,
createProxyConnection: async (info) => { createProxyConnection: async (info) => {
let socket: Socket; const src: Address.IPv4 | Address.IPv6 = info.socket[targetIpSym];
log.info( log.info(
`Connecting to ${info.dstHost}:${info.dstPort} with ${info.socket[targetIpSym]}`, `Connecting to ${info.dstHost}:${info.dstPort} with ${src?.toString()}`,
); );
let socket: Socket;
if (src) {
try { try {
const lookup = await dns.promises.lookup(
info.dstHost,
src.kind() === 'ipv4' ? 4 : 6,
);
socket = createConnection({ socket = createConnection({
host: info.dstHost, host: lookup.address,
port: info.dstPort, port: info.dstPort,
localAddress: info.socket[targetIpSym] || undefined, localAddress: src.toString(),
}); });
} catch (e) { } catch (e) {
log.warn( log.warn(
`Failed to connect to ${info.dstHost}:${info.dstPort}, retrying direct connection: ${e}`, `Remote ${
info.dstHost
} does not support ${src.kind()}, fallback to direct connect.`,
); );
socket = createConnection({ socket = createConnection({
host: info.dstHost, host: info.dstHost,
port: info.dstPort, port: info.dstPort,
}); });
} }
} else {
socket = createConnection({
host: info.dstHost,
port: info.dstPort,
});
}
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
socket.on('connect', () => resolve(socket)); socket.on('connect', () => resolve(socket));
socket.on('error', (error) => reject(error)); socket.on('error', (error) => reject(error));
...@@ -56,8 +72,9 @@ server.on('proxy-auth', (socket, username, password, callback) => { ...@@ -56,8 +72,9 @@ server.on('proxy-auth', (socket, username, password, callback) => {
return; return;
} }
const token = `${username}:${password}`; const token = `${username}:${password}`;
socket[targetIpSym] = hashAddress(process.env.CIDR, token).toString(); const address = hashAddress(process.env.CIDR, token);
log.info(`Mapped ${token} to ${socket[targetIpSym]}`); socket[targetIpSym] = address;
log.info(`Mapped ${token} to ${address.toString()}`);
callback(true); callback(true);
}); });
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment