时间过得真快。距离本系列上一篇文章《商业级4G代理搭建指南【准备篇】》发表已经两周了。上周因为各种琐事,从周二开始就没时间写文章了,就咕咕咕。然后在预备篇中,我们了解了搭建4G代理需要的软硬件,也知道了各种方案的优缺点。现在,可以开始实际施工了,相信大家也是期待已久了。基本思路从本文标题可以看出,本次构建方案主要使用了Docker。你可能很好奇,Docker和搭建4G代理有什么关系?好吧,这与它有很大关系。让我们整理一下整个事情。首先我们看一下设置4G代理的基本过程:调用网卡拨号,拨号成功后会创建一个虚拟网卡。(一般情况下,可以使用这个虚拟网卡上网。)如果有多个网卡,重复第一步,得到多个虚拟网卡。启动代理服务器,使其使用虚拟网卡作为出网卡,使用连接到内网的物理网卡作为入网卡。但是,有一个问题。根据我之前的测试结果,目前linux环境下还没有可以单独指定出网卡和入网卡的HTTP代理服务器。嗯...这个很麻烦,因为如果我们做不到,就会出现类似下面的问题:出网和入网都在虚拟网卡上,必须通过代理服务器访问公共网络。入网是物理网卡,但是出网被代理服务器锁定到某一个,无法使用多个网卡。嗯...所以不用HTTP代理服务器,使用那些经常用来做一些技巧的Socks5代理服务器怎么样?如果可以指定网卡,那就用Privoxy之类的工具把Socks5代理转成HTTP代理。(某知名扶墙软件的Windows版就是这样的HTTP代理。)经过一番尝试,发现虽然有的Socks5代理服务器文档上说可以指定网卡,但好像不能直接通过按照说明进行操作。要达到我想要的效果(要么还是锁在某一个上,要么不能上网),所以还是有一些问题。可能需要结合路由表设置来操作,但是我对网络工程理解不深,搞了几天也没弄明白,只好再想其他办法.这时候,我想到了一个东西——Docker,可以用来解决这个问题!因为Docker容器创建之后,不管有多少个外部网卡,容器内部的网卡只会有一个Docker自己的虚拟网卡(用于容器间通信)和一个本地loopback接口(不用担心关于它),而我们在容器中进行拨号操作时,新生成的虚拟网卡不会对外界或其他容器产生影响。这种情况下代理服务器不需要指定网卡,启动后直接运行即可!那么现在整个流程运行的很顺利,下面我们就进入实际操作环节看看吧!在系统方面,构建Docker版本有很多选择。由于我使用的示例设备是树莓派,所以这里选择使用Raspbian(DebianforRaspberryPi的专属版本)。如果您正在使用其他设备,只需选择您经常使用的系统即可。那么准备好之后的第一步当然是下载安装Docker了。这里我直接使用Docker官方提供的一键安装脚本进行安装:curl-fsSLhttps://get.docker.com-oget-docker。shsudoshget-docker.sh#来自官方文档:https://docs.docker.com/install/linux/docker-ce/debian/#install-using-the-convenience-script这个一键安装脚本是理论上来说所有的Linux发行版都可以使用。毕竟已经出来很久了。如果没有,请使用搜索引擎查找相关信息。安装Docker后,有两种选择:进入体验模式,了解具体操作细节。这段不要看,翻到本文底部,直接用我写的轮子。启动容器体验,我们先启动一个Docker容器,执行如下命令:sudodockerrun-it--rm--privileged-p3128:3128ubuntu:18.04bash上面命令的意思是启动一个内部的system为Ubuntu18.04容器,进入容器内的shell执行bash命令。如果退出bash,容器会自动销毁;然后将容器中的3128端口映射到外界,映射的外部端口也是3128;最后一个特权参数是开启特权模式,用于将网卡设备映射到容器中。如果下载镜像很慢,可以搜索“Docker加速器”,也可以直接扶墙。测试网卡是否正常进入容器后,我们可以执行ls/dev/ttyUSB*看看是否正常识别网卡(在容器外也一样,因为开启了特权模式),如果是买的和我一样用4G网卡的话,只插一张网卡的时候会看到4个ttyUSB设备。不同的4G网卡和硬件组合可能会有所不同,请以实际情况为准。如果能看到4?4G网卡和几个ttyUSB设备,说明没有问题,可以开始下一步了。拨号上网接下来要做的就是拨号。拨号可以选择使用Wvdial之类的工具,也可以选择使用Fanconn之类商家提供的拨号脚本(直接调用PPPD),使用效果会有些不同。如果商家没有提供拨号脚本,使用Wvdial,可以自动生成配置,立即使用。我这边既然范康的技术人员直接提供了拨号脚本,那我就用这个脚本。Wvdial网上有很多详细的文档,这里不再赘述。需要的朋友可以自行搜索。如果你用的是Fanconn的这个拨号脚本(不用我说怎么放到容器里?),那么直接用aptinstallppp安装拨号工具后,使用chmod+xquectel-pppd.sh添加拨号脚本运行权限,然后./quectel-pppd.sh/dev/ttyUSB3。拨号时使用的/dev/ttyUSB3指的是4G网卡的第四个通讯口。文档中的解释是:ttyUSB3→ForPPPconnectionsorATcommandcommunication。转换用于PPP连接或AT命令通信。拨号后使用ifconfig等工具可以看到类似下图的状态:可以看到,如上文所述,现在有三张网卡,一张是Docker自己的,一张是本地的loopback接口(不要'这个不用担心),一个是拨号生成的虚拟网卡。如果没有在Docker容器中使用,会有一个wwan0(或其他名字),就是4G网卡体。测试是否可以正常上网现在如果使用curl的--interface参数指定虚拟网卡进行请求(如:curl--interfaceppp0https://ip.cn),请求已经可以了成功,IP也将是您使用的SIM卡,由运营商分配。由于Docker镜像通常非常精简,像net-tools、iputils-ping、vim、curl等包并没有预装在Ubuntu镜像中,需要自行安装。所以如果你发现ifconfig、ping、curl、vim无法使用,不要惊慌,这是正常现象,执行aptinstallpackagename命令安装即可。如果不能直接请求成功,可能是DNS解析有问题。可以尝试ping一个公网IP(如:ping1.1.1.1)和一个域名(如:pingip.cn),如果能ping通IP但域名会报DNS解析失败,可以确认是DNS设置的问题。如果4G拨号出现DNS设置问题,一般是拨号工具没有将运营商返回的DNS服务器设置正常写入配置,我们可以手动配置(也可以强制某个DNS被指定):#下面对于阿里云的publicDNSecho'nameserver223.5.5.5'>>/etc/resolv.confecho'nameserver223.6.6.6'>>/etc/resolv.conf在Docker容器中,这个/etc/resolv.conf文件也可能有两个内容,这是容器本身需要的。建议不要删除/覆盖,否则容器之间将无法使用容器名称进行通信。启动代理服务器然后在测试拨号确实可以通过4G网卡上网后,我们就可以启动代理服务器了。这里我使用TinyProxy。测试发现squid占用资源较多,不利于多网卡使用,会影响4G网卡数量上限。先aptinstalltinyproxy,然后vim/etc/tinyproxy/tinyproxy.conf修改配置。需要修改的配置主要包括:Port配置项修改为3128,因为我们之前映射的端口是3128。Listen配置项改为0.0.0.0,因为我们需要在其他设备上使用这个代理服务器。注释掉Allow配置项或者改成0.0.0.0/0。默认的127.0.0.1将使其他设备无法访问。修改后保存一波,然后就可以直接执行tinyproxy启动了……?等等,还有一项手术要做!即把默认路由指向虚拟网卡。很简单,执行如下命令即可:routedel-net0.0.0.0eth0routeadd-net0.0.0.0ppp0这两条命令的意思是:先把默认路由指向eth0删除这个网卡的上网路由,然后添加一条相同的路由指向ppp0的网卡。更改默认路由后的效果是,即使不使用curl的--interface参数,也可以直接使用4G网卡上网。如果不改默认路由,不指定网卡就不会使用4G网卡,因为默认路由指向的是Docker自己的虚拟网卡,那个网卡通向你原来的内网环境。也就是说,IP是不会变的!所以现在,您可以执行tinyproxy来启动代理服务器。测试代理服务器。代理服务器应该已经正常启动了。现在我们可以尝试在另一台设备上连接容器中的代理服务器,看能否使用4G网卡正常上网。比如我这里分配给树莓派的IP是:192.168.137.66,那么我可以用这个curl命令或者Python代码来测试:curl:curl"https://ip.cn"curl-x"192.168.137.66:3128""https://ip.cn"Python:importrequestsresp=requests.get("https://ip.cn",proxies={"https":"http://192.168.137.66:3128"})no_proxy_resp=requests.get("https://ip.cn")print(resp.text)print(no_proxy_resp.text)测试结果应该和之前在容器内测试一致。使用代理后,IP就会变成运营商分配的基站IP。更改IP那么核心问题来了,如何更改IP?其实和用那些拨号VPS架设代理服务器是一样的。我们只需要重新拨一个号码就可以更改IP。直接killpppd进程,使其断开拨号。断开连接后,重新执行拨号脚本重拨。范康的技术人员还提供了断线拨号的脚本。另外,在授予使用chmod+xquectel-ppp-kill运行的权限后,执行./quectel-ppp-kill。但需要注意的是,蜂窝网络拨号断开后,IP仍会保留一段时间(具体时间不清楚,也可能与连接的基站有关),所以我们需要强制网卡重新搜索网络。冷门小知识:手机开启和关闭飞行模式的效果是再上网搜一下。通常情况下,如果只是关闭“移动数据”,效果与断开拨号一样。怎么做?很简单,就两行命令:AT+CFUN=0AT+CFUN=1但是注意,这是AT命令,不是Linux下的Shell命令。AT命令是一种调制解调器命令语言。如果我们需要执行它,需要这样做:echo"AT+CFUN=0">/dev/ttyUSB2#中间间隔1秒左右echo"AT+CFUN=1">/dev/ttyUSB2/dev/这里使用的ttyUSB2是指4G网卡的第三部分第一个通讯口在文档中解释为:ttyUSB2→用于AT指令通讯,与第四个通讯口类似,只是不能用于PPP连接和只能用于AT命令通信。之所以不使用第四个通信端口,是因为端口可能被占用,直接区分是最安全的。本来网卡也提供了两个AT命令的通信通道。网卡重新搜网后的几秒到十几秒,无法正常拨号。您需要等待其初始化完成后才能拨号成功。具体等待时间视信号强度而定。我测试通常在5秒内。因此,如果您在断开连接后仍然无法拨号,请稍后再试。综上所述,现在操作流程很顺利,我们也了解了整个内部细节。最后要做的就是给每个网卡分配一个容器,这样我们就可以实现文章开头提到的——》使用虚拟网卡作为出网卡,连接的物理网卡到内部网络用作传入网卡”。实际运行时,就是配置指定网卡的部分,然后在启动容器的时候传入。使用Docker的容器环境变量相关设置可以轻松实现该功能。最后,我们可以使用这个想法来构建一个docker-compose模板。模板的核心内容是搭建一个简单的4G网卡容器集群,并启动一个squid聚合代理服务器,这样我们只需要指定一个代理服务器就可以随机更换,操作起来更方便。好了,以上就是Docker版本的构建方法和整个构建过程的思路。如果懒得看,可以直接用我写的轮子,只需要发消息【Docker版4G代理】给公众号【NightTeam】即可。评测的最后,让我对这种施工方式给出一个评价。这种构建方式并不完美,因为变数太多,很多地方肯定不如系统级原生支持稳定,长期使用可能会出现各种奇怪的问题。但是Docker的资源占用率其实还是挺高的,在启动容器上会浪费很多内存。如果只有两三块网卡还好,数量多了树莓派2B这种内存小的设备根本扛不住。活不下去。另外,代理服务器本身的资源消耗比较大,高频调用下对树莓派2B的小CPU压力还是挺大的。即使我超频了它的CPU,在并发测试的时候还是会出现轻松满CPU的情况。但!到现在我还有两个基于路由器系统的搭建方案还没写呢!所以……敬请期待以后其他的建设计划(眯眼微笑)。文章作者:《夜队NightTeam》——Loco夜队成立于2019年,团队成员包括崔庆才、周子奇、陈祥安、唐一飞、冯玮、蔡劲、戴黄锦??、张业清、韦世东。涉及的编程语言包括但不限于Python、Rust、C++、Go,领域涵盖爬虫、深度学习、服务开发、对象存储等。团队无善无恶,只做正确的事,请小心。
