使用urllib2、socks5 proxy和sockspy超时不起作用

2024-09-24 06:22:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python2.6中使用的是带有urllib2的sockspy。一切都很好,除了当我点击一个挂起的网址超时。urllib2函数超时参数或全局套接字默认超时都不起作用。我甚至尝试过在下面的子cassed处理程序中以多种不同的方式设置超时,但都没有成功。有什么想法吗?在

下面是一个测试脚本(假设您安装了sockspy项目并将其添加到系统路径中):

import os, sys
import httplib
sys.path.append( "/parent/path/to/socksipy/project" )
import socks # import socksipy
import socket
socket.setdefaulttimeout(30.0)
import urllib2

class SocksiPyConnection(httplib.HTTPConnection):
    def __init__(self, proxytype, proxyaddr, proxyport = None, rdns = False, username = None, password = None, *args, **kwargs):
        self.proxyargs = (proxytype, proxyaddr, proxyport, rdns, username, password)
        httplib.HTTPConnection.__init__(self, *args, **kwargs)

    def connect(self):
        self.sock = socks.socksocket()
        self.sock.setproxy(*self.proxyargs) 
        if isinstance(self.timeout, float):
            self.sock.settimeout(self.timeout)
        self.sock.connect((self.host, self.port))

class SocksiPyHandler(urllib2.HTTPHandler):
    def __init__(self, *args, **kwargs):
        self.args = args
        self.kw = kwargs
        urllib2.HTTPHandler.__init__(self)

    def http_open(self, req):
        def build(host, port=None, strict=None, timeout=0):
            conn = SocksiPyConnection(*self.args, host=host, port=port, strict=strict, timeout=timeout, **self.kw)
            return conn
        return self.do_open(build, req)

if __name__ == '__main__':

    #
    # this one works for non-hanging URL
    #
    proxyhost = "responder.w2"
    proxyport = 1050
    socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, proxyhost, int(proxyport))
    socket.socket = socks.socksocket
    resp = urllib2.urlopen("http://www.google.com", timeout=30.0)
    # hang here
    print "returned 1"


    #
    # one way to go about it for a hanging URL
    #
    proxyhost = "responder.w2"
    proxyport = 1050
    socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, proxyhost, int(proxyport))
    socket.socket = socks.socksocket
    resp = urllib2.urlopen("http://erma.orr.noaa.gov/cgi-bin/mapserver/charts?version=1.1.1&service=wms&request=GetCapabilities", timeout=30.0)
    # it hangs here
    print "returned 2"


    #  
    # another way to go about it for hanging URL
    #
    proxyhost = "responder.w2"
    proxyport = 1050
    opener = urllib2.build_opener(SocksiPyHandler(socks.PROXY_TYPE_SOCKS5, proxyhost, int(proxyport)) )
    resp = opener.open("http://erma.orr.noaa.gov/cgi-bin/mapserver/charts?version=1.1.1&service=wms&request=GetCapabilities", timeout=30.0)
    # it hangs here
    print "returned 3"

Tags: importselfnonehostinitdeftimeoutargs
1条回答
网友
1楼 · 发布于 2024-09-24 06:22:24

首先,让我从解释上面的Builder配置开始

builder.setSession("MyVPNService") // This one is optional. 

.addAddress("192.168.56.0", 32) // This is used to assign interface address. First param is IP address, and second in prefix length. "Prefix" length is also commonly known as subnet mask.

.addDnsServer("8.8.8.4") // This configures the DNS network for VPN network. For ex - All DNS resolutions would go to 8.8.8.4:53. Note that the DNS request packets gets routed through the tun interface.

.addRoute("0.0.0.0", 1); // This controls the IP addresses which gets routed through tun interface.

注意-tun接口可以支持多个地址系列(IPv4/IPv6)。例如,您可以分配多个接口地址(例如一个v4、一个v6或两个v6地址,或任何组合)

类似地,您可以添加希望VPN处理的路由。现在,主要的问题是如何决定我的VPN应该处理哪些路由

嗯,有很多选择

  1. 路由所有内容-添加0.0.0.0/0(对于IPv4)和::/0(对于IPv6)将通过VPN路由所有目的地的流量(注意:0.0.0.0/0表示整个IPv4范围,即0.0.0.0到255.255.255.255)
  2. 特定于路由的路由-您通常会注意到,当VPN运行时,与物联网设备通话不起作用。这通常是由于“路由所有内容”配置设置中断了本地网络(例如chromecast)。因此,排除链路本地流量需要进行一些数学计算,包括从上述子网中减去链路本地子网(0.0.0.0/0,::/0(对于v6本地子网))。涉及的数学不是很简单,这使得这个选项更加复杂。至于什么构成链接本地子网,这里是来自wikipedia和来自IETF的IPv4IPv6特殊地址的列表

也就是说,以下是对您的问题的一些回答

I need ALL packets outbound from the Android phone to be routed to the tun device

请参阅上面的“路由所有内容”

Isn't a tun device supposed to have ONE IP?

linux上的接口可以从不同的地址族中分配多个接口地址

Then what is "192.168.56.0", 32".

如上所述,第一部分是IP地址,第二部分定义子网掩码。另见CIDR notation

Also when I try to add a route "0.0.0.0", 0 the whole android phone hangs and restarts.

0.0.0.0/0意味着整个IPv4地址空间将通过VPN路由。通常,VPN无法处理我上面提到的链路本地流量。因此,您必须排除某些本地子网(请参见上面的链接)。至于电话挂起和重启,我不确定这是否和VPN有关,除非VPN不能正确处理流量(这会导致网络相关应用程序崩溃)

相关问题 更多 >