python抓包动态网页(使用虚拟专用网络的Python)(1)

爬虫程序在使用IPV4地址在网络中爬取数据时经常受到速度限制。使用IPv6地址有助于缓解这一问题,但并非所有网站都支持IPv6。使用多个IPv4地址分散连接有助于降低任何一个地址受到速率限制的风险。

除此之外,云主机的IPv4地址很容被识别,而且通常会被判定为机房IP,相比之下,住宅IPv4地址面临的审查较少。

使用vpn和/或其他隧道技术,可以在很大程度上保证爬虫不被侦测,并尽可能有效地收集数据。它们在云或者住宅环境中都可以部署。

在这篇文章中,我将探讨两种解决方案,第一种使用WireGuard,第二种使用OpenSSH SOCKS5代理。

WireGuard:一种现代VPN

WireGuard是一个由Jason a.Donenfeld在过去五年中构建的现代VPN解决方案。它突破了传统的基于素数的椭圆曲线加密机制。在过去的几十年里,素数方案一直受到边信道、填充、重放和伪造攻击以及由于实现错误在某些情况下导致内容未加密的困扰。2017年,研究人员开发了一种名为ROBOT的攻击,允许他们使用Facebook和PayPal的私钥签署消息。

WireGuard使用Daniel J.Bernstein在2005年开发的Curve25519。此曲线的加密版本称为X25519,数字签名版本称为Ed25519。Curve25519比以前的基于素数的方案需要的计算量更少。除此之外,Curve25519是不属于任何专利的最快的曲线,而且它的实现是在公共领域。

客户端工具可能并不会注意到计算需求的大幅度减少,但是受益于效率提高,处理大量加密请求的服务器将能够处理更大的工作负载。低功耗的树莓派可以轻松的在隧道WireGuard流量时支持20 Mbps,我亲眼见证了WireGuard的安卓VPN客户端耗电量与Spotify和WhatApp相当。

Ed25519公钥很短,因为它们只需要68个字符的base64编码。这与4096位RSA公钥所需的717个字符形成对比。

Curve25519是许多椭圆曲线实现中的一种。其中一些被怀疑最多只能用于侦错,缺乏刚性并且存在可能的潜在后门。丹尼尔·J·伯恩斯坦和坦尼娅·兰格(Tanja Lange)费尽苦心地编制了一个包含11个刚性数学特征的数据库,并根据这些标准评判了各种各样的曲线。这个试验的目的是证明它们底层的离散对数问题足够复杂,或者在它不够复杂时标记它。满足所有标准的曲线,如曲线25519,被认为是“安全曲线”。

WireGuard还支持对等端预先共享256位对称加密密钥,这增加了一个额外的保护层,可抵御未来基于量子计算的攻击。

RSA的基于素数的方案诞生于20世纪70年代,并将椭圆曲线的成熟期提前了大约20年。到2005年,美国国家安全局(NSA)颁布了一套包含椭圆曲线的密码算法。这给了他们公信力,事实也证明了这些方案可以用来保护敏感信息。2017年,美国国家标准与技术研究院(NIST)批准曲线25519供美国联邦政府使用。

截至本文撰写之时,WireGuard由5478行C语言代码和头文件组成,是迄今为止最简单的VPN解决方案之一。相比之下,当使用OpenSSL编译OpenVPN时,OpenSSL又使用MIT Kerberos编译,它包含了超过一百万行的C代码和头文件。这甚至不包括压缩库依赖项(如LZO)。

WireGuard将嵌入到Linux内核的5.6版本中。这将消除在内核和用户空间之间进行上下文切换的开销,同时拥有非常广泛的安装基础。WireGuard也作为一个独立的包提供给任何使用旧版本内核的人。

实现Curve25519的其他流行应用包括Facebook Messenger、OpenSSH、Signal、Tor、Viber和WhatsApp。

OpenSSH:无处不在的加密隧道

本文中关注的OpenSSH主要特性是支持SOCKS5代理。它允许用户设置本地端口,以便通过远程OpenSSH服务器对TCP流量进行隧道传输。

安全Shell协议(SSH)是由Tatu Ylónen于1995年在芬兰发明的。尽管他制作了一个开源的实现,但它受到了各种限制,后来成为了专有软件。1999年,Damien Miller和Darren Tucker创建了SSH代码库并创建了OpenSSH,这是一套工具,旨在为各种以web为中心的通信协议提供压缩和加密隧道。他们使用BSD许可证发布了他们的作品。

使用OpenSSH的工具远比它本身更有名。这些工具包括SSH、telnet、SFTP、FTP、SCP、RCP和SSHD,OpenSSH被用作上述工具的服务器守护进程。这些工具几乎无处不在地安装在每个面向internet的UNIX系统上。

Damien和Darren后来被谷歌聘用,在过去20年的大部分时间里,他们分别担任信息安全工程师和网站可靠性工程师。达米恩•米勒(Damien Miller)在LinkedIn上将他的角色描述为“帮助防止谷歌遭到黑客攻击”。

OpenSSH支持多种基于质数的加密方案,并在2013年增加了对Curve25519的支持。要查看客户端和任何给定SSH服务器都支持哪些数字签名、加密和压缩方案,可以使用目标服务器执行以下内容(将hostname改为你的服务器)。

python抓包动态网页(使用虚拟专用网络的Python)(2)

然后你可以看到你的客户端支持的算法

python抓包动态网页(使用虚拟专用网络的Python)(3)

这是你的服务器支持的算法

python抓包动态网页(使用虚拟专用网络的Python)(4)

这是你的客户端和服务器约定正在使用的算法

python抓包动态网页(使用虚拟专用网络的Python)(5)

创建WireGuard服务器

在本例中,我将在AWS EC2上创建一个WireGuard VPN服务器。如果你想在一个树莓派上运行以下命令,并在一个家庭互联网中运行树莓派,步骤将大同小异。我将在eu-west-1中启动一个运行Ubuntu 16的t3.micro实例。它将花费8.32美元/月(含增值税),并有1 GB的内存,2 个vCPU和高达5 Gbps的网络连接。我将使用8gb的EBS存储器,这将产生额外的成本。

我将创建一个名为vpn farm的新安全组。我将打开我IP地址的TCP端口22和到vpn farm安全组UDP端口51220(不是TCP,UDP)。

此EC2实例的外部地址为54.246.243.162,可访问此EC2实例所在的VPC的私有地址为172.30.2.186。

要安装机器环境,我先用SSH连接。请注意,尽管我提倡在在AWS IAM上使用Ed25519,但目前还不支持它。据我所知,只支持RSA秘钥。对于AWS用户表示歉意。

python抓包动态网页(使用虚拟专用网络的Python)(6)

我将刷新包列表,然后通过PiVPN的安装程序安装WireGuard。在安装WireGuard客户端时,我倾向于直接使用WireGuard和Linux工具,但对于WireGuard服务器,PiVPN安装程序解决了很多复杂性和边缘案例。

python抓包动态网页(使用虚拟专用网络的Python)(7)

您可以选择安装OpenVPN或WireGuard,选择WireGuard。选择UDP端口51220作为WireGuard的默认端口。

您将看到一个DNS提供商列表,如Quad9、OpenDNS、Level3、DNS.WATCH、Norton、FamilyShield、CloudFlare、Google或Custom。选择你喜欢使用的。

您可以将WireGuard配置为使用域名或IPv4地址,对于本练习,我仅使用专用IPv4地址。

我将启用安全补丁自动升级程序。在上述所有操作之后,PiVPN要求重新启动系统。

安装了WireGuard之后,我创建了一个名为scrape的新用户帐户。

python抓包动态网页(使用虚拟专用网络的Python)(8)

下面是生成的配置文件的片段。我会在数据抓取主机上用这个连接到WireGuard 。

python抓包动态网页(使用虚拟专用网络的Python)(9)

创建WireGuard的客户端

我将设置另一个Ubuntu16服务器进行抓取。这应该有更多的vcpu、RAM和磁盘空间,因为它将用于解析和存储从抓取中收集的数据。这类机器的规格在很大程度上取决于它们的工作负载,因此我将避免提出一般性的建议。

我将安装Python和一个允许我们从第三方存储库安装WireGuard的实用程序。

python抓包动态网页(使用虚拟专用网络的Python)(10)

下面将向系统提供托管了我们感兴趣的WireGuard包的第三方存储库的详细信息,然后将其与OpenResolv一起安装。

python抓包动态网页(使用虚拟专用网络的Python)(11)

OpenResolv触发了resolvconf的删除,这需要重新启动系统。

python抓包动态网页(使用虚拟专用网络的Python)(12)

WireGuard服务器上生成的scrape.conf文件已保存到我在此计算机上使用的主目录中。我将把配置复制到WireGuard的配置文件夹中。

python抓包动态网页(使用虚拟专用网络的Python)(13)

然后我将启动WireGuard,并告诉系统在重新启动后启动它。

python抓包动态网页(使用虚拟专用网络的Python)(14)

运行以下命令以确保服务启动时没有问题。

python抓包动态网页(使用虚拟专用网络的Python)(15)

如果您看到除上述以外的任何内容,请尝试再次运行以下命令。

python抓包动态网页(使用虚拟专用网络的Python)(16)

WireGuard现在应该可以报告它的侦测结果。

python抓包动态网页(使用虚拟专用网络的Python)(17)

机器上的任何联网软件进行任何新的连接都将自动通过WireGuard进行隧道。

python抓包动态网页(使用虚拟专用网络的Python)(18)

下面是一个简短的Python示例。我将创建一个虚拟环境,其中包含处理所有HTTP和HTTPS调用的请求,以及处理解析返回的任何HTML的BeautifulSoup。

python抓包动态网页(使用虚拟专用网络的Python)(19)

下面将把HTTP代理设置为Chrome的最新版本。用您的服务器替换<hostname>。我已经设置了一个会话,因此cookies将跟踪任何后续请求。

python抓包动态网页(使用虚拟专用网络的Python)(20)

下面将解析并打印出在上述调用中找到的任何H1标记的内容。

python抓包动态网页(使用虚拟专用网络的Python)(21)

所有以上都是通过WireGuard自动运行的。

设置OpenSSH SOCKS5代理

AWS EC2上的机器已经安装了OpenSSH,SSH公钥将被放入/home/ubuntu/.SSH/authorized\u密钥中。这意味着我可以在客户端系统上启动一个SOCKS5代理。

python抓包动态网页(使用虚拟专用网络的Python)(22)

连接到服务器后,运行top以防止连接超时。

python抓包动态网页(使用虚拟专用网络的Python)(23)

以上将在本地打开TCP端口9090。使用libcurl的工具应支持在ALL_proxy环境变量中定义的SOCKS5代理设置。

python抓包动态网页(使用虚拟专用网络的Python)(24)

对于Python,我们需要安装Request中包含的SOCKS包。

python抓包动态网页(使用虚拟专用网络的Python)(25)

谢谢你抽出时间来读这篇文章。我为北美和欧洲的客户提供咨询、架构和开发服务。如果您想讨论我的产品,请通过LinkedIn与我联系。

英文原文:https://tech.marksblogg.com/python-scraper-wireguard-vpn-ssh-proxy.html 译者:QL

python抓包动态网页(使用虚拟专用网络的Python)(26)

,