Requests: Vinculando um determinado IP

Criado em 27 jan. 2012  ·  15Comentários  ·  Fonte: psf/requests

Seria ótimo poder vincular um determinado IP como o endereço de origem (para hosts com vários endereços IP).

Comentários muito úteis

import socket
import urllib2
true_socket = socket.socket

def make_bound_socket(source_ip):
    def bound_socket(*a, **k):
        sock = true_socket(*a, **k)
        sock.bind((source_ip, 0))
        return sock
    return bound_socket

socket.socket = make_bound_socket('<some source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

socket.socket = make_bound_socket('<some other source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

Se o tráfego que sai dos dois números de IP de origem passa por dois números de IP públicos diferentes, deve-se ver esses números públicos diferentes no campo de origem da resposta.

Todos 15 comentários

Interessante. Como você avalia o uso?

^ shazow / urllib3 # 9

O objetivo é escrever um rastreador usando um IP associado a um determinado país. Mas não sei como seria usado em nível de API.

Você não poderia simplesmente enviar uma solicitação a um IP com um cabeçalho Host ?

Não, porque é para ter o IP específico no log do servidor web (para ser revertido para um determinado país usando ferramentas como GeoIP).

Eu não sigo.

>>> requests.get('http://184.106.67.239', headers={'host': 'ci.kennethreitz.com'})
<Response [200]>
import socket
import urllib2
true_socket = socket.socket

def make_bound_socket(source_ip):
    def bound_socket(*a, **k):
        sock = true_socket(*a, **k)
        sock.bind((source_ip, 0))
        return sock
    return bound_socket

socket.socket = make_bound_socket('<some source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

socket.socket = make_bound_socket('<some other source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

Se o tráfego que sai dos dois números de IP de origem passa por dois números de IP públicos diferentes, deve-se ver esses números públicos diferentes no campo de origem da resposta.

Acho que isso está fora do escopo.

Para as pessoas interessadas neste ainda, você pode querer dar uma olhada no HttpConnectionPool do urlib3, em particular onde as novas httpConnections http.client / http.client são giradas para que você possa passar source_address. Se você fizer isso, poderá continuar expondo isso no modelo de solicitação da solicitação e usá-lo como desejar.

Para aqueles que chegam aqui do google, você vai querer seguir isto: https://github.com/shazow/urllib3/issues/9#issuecomment -15871420

Isso deve ser reaberto - não está fora do escopo e é bastante necessário ao trabalhar com hosts dentro de uma VPN.

Dependendo das especificações dos espaços de endereço da rede atual e remota, muitas vezes é necessário enviar solicitações do IP vinculado à interface configurada pela VPN. Ou faça alterações na tabela de roteamento. Isso se aplica pelo menos ao uso do NetExtender em um Mac.

Muitos programas de rede, como ssh e curl, oferecem suporte à configuração da interface para usar / vincular ao IP de uma interface.

@petri Sua afirmação de que não está fora do escopo está incorreta, visto que o escopo do projeto Requests é definido inteiramente por Kenneth. =)

Especificamente, nós o vemos como estando fora do escopo do projeto de solicitações principais. No entanto, você ainda pode fazer isso, e nem é muito difícil. Esta discussão cobre como fazer isso.

Legal - eu não conhecia esse tipo de mecanismo nas solicitações. Obrigado!

import socket
import urllib2
true_socket = socket.socket

def make_bound_socket(source_ip):
    def bound_socket(*a, **k):
        sock = true_socket(*a, **k)
        sock.bind((source_ip, 0))
        return sock
    return bound_socket

socket.socket = make_bound_socket('<some source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

socket.socket = make_bound_socket('<some other source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

Se o tráfego que sai dos dois números de IP de origem passa por dois números de IP públicos diferentes, deve-se ver esses números públicos diferentes no campo de origem da resposta.

Só queria que você soubesse que estou vasculhando a internet há muito tempo e essa foi a única solução que funcionou para mim.

Esta página foi útil?
0 / 5 - 0 avaliações