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 에서 동적 프록시를 구현할 수 있다.