问题
我需要检查来自URL的域是否在请求之前指向私有IP,还需要返回用于HTTP连接的IP。在
这是我的测试脚本:import ipaddress
import requests
import socket
import sys
from urllib.parse import urlparse
def get_ip(url):
hostname = socket.gethostbyname(urlparse(url).hostname)
print('IP: {}'.format(hostname))
if hostname:
return ipaddress.IPv4Address(hostname).is_private
def get_req(url):
private_ip = get_ip(url)
if not private_ip:
try:
with requests.Session() as s:
s.max_redirects = 5
r = s.get(url, timeout=5, stream=True)
return {'url': url, 'staus_code': r.status_code}
except requests.exceptions.RequestException:
return 'ERROR'
return 'Private IP'
if __name__ == '__main__':
print(get_req(sys.argv[1]))
如果域正在解析为多个IP,则这将不起作用,例如,如果网站位于CloudFlare之后:
^{pr2}$
tcpdump中的片段:22:21:51.833221 IP 1.2.3.4.54786 > 104.31.64.106.80: Flags [S], seq 902413592, win 29200, options [mss 1460,sackOK,TS val 252001723 ecr 0,nop,wscale 7], length 0
22:21:51.835313 IP 104.31.64.106.80 > 1.2.3.4.54786: Flags [S.], seq 2314392251, ack 902413593, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 10], length 0
22:21:51.835373 IP 1.2.3.4.54786 > 104.31.64.106.80: Flags [.], ack 1, win 229, length 0
脚本在104.31.65.106上测试了它,但是HTTP连接是在104.31.64.106上建立的
我看到了this线程,但我不会使用响应体,所以the connection won't be released而且实际上我的请求模块版本没有这些属性。在
有没有办法用requests模块来实现这一点,还是必须使用另一个库,如urllib或{}?在
澄清一下:我只需要在尝试连接到专用网络地址时阻止请求。如果有多个选项,并且选择了一个公共地址,就可以了。在