AWS Lambda@Edge
AWS Lambda@Edge를 사용하여 CDN 수준에서 트래픽을 차단하는 것은 ProxyTracer를 사용하는 가장 안전하고 비용 효율적인 방법입니다. AWS 엣지에서 악의적인 요청을 삭제하면 봇넷 트래픽으로부터 원본 서버를 완전히 보호하고 컴퓨팅 비용을 절약할 수 있습니다.
구현
이 함수는 CloudFront Viewer Request 이벤트에 연결됩니다. 이벤트 개체에서 직접 클라이언트 IP를 읽고, ProxyTracer에 대한 빠른 비동기 가져오기를 수행하고, 프록시가 감지되면 구성된 '403 Forbidden' 응답을 사용자에게 직접 반환합니다.
export const handler = async (event) => {
const request = event.Records[0].cf.request;
// 1. CloudFront에서 직접 클라이언트 IP를 안전하게 추출
const clientIp = request.clientIp;
// 로컬 테스트이거나 IP를 찾을 수 없는 경우 통과
if (!clientIp) {
return request;
}
try {
// 2. ProxyTracer API 쿼리 (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}`
},
// 엄격한 500ms 타임아웃을 적용하기 위해 AbortController 사용
signal: AbortSignal.timeout(500)
});
if (ptResponse.ok) {
const data = await ptResponse.json();
// 3. 프록시가 감지되면 즉시 연결 차단
if (data.proxy === true) {
// 커스텀 응답을 반환하여 CloudFront 요청을 단락(short-circuit) 처리
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. 정상 트래픽인 경우 원본 서버로 계속 라우팅하기 위해 요청 객체 반환
return request;
};배포 참고 사항: CloudFront에서는 전 세계적으로 복제하기 전에 여기에서 모든 Lambda@Edge 함수를 시작해야 하므로 이 Lambda 함수가 us-east-1 지역에 배포되었는지 확인하세요.
최종 수정일: