νΉμ IPλ₯Ό μμ€ μ£Όμλ‘ λ°μΈλ©ν μ μλ€λ©΄ μ’μ κ²μ λλ€(μ¬λ¬ IP μ£Όμλ₯Ό κ°μ§ νΈμ€νΈμ κ²½μ°).
ν₯λ―Έλ‘μ΄. μ¬μ©λ²μ μ΄λ»κ² ꡬμν©λκΉ?
^ shazow/urllib3#9
λͺ©νλ νΉμ κ΅κ°μ κ΄λ ¨λ IPλ₯Ό μ¬μ©νμ¬ ν¬λ‘€λ¬λ₯Ό μμ±νλ κ²μ λλ€. κ·Έλ¬λ API μμ€μμ μ΄λ»κ² μ¬μ©λλμ§ λͺ¨λ₯΄κ² μ΅λλ€.
νΉμ Host
ν€λκ° μλ IPλ‘ μμ²μ λ³΄λΌ μ μμ΅λκΉ?
μλμ, μΉ μλ² λ‘κ·Έμ νΉμ IPκ° μμ΄μΌ νκΈ° λλ¬Έμ λλ€(GeoIPμ κ°μ λꡬλ₯Ό μ¬μ©νμ¬ νΉμ κ΅κ°λ‘ λλ리기 μν΄).
λλ λ°λ₯΄μ§ μλλ€.
>>> 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()
λ κ°μ μμ€ IP λ²νΈμμ λκ°λ νΈλν½μ΄ λ κ°μ λ€λ₯Έ κ³΅κ° IP λ²νΈλ₯Ό ν΅ν΄ λκ°λ κ²½μ° μλ΅μ μλ³Έ νλμ μ΄λ¬ν λ€λ₯Έ κ³΅κ° λ²νΈκ° νμλμ΄μΌ ν©λλ€.
μ΄κ²μ λ²μ λ°μ΄λΌκ³ μκ°ν©λλ€.
μ¬μ ν μ΄κ²μ κ΄μ¬μ΄ μλ μ¬λλ€μ μν΄ urlib3μ HttpConnectionPool, νΉν μλ‘μ΄ httplib/http.client HttpConnectionsκ° μ€νμ λμ΄ source_addressλ₯Ό μ λ¬ν μ μλ κ³³μ μ΄ν΄λ³΄κ³ μΆμ μ μμ΅λλ€. κ·Έλ κ² νλ©΄ μμ²μ μμ² λͺ¨λΈμμ μ΄κ²μ κ³μ λ ΈμΆνκ³ μνλ λλ‘ μ¬μ©ν μ μμ΅λλ€.
Googleμμ μ¬κΈ°μ λμ°©νλ κ²½μ° λ€μμ λ°λ₯΄μμμ€. https://github.com/shazow/urllib3/issues/9#issuecomment -15871420
μ΄κ²μ λ€μ μ΄μ΄μΌ ν©λλ€. λ²μ λ°μ΄ μλλ©° VPN λ΄λΆμ νΈμ€νΈμ μμ ν λ λ§€μ° νμν©λλ€.
νμ¬ λ° μ격 λ€νΈμν¬μ μ£Όμ 곡κ°μ νΉμ±μ λ°λΌ VPNμ΄ μ€μ ν μΈν°νμ΄μ€μ λ°μΈλ©λ IPμμ μμ²μ 보λ΄μΌ νλ κ²½μ°κ° λ§μ΅λλ€. λλ λΌμ°ν ν μ΄λΈμ λ³κ²½νμμμ€. μ΄κ²μ μ μ΄λ Macμμ NetExtenderλ₯Ό μ¬μ©νλ κ²½μ°μ μ μ©λ©λλ€.
ssh λ° curlκ³Ό κ°μ λ§μ λ€νΈμνΉ νλ‘κ·Έλ¨μ μΈν°νμ΄μ€μ IPμ λ°μΈλ©/μ¬μ©νλλ‘ μΈν°νμ΄μ€ μ€μ μ μ§μν©λλ€.
@petri μμ² νλ‘μ νΈμ λ²μκ° μ μ μΌλ‘ Kennethμ μν΄ μ μλλ€λ μ μ κ°μν λ μ΄κ²μ΄ λ²μ λ°μ΄
νΉν ν΅μ¬ μμ² νλ‘μ νΈμ λ²μλ₯Ό λ²μ΄λ κ²μΌλ‘ κ°μ£Όν©λλ€. κ·Έλ¬λ μ¬μ ν ν μ μμΌλ©° 그리 μ΄λ ΅μ§λ μμ΅λλ€. μ΄ ν λ‘ μμλ μ΄λ₯Ό μννλ λ°©λ²μ λ€λ£Ήλλ€.
λμ€ - μμ²μμ κ·Έλ° μ’ λ₯μ λ©μ»€λμ¦μ μμ§ λͺ»νμ΅λλ€. κ°μ¬ ν΄μ!
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()
λ κ°μ μμ€ IP λ²νΈμμ λκ°λ νΈλν½μ΄ λ κ°μ λ€λ₯Έ κ³΅κ° IP λ²νΈλ₯Ό ν΅ν΄ λκ°λ κ²½μ° μλ΅μ μλ³Έ νλμ μ΄λ¬ν λ€λ₯Έ κ³΅κ° λ²νΈκ° νμλμ΄μΌ ν©λλ€.
λ΄κ° μμν μΈν°λ·μ λ€μ§κ³ μμκ³ μ΄κ²μ΄ λλ₯Ό μν΄ μΌν μ μΌν ν΄κ²°μ± μ΄λΌλ κ²μ λΉμ μ΄ μκΈ°λ₯Ό μνμ΅λλ€.
https://toolbelt.readthedocs.io/en/latest/adapters.html#sourceaddressadapter κ° μ‘΄μ¬νλ©° ν΄νΉμ΄ ν¨μ¬ μ μ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
λ κ°μ μμ€ IP λ²νΈμμ λκ°λ νΈλν½μ΄ λ κ°μ λ€λ₯Έ κ³΅κ° IP λ²νΈλ₯Ό ν΅ν΄ λκ°λ κ²½μ° μλ΅μ μλ³Έ νλμ μ΄λ¬ν λ€λ₯Έ κ³΅κ° λ²νΈκ° νμλμ΄μΌ ν©λλ€.