2017-11-09 4 views
1

방화벽에서 들어오는 트래픽에 대해 허용 목록 패킷 필터를 할당하려는 프로젝트에서 작업 중이며 요청 라이브러리가있는 python 스크립트를 사용하여 해당 네트워크 외부의 일부 서버에 https 요청을 보내고 있습니다. 지금 스크립트는 임시 포트를 사용하여 서버에 연결하고 있지만 특정 포트를 통해 이러한 https 요청을하고 싶습니다. 이렇게하면이 포트에 대해 엄격한 허용 목록을 작성할 수 있습니다.Python Requests, 나가는 트래픽에 대해 포트를 지정하는 방법은 무엇입니까?

요청을 보내야하는 요청 라이브러리에 포트를 어떻게 지정할 수 있습니까? 스크립트는 현재 다음과 같은 유형의 코드를 사용하여 필요한 요청을 보냅니다.

response = requests.post(data[0], data=query, headers=headers, timeout=10) 

이 작동하지만 지금은 HTTP POST 요청이 네트워크에 대한 엄격한 패킷 필터링 수 있도록 전송해야되는 포트를 지정해야합니다. 이 항구 신고는 어떻게 성취 될 수 있습니까? 나는 이미 여러 가지 출처에서 이것에 대한 해결책을 찾았으며 절대적으로 아무것도 내놓지 않았다.

+0

. 포트는 OS에 의해 선택됩니다. –

+0

@KlausD .: 예. 표준 소켓에서 그렇게 할 수 있습니다. * default *는 OS에 그대로 두는 것입니다. –

+0

@KlausD : 트릭은 기본값 대신 특정 포트를 사용하도록 요청하는 방법에만 있습니다. –

답변

3

requestsurllib3에 있으며 연결에 대한 원본 주소를 설정할 수 있습니다. 원본 주소를 ('', port_number)으로 설정하면 기본 호스트 이름을 사용하지만 특정 포트를 선택하도록 지정합니다.

당신은 pool manager에서 이러한 옵션을 설정할 수 있습니다, 그리고 당신은 transport adapter 새로운 생성하여 다른 풀 관리자를 사용 requests 알려주기 : 어댑터, 세션 객체에

from requests.adapters import HTTPAdapter 
from requests.packages.urllib3.poolmanager import PoolManager 


class SourcePortAdapter(HTTPAdapter): 
    """"Transport adapter" that allows us to set the source port.""" 
    def __init__(self, port, *args, **kwargs): 
     self._source_port = port 
     super(SourcePortAdapter, self).__init__(*args, **kwargs) 

    def init_poolmanager(self, connections, maxsize, block=False): 
     self.poolmanager = PoolManager(
      num_pools=connections, maxsize=maxsize, 
      block=block, source_address=('', self._source_port)) 

사용에게 다음과 같은 마운트를이 어댑터를 소스 포트로 54321를 사용 모든 HTTP 및 HTTPS 연결 :

s = requests.Session() 
s.mount('http://', SourcePortAdapter(54321)) 
s.mount('https://', SourcePortAdapter(54321)) 

당신은 단지 하나 개의 소스 포트를 설정할 수 있습니다 한 번에 하나의 활성 연결로 제한됩니다. 포트간에 순환해야하는 경우 URL마다 하나씩 여러 어댑터를 등록하거나 매번 catch-all 마운트를 다시 등록하십시오.

source_address 옵션에 대한 자세한 내용은 create_connection() utility function documentation를 참조하십시오 : 당신은 표준 소켓에 할 수 없어

If source_address is set it must be a tuple of (host, port) for the socket to bind as a source address before making the connection. An host of '' or port 0 tells the OS to use the default.

+0

수정 해 주셔서 감사하지만 지금은 또 다른 문제가 발생했습니다. 's.post (data [0], data = query, headers = headers, timeout = 10)'을 실행할 때마다'socket.gaierror : [Errno -3] 이름 해석의 일시적인 실패' 이걸 일으킬 수있는 아이디어? 또한 세션 객체를 다음과 같이 초기화하고 있습니다 :'s = requests.Session() \t \t \t s.mount ('https : //', SourcePortAdapter (52001))' –

+0

신경 쓰지 마라. 구현이 작동을 멈췄습니다. 어떻게 든 요청 패킷을 잘못 구성 했어야합니다. 나는 시스템의 옛날 작업 버전으로 돌아가 python 2.7 –

+0

@Theamateurprogrammer로 시도해 보겠다 : 그것은 DNS 이름 조회 실패이다. –

관련 문제