AWS Lambda@Edge
Proteggi la tua infrastruttura AWS eseguendo il rilevamento dei proxy all'edge all'interno di AWS CloudFront utilizzando Lambda@Edge.
L'Implementazione
Lambda@Edge consente di intercettare le richieste CloudFront sull'evento Viewer Request. Se ProxyTracer contrassegna un IP, interrompiamo anticipatamente la pipeline delle richieste e restituiamo un payload 403 Forbidden personalizzato direttamente dai nodi edge globali di AWS.
export const handler = async (event) => {
const request = event.Records[0].cf.request;
// 1. Estrai in modo sicuro l'IP del client direttamente da CloudFront
const clientIp = request.clientIp;
// Lascia passare in caso di test locale o se non viene trovato alcun IP
if (!clientIp) {
return request;
}
try {
// 2. Interroga l'API ProxyTracer (Lambda Node 18+ supporta fetch nativo)
const ptResponse = await fetch(`https://api.proxytracer.com/v1/check/${clientIp}`, {
method: 'GET',
headers: {
'Authorization': `Bearer ${process.env.PROXYTRACER_API_KEY}`
},
// Utilizzo di un AbortController per applicare un timeout rigoroso di 500ms
signal: AbortSignal.timeout(500)
});
if (ptResponse.ok) {
const data = await ptResponse.json();
// 3. Interrompi immediatamente la connessione se viene rilevato un proxy
if (data.proxy === true) {
// La restituzione di una risposta personalizzata interrompe anticipatamente la richiesta CloudFront
return {
status: '403',
statusDescription: 'Forbidden',
headers: {
'content-type': [{ key: 'Content-Type', value: 'application/json' }]
},
body: JSON.stringify({ error: "Access Denied: VPN or Proxy detected." })
};
}
}
} catch (error) {
// Fail open: se l'API va in timeout, consenti il traffico per garantire l'uptime
console.error('ProxyTracer API Error:', error);
}
// 4. Il traffico è pulito, restituisci l'oggetto request per continuare l'inoltro verso l'origine
return request;
};Distribuisci questa funzione come funzione Lambda@Edge associata alla tua distribuzione CloudFront sull'evento Viewer Request. Assicurati che la tua regione di esecuzione sia impostata su us-east-1 (richiesto da AWS per la distribuzione edge globale).
Ultimo aggiornamento il