代理上网服务器搭建教程(使用代理ip上网的方法)

每一个想学习的念头,都有可能是未来的你在向自己求救。

1.写在前面的

本次文章内容需要准备:一台动态 ADSL 拨号服务器,一台普通服务器,一个公网 redis 环境(可以直接部署在前面普通服务器上)。

它有个独有的特点,每拨一次号,就获取一个新的IP。也就是它的IP是不固定的,不过既然是拨号上网嘛,速度也是有保障的,用它搭建一个代理,那既能保证可用,又能自由控制拨号切换(抄自知乎)。

借助 ADSL 拨号服务器特点,我们可以获取一个公网 IP,然后借助第三方工具/软件在服务器上搭建 HTTP 代理就行了。关于搭建 HTTP 代理有很多推荐,比如说 Squid。但是 Squid 这些需要配置信息,对于个人来讲有些麻烦,所以在这篇文章里,我们尝试用 gost 来搭建 HTTP 代理(https://github.com/ginuerzh/gost)。

2.拨号服务器基操

在搭建 HTTP 代理之前,还是先说一下拨号服务器常用操作:

pppoe-start#拨号pppoe-stop#断开拨号pppoe-status#拨号连接状态

一般购买拨号服务器之后,使用 ssh 连接上使用pppoe-start命令先进行拨号(不同平台命令可能不一样),成功后可以尝试使用curl ip.sb查看当前获取的新 IP:

[root@localhost~]#curlip.sb#检查当前ip171.41.86.191[root@localhost~]#pppoe-stop#停止当前拨号[root@localhost~]#pppoe-start#开始拨号[root@localhost~]#curlip.sb#检查当前ip171.41.85.191[root@localhost~]#3.搭建 HTTP 代理

上面提到使用 gost 搭建 HTTP 代理,现从 GITHUB 上下载对应的平台 / 版本的 gost。我这里下载的是:gost-linux-amd64-2.11.1,你们可以根据自己需要下载合适的版本。下载之后解压之后得到一个可执行文件:

[root@localhost~]#lltotal31508-rw——-.1rootroot1319Sep292019anaconda-ks.cfg-rw-r–r–1rootroot8784858Dec1411:50file.zip-rw-r–r–1rootroot16830464May232020gost-linux-amd64#就这个这个-rw-r–r–1rootroot6643001Dec822:46proxy_client#等会用[root@localhost~]#

确定当前拨号成功后直接执行:

[root@localhost~]#mvgost-linux-amd64gost#重命名(可有可无)[root@localhost~]#chmod777gost#修改权限,必须,不然无法执行[root@localhost~]#./gost-L=admin:123456@:8123#设置代理认证信息2020/12/1413:52:44route.go:650:auto://:8123on[::]:8123

这里可以使用 systemctl 给 gost 做个进程守护,在 /etc/systemd/system/ 路径新建文件 gost.service 内容:

[Unit]Description=Gost ProxyAfter=network.targetWants=network.target[Service]Type=simpleExecStart=/root/gost -L=http://admin:123456@:8123 -L=socks5://admin:123456@:8125 # socks5 根据自己需要设置Restart=always[Install]WantedBy=multi-user.target

之后可以直接使用 systemctl 命令控制 gost :

systemctldaemon-reloadsystemctlenablegostsystemctlrestartgostsystemctlstatusgost

此时测试当前 HTTP 代理是否可用:

┌──(h1code2??LAPTOP-IMECGKD2)-[/mnt/c/Users/h1code2]└─$curl-xhttp://admin:123456@171.41.85.191:8123http://httpbin.org/ip#代理测试{“origin”:”171.41.85.191″}

现在代理测试通过,接着我们要做的就是需要实时将服务器最新拨号成功后的 IP 通知到爬虫。在这里我们可以把拨号服务器理解成客户端,正式场景肯定不会只有一台(如图:),所以我们还需要使用一个服务器端来记录和分配最近可用的代理 IP。

代理上网服务器搭建教程(使用代理ip上网的方法)4.客户端 / 服务端实现

为了简化客户端部署,这里使用 go 语言编写客户端代码,并编译成二进制可执行文件,小伙伴们只需要按照自己的需要增加环境变量即可。这里简单讲一下逻辑,客户端会根据配置的接口信息主动连接服务端,在这个过程中会自动上报当前拨号后的 IP 和端口等信息,服务端响应请求后记录 IP 并返回该客户端是否需要切换 IP 的状态。在上面搭建 HTTP 代理的内容里可以看到与 gost 同级下有个文件 proxy_client,这个就是我们的客户端可执行文件。该程序会读取 7 个环境变量分别是:

api_host # 服务端接口信息hostapi_token # 服务端接口验证token username # 代理验证用户名password # 代理验证密码http_port # http/https代理端口socks5_port # socks5代理端口

根据需要设置环境变量:

exportapi_host=api.h1code2.cn/api/proxyexportapi_token=xfsdfhkjf23rfdwefexportusername=adminexportpassword=123456exporthttp_port=8123exportsocks5_port=8125

之后执行 export 大概是这个样子:

[root@localhost~]#export···declare-xapi_host=”api.h1code2.cn/api/proxy”declare-xapi_token=”xfsdfhkjf23rfdwef”declare-xhttp_port=”8123″declare-xpassword=”123456″declare-xsocks5_port=”8125″declare-xusername=”admin”

在运行 proxy_client 文件之前我们还需要,简单实现一下服务端的逻辑,这里使用 redis 做了定时缓存等操作,具体逻辑可以自己实现,我这里随便敲的代码渣,作参考就好。

importujsonasjsonfrompydanticimportBaseModelfromfastapiimportAPIRouter,Requestfromdb.session_v2importredisrouter=APIRouter()hash_key=”proxy-node:hash”redis_client=redis()classProxy(BaseModel):http_port:intsocks5_port:intusername:strpassword:str@router.get(“/all_proxy”)defall_proxy():”””获取当前所有代理信息:return:”””data={}nodes=redis_client.hgetall(hash_key)ifnotnodes:return{“message”:”success”,”code”:200,”data”:data}forkey,valueinnodes.items():data[key]=json.loads(value)return{“message”:”success”,”code”:200,”data”:data}@router.post(“/proxy/{node}/”)defpush_proxy_info(node:str,proxy:Proxy,request:Request):”””代理信息上报接口:paramnode:客户端节点:paramproxy:代理信息:paramrequest::return:json包含代理切换状态”””switch_state=Falsestring_key=f”{node}:string”ifredis_client.get(string_key)isNone:#过期switch_state=Trueredis_client.set(string_key,”1″,ex=60)ifredis_client.get(string_key)==”0″:#手动切换/爬虫程序可控redis_client.set(string_key,”1″,ex=60)client_host=request.client.host#当前客户端host:port#redis_client.hmset(hash_key,dict(proxy))#同时设置多值_dict=dict(proxy)_dict[“host”]=client_hostredis_client.hset(hash_key,key=node,value=json.dumps(_dict))return{“message”:”success”,”code”:200,”data”:{“switch_state”:switch_state}}

启动 fastapi 服务:

(proxy-venv)┌──(h1code2??LAPTOP-IMECGKD2)-[/mnt/d/PycharmProjects/proxy-test]└─$uvicornservice.run:appINFO:Startedserverprocess[14291]INFO:Waitingforapplicationstartup.INFO:Applicationstartupcomplete.INFO:Uvicornrunningonhttp://127.0.0.1:8000(PressCTRL Ctoquit)INFO:171.81.86.81:0-“POST/api/proxy/node-1/?token=xfsdfhkjf23rfdwefHTTP/1.0″200OKINFO:171.81.85.51:0-“POST/api/proxy/node-1/?token=xfsdfhkjf23rfdwefHTTP/1.0″200OKINFO:171.81.85.51:0-“POST/api/proxy/node-1/?token=xfsdfhkjf23rfdwefHTTP/1.0″200OK

因为我这里代理是运行在本地环境的,使用 frp 做了内网穿透,所以此时 proxy_client 等会通过 api.h1code2.cn/api/proxy/node-1 实际连接的是我们本地的 fastapi 服务,这个并不是必须,你可以直接把 fastapi 接口代码部署公网服务器上。

启动客户端:

[root@localhost~]#chmod777proxy_client#修改可执行权限[root@localhost~]#./proxy_client{node:node-1HttpPort:8123Socks5Port:8125Username:adminPassword:123456}switchconnectstatusfalse1607958301switchconnectstatusfalse1607958302switchconnectstatusfalse1607958303

客户端程序启动后,可以查看 redis 中已经记录了拨号代理 IP:

127.0.0.1:6379[14]>hgetallproxy-node:hash1)”node-1″2)”{\”http_port\”:8123,\”socks5_port\”:8125,\”username\”:\”admin\”,\”password\”:\”123456\”,\”host\”:\”171.81.85.51\”}”127.0.0.1:6379[14]>

也可以通过我们自己实现的接口查看:

┌──(h1code2??LAPTOP-IMECGKD2)-[/mnt/c/Users/h1code2]└─$curlhttp://api.h1code2.cn/api/all_proxy{“message”:”success”,”code”:200,”data”:{“node-1”:{“http_port”:8123,”socks5_port”:8125,”username”:”admin”,”password”:”123456″,”host”:”171.81.85.51″}}}

测试一下当前代理:

┌──(h1code2??LAPTOP-IMECGKD2)-[/mnt/c/Users/h1code2]└─$curl-xhttp://admin:123456@171.81.85.51:81233ip.sb171.81.85.51

关于 proxy_client 文件我放置在 https://github.com/h1code2/proxy_client ,更多爬虫 / 逆向相关内容可以进球讨论:

发表评论

登录后才能评论