프록시가 필요한 프로토콜을 지원하지 않을 때 대처 방법
프록시를 설정하고 스크립트를 실행했는데 "Protocol not supported" 또는 "Connection refused" 오류가 발생했나요? 프로토콜 비호환성 문제는 생각보다 자주 발생합니다. 왜 이런 일이 발생하는지, 그리고 프록시 제공업체를 변경하지 않고 이 문제를 어떻게 해결할 수 있는지 살펴보겠습니다.
프록시에서 사용하는 프로토콜
문제를 해결하기 전에 각 프로토콜의 차이점을 이해하는 것이 중요합니다. 각 프로토콜은 고유한 사용 영역과 제한 사항을 가지고 있습니다.
| 프로토콜 | 기본 포트 | 특징 |
|---|---|---|
| HTTP | 80, 8080, 3128 | HTTP 트래픽만 지원, 헤더 수정 가능 |
| HTTPS (CONNECT) | 443, 8443 | HTTP CONNECT를 통한 터널링, 암호화 지원 |
| SOCKS4 | 1080 | TCP 연결만 지원, 인증 없음, UDP 미지원 |
| SOCKS5 | 1080, 1081 | TCP 및 UDP 지원, 인증 지원, 프록시를 통한 DNS |
일반적인 충돌 사례:
- Selenium 및 Puppeteer는 HTTP/HTTPS를 요구하는데 SOCKS5만 있는 경우
- Telegram 봇은 SOCKS5를 통해 작동하는데 프록시가 HTTP만 지원하는 경우
- 토렌트 클라이언트는 UDP를 지원하는 SOCKS5를 요구하는데 프록시가 SOCKS4인 경우
- 게임 애플리케이션이 UDP를 요구하는데 HTTP 프록시가 이를 지원하지 않는 경우
진단: 프록시 프로토콜 확인하기
제공업체가 프로토콜을 명시하지 않았거나 확신이 서지 않는 경우, 직접 프록시를 테스트해 볼 수 있습니다.
curl을 이용한 확인
HTTP 프로토콜 테스트:
# HTTP 프록시
curl -x http://proxy_ip:port http://httpbin.org/ip
# 인증 포함 시
curl -x http://user:pass@proxy_ip:port http://httpbin.org/ip
SOCKS5 테스트:
# SOCKS5 프록시
curl -x socks5://proxy_ip:port http://httpbin.org/ip
# 프록시를 통한 DNS 사용 (socks5h)
curl -x socks5h://proxy_ip:port http://httpbin.org/ip
명령이 프록시의 IP 주소를 반환하면 프로토콜이 올바르게 식별된 것입니다. Connection refused 또는 Unsupported proxy 오류가 발생하면 프로토콜이 일치하지 않는 것입니다.
Python을 이용한 확인
import requests
proxy_ip = "proxy_ip:port"
# HTTP 테스트
try:
r = requests.get("http://httpbin.org/ip",
proxies={"http": f"http://{proxy_ip}"},
timeout=10)
print(f"HTTP 작동: {r.json()}")
except Exception as e:
print(f"HTTP 작동 안 함: {e}")
# SOCKS5 테스트 (pip install requests[socks] 필요)
try:
r = requests.get("http://httpbin.org/ip",
proxies={"http": f"socks5://{proxy_ip}"},
timeout=10)
print(f"SOCKS5 작동: {r.json()}")
except Exception as e:
print(f"SOCKS5 작동 안 함: {e}")
자동 감지
프로토콜을 반복하며 테스트하는 스크립트:
import requests
def detect_protocol(proxy_address):
protocols = ["http", "https", "socks4", "socks5", "socks5h"]
for proto in protocols:
try:
proxies = {
"http": f"{proto}://{proxy_address}",
"https": f"{proto}://{proxy_address}"
}
r = requests.get("http://httpbin.org/ip",
proxies=proxies, timeout=5)
if r.status_code == 200:
return proto
except:
continue
return None
result = detect_protocol("proxy_ip:port")
print(f"감지된 프로토콜: {result}")
HTTP를 SOCKS로, 그 반대로 변환하기
프록시가 필요한 프로토콜을 지원하지 않는 경우, 로컬 변환기를 사용하여 프로토콜을 변환할 수 있습니다.
Privoxy: HTTP → SOCKS
Privoxy는 HTTP 요청을 받아 SOCKS 프록시를 통해 전달합니다.
설치:
# Ubuntu/Debian
sudo apt install privoxy
# macOS
brew install privoxy
# Windows — 공식 웹사이트에서 다운로드
설정 (파일 /etc/privoxy/config):
# 로컬 포트 8118에서 수신 (HTTP)
listen-address 127.0.0.1:8118
# 외부 SOCKS5를 통해 전달
forward-socks5 / socks_proxy_ip:1080 .
# 인증 포함 시
forward-socks5 / user:pass@socks_proxy_ip:1080 .
이제 소프트웨어는 127.0.0.1:8118로 HTTP 연결하고, 트래픽은 SOCKS5를 통해 외부로 나갑니다.
Gost: 범용 변환기
Gost는 모든 프로토콜 변환을 위한 강력한 도구입니다.
# 입력: HTTP 프록시 → 출력: SOCKS5
gost -L http://:8080 -F socks5://socks_proxy_ip:1080
# 입력: SOCKS5 → 출력: HTTP
gost -L socks5://:1080 -F http://http_proxy_ip:8080
# 양쪽에 인증 포함 시
gost -L http://local_user:local_pass@:8080 \
-F socks5://remote_user:remote_pass@proxy_ip:1080
Python 변환기
간단한 작업을 위한 최소한의 Python 변환기:
# pip install pproxy
# 입력: HTTP, 출력: SOCKS5
pproxy -l http://:8080 -r socks5://proxy_ip:1080
# 입력: SOCKS5, 출력: HTTP
pproxy -l socks5://:1080 -r http://proxy_ip:8080
로컬 터널 설정
때로는 변환만으로는 부족하며 완전한 터널링이 필요할 수 있습니다.
HTTP 프록시를 통한 SSH 터널
SSH 서버와 HTTP 프록시가 있는 경우 SOCKS5를 생성할 수 있습니다.
# HTTP 프록시를 통해 localhost:1080에 SOCKS5 생성
ssh -D 1080 -o ProxyCommand="nc -X connect -x http_proxy:8080 %h %p" user@ssh_server
HTTPS를 위한 Stunnel
HTTPS 프록시가 필요한데 HTTP만 있는 경우:
# stunnel.conf
[https-proxy]
client = yes
accept = 127.0.0.1:8443
connect = http_proxy_ip:8080
protocol = connect
protocolHost = target_host:443
사용 가능한 프로토콜에 맞게 소프트웨어 설정하기
변환하는 것보다 사용 중인 소프트웨어를 사용 가능한 프로토콜에 맞게 설정하는 것이 더 쉬울 때도 있습니다.
다양한 프로토콜을 사용하는 Selenium
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# HTTP 프록시 (표준 방식)
options = Options()
options.add_argument('--proxy-server=http://proxy_ip:8080')
# SOCKS5 프록시
options.add_argument('--proxy-server=socks5://proxy_ip:1080')
# Firefox를 SOCKS5와 함께 사용
from selenium.webdriver.firefox.options import Options as FirefoxOptions
profile = webdriver.FirefoxProfile()
profile.set_preference("network.proxy.type", 1)
profile.set_preference("network.proxy.socks", "proxy_ip")
profile.set_preference("network.proxy.socks_port", 1080)
profile.set_preference("network.proxy.socks_version", 5)
aiohttp와 SOCKS
# pip install aiohttp-socks
import aiohttp
from aiohttp_socks import ProxyConnector
async def fetch_with_socks():
connector = ProxyConnector.from_url('socks5://proxy_ip:1080')
async with aiohttp.ClientSession(connector=connector) as session:
async with session.get('http://httpbin.org/ip') as response:
return await response.json()
HTTP를 사용하는 Telegram 봇
Telegram 라이브러리가 SOCKS5를 요구하는데 HTTP만 있는 경우:
# python-telegram-bot에서 HTTP 프록시 사용
from telegram.ext import ApplicationBuilder
application = (
ApplicationBuilder()
.token("YOUR_TOKEN")
.proxy_url("http://proxy_ip:8080") # HTTP에서 작동
.build()
)
팁: 많은 최신 라이브러리가 두 프로토콜을 모두 지원합니다.
socks5://를http://로 변경하는 것만으로 충분할 수 있으니 문서를 확인해 보세요.
필요한 프로토콜을 가진 프록시 선택 방법
프로토콜 문제로 인한 혼란을 피하려면 요구 사항을 미리 파악하는 것이 중요합니다.
호환성 매트릭스
| 작업 | 권장 프로토콜 | 이유 |
|---|---|---|
| 웹 스크래핑 | HTTP/HTTPS | 광범위한 지원, 간단한 설정 |
| 브라우저 자동화 | HTTP 또는 SOCKS5 | 브라우저 및 프레임워크에 따라 다름 |
| Telegram, Discord 봇 | SOCKS5 | 라이브러리 요구 사항 |
| 토렌트 | UDP 지원 SOCKS5 | DHT 및 P2P 통신에 UDP 필요 |
| 게임, VoIP | UDP 지원 SOCKS5 | 낮은 지연 시간, UDP 트래픽 |
| API 요청 | HTTP/HTTPS | REST API는 HTTP를 통해 작동 |
프록시 제공업체 선택 시 고려 사항
- 지원되는 프로토콜 목록 — 명시되어 있어야 함
- 전환 가능성 — 일부 제공업체는 동일 IP에 대해 다른 포트/프로토콜 액세스를 제공함
- SOCKS5의 UDP 지원 여부 — 모든 SOCKS5 프록시가 UDP를 지원하는 것은 아님
- 설정 문서 — 다양한 언어 및 도구에 대한 예시 제공 여부
레지덴셜 프록시는 일반적으로 HTTP/HTTPS와 SOCKS5를 동시에 지원하여 대부분의 프로토콜 문제를 해결해 줍니다. 데이터센터 프록시는 HTTP/HTTPS로 제한되는 경우가 많습니다.
구매 전 체크리스트
- 사용할 소프트웨어가 요구하는 프로토콜을 확인합니다.
- UDP 지원이 필요한지 (게임, 토렌트, VoIP) 확인합니다.
- 제공업체에 필요한 프로토콜 지원 여부를 문의합니다.
- 호환성 테스트를 위해 테스트 액세스를 요청합니다.
- 대안으로 로컬 변환기 계획을 준비합니다.
결론
프로토콜 비호환성은 해결 가능한 문제입니다. 대부분의 경우 Privoxy나 Gost와 같은 로컬 변환기만으로 충분합니다. 장기적인 프로젝트의 경우 필요한 프로토콜을 지원하는 프록시를 처음부터 선택하는 것이 더 효율적입니다.
프로토콜 선택의 유연성이 필요한 작업에는 멀티 프로토콜 액세스를 지원하는 레지덴셜 프록시가 적합합니다. 자세한 내용은 proxycove.com에서 확인하세요.