mitmproxy 에서 upstream proxy 적용하기
Updated on
https://github.com/mitmproxy/mitmproxy/issues/6006#issuecomment-1482367935
일단 mitmProxy에서 동적으로 upstream Proxy 적용하기 위한 설명이다.
업스트림 프록시 모드 자체를 동적으로 처리하는데 있어서 상당히 까다로운 부분이 있었는데, 바로 proxy Auth 부분이다.
헤더 값에 Proxy-Authorization
를 넣어준다고 해도,
실제 Proxy Upstream 연결에는 Proxy-Authorization
값이 제거되서 전송이 된다.
그렇기 때문에, Auth 연결이 안되는데
이때 http_connect_upstream
를 사용하면 upstream 연결 시에 Proxy Auth를 넣을 수가 있다.
근데 가장 큰 문제가.
동적으로 사용하려면, request
에서 Proxy Address를 설정하고 http_connect_upstream
에서 Proxy Auth를 설정해야한다는건데.
이게 request
에서 동적 프록시를 선택하고나면, http_connect_upstream
에서 어떤 프록시를 사용했는지를 알 수가 없는 문제가 있다.
그래서 이 문제를 해결하기위해서 올린 github issues가 바로 이 내용이다.
from mitmproxy.net.server_spec import ServerSpec def http_connect_upstream(self, flow: http.HTTPFlow): if hasattr(flow.client_conn, "proxy_auth"): username, password = getattr(flow.client_conn, "proxy_auth") auth = f"Basic {base64.b64encode(f"{username}:{password}".encode()).decode()}" flow.request.headers["Proxy-Authorization"] = auth def request(self, flow: http.HTTPFlow): proxy_info = { 'host': 'proxyHost', 'port': 7777, 'username': 'proxyUsername', 'password': 'proxyPassword' } setattr(flow.client_conn, "proxy_auth", (proxy_info['username'], proxy_info['password'])) address = (proxy_info["host"], proxy_info["port"]) flow.server_conn.via = ServerSpec(("http", address))
이렇게 request 에서 proxy Address 를 설정하고, proxyAuth 정보를 flow.client_conn
클라이언트 접속정보에 저장한다.
그 다음에 http_connect_upstream 에서 flow.client_conn
에 저장된 접속정보를 꺼내서 인증에 사용한다.
이렇게 처리하면 mitmProxy 에서 동적 프록시를 구현할 수 있다.