일반 Python 소켓은 http_proxy 가 있어도 프록시와 협상하지 않습니다. 자체 TCP 프로토콜을 사용하는 애플리케이션이라면 프록시 끝점의 서비스를 이해하는 커넥터를 사용하세요.

PySocks가 이미 있다면 연결을 명시적으로 만드세요:

import socks

with socks.socksocket() as connection:
    connection.set_proxy(socks.SOCKS5, '203.0.113.10', 1080)
    connection.settimeout(10)
    connection.connect(('example.com', 12345))
    # Exchange the destination protocol here.

문서용 주소와 대상 포트를 바꾸세요. 허용된 공용 대상의 경우 애플리케이션의 대상 포트를 허용하는지 확인한 뒤에만 SOCKS5 프록시 목록에서 후보를 고르세요. 설치된 패키지, 지원되는 메서드, 끝점 요구 사항을 PySocks 인터페이스와 대조하세요.

애플리케이션의 나머지 부분은 이렇게 설정된 연결 위에서 자체 프로토콜을 주고받습니다. 그 프로토콜이 TLS를 사용한다면 프록시 협상 후에 시작하고 실제 대상 호스트 이름을 검증하세요. 프록시 인증은 경로를 설정할 뿐 대상 로그인이나 암호화를 제공하지 않습니다.

SOCKS 리스너에는 SOCKS 협상이 필요합니다. HTTP 서비스에는 임의 TCP 대상에 대한 CONNECT 지원 커넥터가 필요하며 해당 포트를 거부할 수 있습니다. 잘못된 핸드셰이크를 둔 채 주소만 바꾸지 말고 실제로 제공되는 서비스에 맞는 커넥터를 고르세요.

교체를 국소적으로 유지하세요. socket.socket 에 클래스를 할당하면 관련 없는 임포트와 라이브러리에 영향을 줄 수 있습니다. 다른 라이브러리가 소켓 생성을 소유한다면 문서화된 연결 팩토리나 프록시 옵션을 사용하세요. 읽지 않는 사전은 그 연결을 바꿀 수 없습니다.

관련 글