docker 代理_Docker竟然还能这么玩?商业级4G代理搭建实战

本文详细介绍了如何利用Docker解决Linux环境下HTTP代理服务器无法指定出网和入网网卡的问题,通过在Docker容器内拨号创建虚拟网卡,结合Socks5代理和Privoxy实现HTTP代理,确保代理服务器可以利用多网卡,从而实现4G代理上网。文中还包含了具体的Docker安装、拨号上网、代理服务器启动等步骤。
摘要由CSDN通过智能技术生成
af1241956f9c4446e8ab21b76fc24c24.png

基本思路

从这篇文章的标题中我们可以看出,这一次的搭建方案主要用到的是 Docker,你可能会很好奇,Docker 跟搭建 4G 代理有什么关系吗?

嗯,关系很大,我们把整件事情梳理一下,先来看看搭建 4G 代理时的基本流程:

  1. 调用网卡拨号,拨号成功后会创建一个虚拟网卡。(正常情况下使用这个虚拟网卡就能上网了)

2.在多网卡的情况下,重复第一步,会得到多个虚拟网卡。

3.启动代理服务器,使其使用虚拟网卡作为出网网卡,并使用接入内网的实体网卡作为入网网卡。

但是呢,有个问题,根据我之前的测试结果来看,目前在 Linux 环境下还没有一个 HTTP 代理服务器是可以做到分别指定出网网卡和入网网卡的,嗯...这就很麻烦了,因为如果我们无法这么做的话,就会出现类似于下面这样的问题:

  1. 出网和入网都在虚拟网卡上,使用代理服务器必须要走公网访问。
  2. 入网为实体网卡,但出网被代理服务器锁定为了某一个,无法利用到多网卡。

嗯...那么不用 HTTP 代理服务器,用那些经常被用来做一些骚操作的 Socks5 代理服务器呢?如果可以指定网卡的话,再用像 Privoxy 之类的工具把 Socks5 代理转成 HTTP 代理就好了。(某知名扶墙软件的 Windows 版本就是这么转的 HTTP 代理)

在经过一番尝试后,我发现虽然有些 Socks5 代理服务器的文档中是说可以指定网卡,但按照说明操作后,似乎并不能直接做到我想要的效果(要么还是锁定在某一个上面、要么上不了网),所以还是存在一些问题的。可能是需要配合路由表设置来进行操作吧,不过我对网络工程的了解不怎么深,搞了几天也没搞出来,于是乎还得想想别的办法。

f60cbc0af1d352e03d938577fe3000b9.png

这时候,我想到了一个东西——Docker,它可以用来解决这个问题!

因为 Docker 容器被创建后,不管外界的网卡有多少个,容器内部的网卡都只会有一个Docker自己的虚拟网卡(容器间通信用的)和一个本地环回接口(不用管它),而且我们在容器内进行拨号操作时,产生的那个新的虚拟网卡也不会影响到外界或其他容器,这样的话,代理服务器就不需要指定网卡了,直接启动就能跑!

那么现在整个流程就跑通了,进入实际操作环节看看吧!


系统方面

这个 Docker 版的搭建方式,系统方面的选择很多,由于我使用的样例设备是树莓派,所以这里就选择使用了 Raspbian(树莓派专属版 Debian)。如果你使用的是其他设备的话,直接选择一个自己常用的系统就好。

那么准备好之后的第一步当然是先下载并安装 Docker,这里我直接使用 Docker 官方提供的一键安装脚本来进行安装:

curl -fsSL https://get.docker.com -o get-docker.shsudo sh get-docker.sh# 出自官方文档:https://docs.docker.com/install/linux/docker-ce/debian/#install-using-the-convenience-script

这个一键安装脚本理论上来讲所有 Linux 发行版都可以使用,毕竟已经出来很长时间了,如果不行的话请自行使用搜索引擎查找相关资料。

装好 Docker 之后,你有两个选择:

  1. 进入体验模式,了解一下具体操作细节是怎么样的。
  2. 不看这一段,翻到本文最下方直接使用我写好的轮子。

启动容器

体验的话,我们就直接这么启动一个 Docker 容器吧,执行以下命令:

sudo docker run -it --rm --privileged -p 3128:3128 ubuntu:18.04 bash

上面这条命令的意思是,启动一个内部系统为 Ubuntu18.04 的容器,并进入容器内部的 Shell 执行 bash 命令,如果退出 bash 就自动销毁容器;然后映射容器内的端口3128到外界,映射出来的外界端口也是3128;最后 privileged参数是开启特权模式,用于将网卡设备映射进容器内。

如果下载镜像很慢的话,可以搜一下“Docker 加速器”,也可以直接扶墙。

测试一下网卡是否正常

进入容器内部后,我们可以执行一下 ls /dev/ttyUSB* 看一下网卡有没有正常被识别出来(在容器外也是一样的,因为开了特权模式),如果是和我买的同一款 4G 网卡的话,在只插入一张网卡的情况下你会看到4个 ttyUSB 设备。

8c447bd9277fdcaf2878a59a9d525ebb.png

不同 4G 网卡和硬件组合可能会有差异,请以实际情况为准。

如果你可以看到4✖4G网卡个数个 ttyUSB 设备的话,就说明没有问题,可以开始下一步了。

拨号上网

接下来要做的就是拨号了,拨号方面可以选择使用 Wvdial 这种工具,也可以选择使用像 Fanconn 这样的商家提供的拨号脚本(直接调用 PPPD),使用起来的效果会有一些区别。如果商家没有提供拨号脚本的话,就用 Wvdial 吧,它能自动生成配置,上手即用。

我这边的话,由于 Fanconn 的技术人员直接提供了个拨号脚本,那我就用这个脚本了,Wvdial 的文档网上有很多很详尽的,这里就不再多提,需要的朋友自行搜索即可。

如果你用的是 Fanconn 的这个拨号脚本(怎么弄进容器内就不用我说了吧?),那么直接在 apt install ppp 安装好拨号工具之后,用 chmod +x quectel-pppd.sh 给拨号脚本加个运行权限,然后 ./quectel-pppd.sh /dev/ttyUSB3 即可。

拨号时使用的 /dev/ttyUSB3 是指 4G 网卡的第四个通信端口,文档中的解释为:ttyUSB3→For PPP connections or AT command communication,翻译一下就是用于 PPP 连接或 AT 命令通信。

拨号之后用 ifconfig 之类的工具即可看到类似下图中的状态:

3e3ec2310222a3c2e974ca2da2af84c5.png

可以看到,如前文所述,现在有三个网卡,一个是 Docker 自己的、一个是本地环回接口(这个不用管)、一个是拨号产生的虚拟网卡。

如果不是在 Docker 容器内使用的话,还会有个 wwan0(或其他名字),那个是 4G 网卡本体。

测试是否能正常上网

现在如果你用 curl 的 --interface 参数指定虚拟网卡进行请求的话(如:curl --interface ppp0 https://ip.cn),是已经可以请求成功的了,IP 也会是你所使用的 SIM 卡对应的运营商分配的。

由于 Docker 的镜像通常都是极度精简的,所以 Ubuntu 镜像里并没有预装像 net-tools、iputils-ping、vim、curl 之类的这些包,需要自行安装。所以如果你发现 ifconfig、ping、curl、vim 用不了,不要惊慌,这是正常现象,执行 apt install 包名 命令安装即可。

如果你无法直接请求成功的话,就可能是 DNS 解析出问题了,可以尝试 ping 一个公网 IP(如:ping 1.1.1.1)和一个域名(如:ping ip.cn),如果 IP 能 ping 通但域名会报 DNS 解析失败的话,就可以确认是 DNS 设置问题了。

4G 拨号时如果出现 DNS 设置问题,通常是因为拨号工具没有正常地将运营商返回的 DNS 服务器设置写入到配置中,我们可以手动配置一下(你要强制指定某一个 DNS 也可以):

# 以下为阿里云的公共DNSecho 'nameserver 223.5.5.5' >> /etc/resolv.confecho 'nameserver 223.6.6.6' >> /etc/resolv.conf

在 Docker 容器中,这个 /etc/resolv.conf 文件可能还会有两条内容,是容器本身所需要的,建议不要删除/覆盖,否则会出现容器间无法使用容器名互相通信的情况。

启动代理服务器

那么在测试拨号后确实可以通过 4G 网卡上网了之后,我们就可以把代理服务器启动了,这里我使用的是 TinyProxy。

测试发现,Squid 对资源的占用更大一些,不利于多网卡情况下的使用,会影响到 4G 网卡的数量上限。

先 apt install tinyproxy 一波,然后 vim /etc/tinyproxy/tinyproxy.conf 修改一下配置。

要修改的配置主要有:

  • Port 配置项改为3128,因为我们前面映射出来的端口是3128。
  • Listen 配置项改为0.0.0.0,因为我们需要在其他设备上使用这个代理服务器。
  • Allow 配置项注释掉或改为0.0.0.0/0,默认的127.0.0.1会导致其他设备无法访问。

改完之后保存一波,然后就可以直接执行 tinyproxy 启动了...吗?

等等,还有一个操作要做!那就是将默认路由指向到虚拟网卡上,很简单,执行以下命令即可:

route del -net 0.0.0.0 eth0route add -net 0.0.0.0 ppp0

这两条命令的意思是:先将默认的、指向 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:

import requestsresp = requests.get("https://ip.cn
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值