AWS Lambda@Edge
Перехват трафика на уровне CDN с помощью AWS Lambda@Edge — самый безопасный и экономичный способ использования ProxyTracer. Отбрасывая вредоносные запросы на границе сети AWS, вы полностью защищаете свои серверы от ботнетов и экономите на вычислительных ресурсах.
Реализация
Эта функция подключается к событию CloudFront Viewer Request. Она считывает IP клиента непосредственно из объекта события, выполняет быстрый асинхронный запрос к ProxyTracer и возвращает ответ 403 Forbidden напрямую пользователю в случае обнаружения прокси.
export const handler = async (event) => {
const request = event.Records[0].cf.request;
// 1. Безопасно извлечь IP клиента напрямую из CloudFront
const clientIp = request.clientIp;
// Пропустить при локальном тестировании или если IP-адрес не найден
if (!clientIp) {
return request;
}
try {
// 2. Выполнить запрос к API ProxyTracer (Lambda Node 18+ поддерживает нативный fetch)
const ptResponse = await fetch(`https://api.proxytracer.com/v1/check/${clientIp}`, {
method: 'GET',
headers: {
'Authorization': `Bearer ${process.env.PROXYTRACER_API_KEY}`
},
// Использование AbortController для обеспечения строгого таймаута 500 мс
signal: AbortSignal.timeout(500)
});
if (ptResponse.ok) {
const data = await ptResponse.json();
// 3. Немедленно сбросить соединение, если обнаружен прокси
if (data.proxy === true) {
// Возврат кастомного ответа прерывает обработку запроса 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: если время ожидания API истекло, разрешить трафик для обеспечения непрерывной работы
console.error('ProxyTracer API Error:', error);
}
// 4. Трафик чист, вернуть объект запроса для продолжения маршрутизации к origin
return request;
};Заметка по развертыванию: Убедитесь, что эта Lambda-функция развернута в регионе us-east-1, так как CloudFront требует инициировать все функции Lambda@Edge именно оттуда перед глобальной репликацией.
Последнее обновление: