
AWS API Gateway의 대규모 IP 풀을 프록시로 활용하여 웹 스크래핑 및 무차별 대입 공격을 위한 의사 무한 IP를 생성하는 Python 라이브러리입니다.
자랑스럽게 스폰서 제공: Swiftproxy
8000만+ IP 풀, 195개 이상 국가의 고성능 거주자 프록시 — 대규모 데이터 수집 및 브라우저 자동화 시 요청 성공률을 높이고 IP 차단을 줄입니다.
requests-ip-rotator, Playwright, Selenium 및 기타 스크래핑 도구와 완벽하게 호환됩니다.
Python 라이브러리로, AWS API Gateway의 방대한 IP 풀을 프록시로 활용하여 웹 스크래핑 및 무차별 대입 공격 시 사실상 무한에 가까운 IP를 생성할 수 있습니다.
이 라이브러리를 사용하면 사이트 및 서비스의 IP 기반 속도 제한을 우회할 수 있습니다.
X-Forwarded-For 헤더는 별도로 지정하지 않는 한 자동으로 무작위화되어 적용됩니다. 그렇지 않으면 AWS가 클라이언트의 실제 IP 주소를 이 헤더로 전송하기 때문입니다.
AWS ApiGateway는 사용 가능한 모든 IP에서 요청을 보냅니다. AWS 인프라가 매우 방대하기 때문에 매번 다른 IP가 사용될 가능성이 거의 100%입니다. ApiGateway를 프록시로 사용하면 이 점을 활용하여 요청마다 다른 IP에서 전송할 수 있습니다. 단, 이러한 요청은 고유한 AWS 헤더(예: X-Amzn-Trace-Id)가 포함되어 있으므로 쉽게 식별 및 차단될 수 있습니다.
이 패키지는 PyPI에 등록되어 있어 다음 방법 중 하나로 설치할 수 있습니다:
pip3 install requests-ip-rotatorpython3 -m pip install requests-ip-rotator
import requests
from requests_ip_rotator import ApiGateway
# 게이트웨이 객체 생성 후 AWS에서 초기화
gateway = ApiGateway("https://site.com")
gateway.start()
# 세션에 게이트웨이 할당
session = requests.Session()
session.mount("https://site.com", gateway)
# 요청 전송 (IP가 무작위화됨)
response = session.get("https://site.com/index.php", params={"theme": "light"})
print(response.status_code)
# 게이트웨이 삭제
gateway.shutdown()
import requests
from requests_ip_rotator import ApiGateway
with ApiGateway("https://site.com") as g:
session = requests.Session()
session.mount("https://site.com", g)
response = session.get("https://site.com/index.php")
print(response.status_code)
방법 #1을 사용할 때 shutdown() 메서드로 게이트웨이를 종료하지 않으면 향후 요금이 발생할 수 있음을 기억하세요.
API Gateway는 리전당 첫 백만 건의 요청이 무료이므로, 대부분의 사용 사례에서 완전히 무료입니다.
이 글을 작성하는 시점 기준으로 AWS는 무료 티어를 초과한 요청에 대해 백만 건당 약 $3를 청구합니다.
요청에 데이터 스트림이 포함된 경우 AWS는 GB당 $0.09의 데이터 전송 요금을 부과합니다.
환경 변수를 통해 인증을 설정하는 것이 좋습니다. awscli를 사용하여 aws configure를 실행하거나, 이 스레드의 단계에 따라 직접 AWS_ACCESS_KEY_ID 및 AWS_SECRET_ACCESS_KEY 변수를 설정할 수 있습니다.
액세스 키 ID와 시크릿은 공식 AWS 튜토리얼에서 찾을 수 있습니다.
ApiGateway 클래스는 다음 선택적 매개변수로 생성할 수 있습니다:
from ip_rotator import ApiGateway, EXTRA_REGIONS, ALL_REGIONS
# 두 리전에만 아웃바운드 HTTP IP 및 포트로 게이트웨이 생성
gateway_1 = ApiGateway("http://1.1.1.1:8080", regions=["eu-west-1", "eu-west-2"])
# 추가 리전 팩으로 HTTPS google 게이트웨이 생성, 액세스 키 쌍 지정
gateway_2 = ApiGateway("https://www.google.com", regions=EXTRA_REGIONS, access_key_id="ID", access_key_secret="SECRET")
ApiGateway 객체는 start 메서드를 사용하여 시작해야 합니다.
기본적으로 해당 사이트에 대해 이미 ApiGateway가 존재하면 새로 생성하지 않고 기존 엔드포인트를 사용합니다.
매개변수는 필요하지 않지만 다음을 허용합니다:
# 사이트에 대한 새 ApiGateway 인스턴스 시작, 또는 기존 엔드포인트가 있으면 찾아서 사용
gateway_1.start()
# 기존 엔드포인트가 있더라도 새 ApiGateway 인스턴스 시작
gateway_2.start(force=True)
요청은 ApiGateway 객체를 requests Session 객체에 마운트하여 전송합니다.
mount에 지정된 사이트는 ApiGateway 생성자에 전달된 사이트와 일치해야 합니다.
import requests
# gateway_1에 생성된 사이트로 POST 요청 전송. 무작위 IP에서 전송됨.
session_1 = requests.Session()
session_1.mount("http://1.1.1.1:8080", gateway_1)
session_1.post("http://1.1.1.1:8080/update.php", headers={"Hello": "World"})
# 아웃바운드 요청에 X-Forwarded-For 헤더 값 127.0.0.1 전송 (지정하지 않으면 무작위화됨)
session_1.post("http://1.1.1.1:8080/update.php", headers={"X-Forwarded-For", "127.0.0.1"})
# 무작위 IP에서 Google 검색어 실행
session_2 = requests.Session()
session_2.mount("https://www.google.com", gateway_2)
session_2.get("https://www.google.com/search?q=test")
사용을 마친 후에는 ApiGateway 리소스를 종료하는 것이 중요합니다. 그렇지 않으면 공개 엔드포인트가 남아 계정에 추가 요금이 발생할 수 있습니다.
이는 ApiGateway 객체의 shutdown 메서드를 통해 수행됩니다. 생성자에 지정된 리전의 모든 리소스를 닫습니다.
# "http://1.1.1.1:8080"에 대한 "eu-west-1" 및 "eu-west-2"의 모든 게이트웨이 프록시 종료
gateway_1.shutdown()
# "https://www.google.com"에 대한 ip_rotator.EXTRA_REGIONS의 모든 게이트웨이 프록시 종료
gateway_2.shutdown()
또는 필요에 따라 특정 엔드포인트만 선택적으로 종료할 수 있습니다. 이렇게 하려면 shutdown() 메서드에 엔드포인트 배열을 전달하면 됩니다. 예:
# 새 게이트웨이를 강제 시작하고 (리전에 이미 엔드포인트가 있어도 새로 생성), 그중 처음 3개만 삭제
gateway_3 = ApiGateway("http://1.1.1.1:8082", regions=ALL_REGIONS)
endpoints = gateway_3.start(force=True)
gateway_3.shutdown(endpoints[:3])
require_manual_deletion 매개변수를 True로 설정하여 시작된 게이트웨이는 shutdown 메서드로 삭제되지 않으며, AWS CLI 또는 웹사이트를 통해 수동으로 삭제해야 합니다.
핵심 게이트웨이 생성 및 구성 코드는 RhinoSecurityLabs의 IPRotate Burp Extension에서 수정되었습니다.
X-My-X-Forwarded-For 헤더 전달 개념은 원래 ustayready가 자신의 fireprox 프록시에서 구상했습니다.
| 이름 | 설명 | 필수 여부 | 기본값 |
|---|
| site | 요청이 전송될 사이트 (경로 제외) | True | |
| regions | 게이트웨이를 설정할 AWS 리전 배열 | False | ip_rotator.DEFAULT_REGIONS |
| access_key_id | AWS 액세스 키 ID (환경 변수보다 우선) | False | 환경 변수 사용. |
| access_key_secret | AWS 액세스 키 시크릿 (환경 변수보다 우선) | False | 환경 변수 사용. |
| verbose | 상태 및 오류 메시지 포함 여부 | False | True |
| 이름 | 설명 | 필수 여부 | 기본값 |
|---|
| endpoints | 기존 엔드포인트 배열 (예: 이전 세션에서) | False | |
| force | 기존 엔드포인트가 있더라도 새 엔드포인트 세트 생성 | False | False |
| require_manual_deletion | ApiGateway가 shutdown() 호출 시에도 유지되어야 하는지 지정하는 불리언 | False | False |