ADSL拨号代理服务器实现HTTP代理的搭建过程_TesterT的博客-程序员秘密

技术标签: 爬虫  

最近做一个项目时,发现购mai的厂商的代理似乎被识别了,总是拿不到正确的响应。于是尝试自己搭建了一个ADSL代理实现HTTP代理。

ADSL拨号代理:电信宽带每一次拨号后会更换IP,利用这一点在IP更换后将新的IP存入到代理池中。

代理的搭建过程分为以下几步:

(1)购买代理服务器,笔者选择了淘b_a_o上销Liang最高的一家;

(2)远程客fu给的代理服务器,拨号成功后,安装必要的软件;

(3)安装及启动TinyProxy搭建代理;

(4)安装python/编写HTTP代理池脚本;


一    购买代理服务器

先跟客fu沟通一下你要买什么类型的服务器,有混播/单地区类型,经过测试:混播服务器换IP质量很差,单地区类型的服务器虽然IP总是在同一个地区,但比较稳定。我的项目对于IP地区也没有要求,因此采用了单地区的服务器。购买后,客fu会提供一些服务器信息供你连接,以后连接这台ADSL服务器都靠这个来连:

二    远程服务器:拨号

使用xshell工具远程服务器,此时远程后,服务器是连不上外网的,需要拨号后才能连外网。我购mai的服务器是通过pppoe来拨号的,首先运行pppoe-setup,开始拨号:

(1)首先出现了LOGIN NAME  Enter your Login Name :——输入客服提供的服务器信息中的宽带账户名;

(2)输入网路介面卡,默认为eth0——这个我没管,用的默认;

(3)是否限制连线时长?长时间连接后是否自动中断连接,默认为否——这个直接enter跳过不管;

(4)输入dns服务器地址——这个可以去网上搜一搜常用的DNS服务器地址,我配置的是114.114.114.114(有时候这个dns会出问题。修改为223.5.5.5也OK)

(5)输入备用dns服务器地址——我配置的8.8.8.8

(6)输入连线密码——这个就输入客服给的宽带密码就OK

(7)重复输入连线密码——重复上一步输入的密码

(8)是否允许一般用户来操作DSL连接,默认为是——这个enter跳过用默认就行

(9)开机设置防火墙——这个输入0就好

(10)是否开机自动拨号——输入yes

(11)确认配置无误?——输入y确认无误。如果有误输入n重新填写

以上配置配好之后,此时还不能连网,需要执行命令连网断网。我买的这台服务器的命令是:

连接网络:/sbin/ifup ppp0,

断开连接:/sbin/ifdown ppp0,

查看网络状态:/sbin/pppoe-status

连接网络: adsl-start,

断开连接:adsl-stop,

如下图可以看到拨号成功,可以ping通外网:

注意:

(1)有时候采用adsl-stop/adsl-start命令后会拨号失败,连不上外网,所以我采用了客服给的ifdown  ifup拨号命令。

(2)拨号成功后可以ping一个ip和一个域名来测试一下网络连接状况。如果ping不通已知在网的IP且ping不通域名,则可能是连不上网络。如果是ping得通IP却ping不通域名,则可能是DNS服务器配置出错导致,修改DNS配置方法可参考该链接下的说明:https://www.cnblogs.com/dadadechengzi/p/6670530.html

三    TinyProxy代理搭建

1.安装TinyProxy

yum install -y epel-release

yum update -y     ——升级yum,可能会等很长一段时间

yum install -y tinyproxy

2.配置TinyProxy

(1)vi /etc/tinyproxy/tinyproxy.conf修改两处配置:端口号和允许连接该代理的IP白名单:

上图中,默认用8888端口作为代理端口,可以修改为你用作代理端口的端口号;

允许访问该代理端口的IP,默认为只有本机可以使用该代理,把这行注释掉可以使所有IP都可以使用该代理。

(2)配置完后,重启TinyProxy

systemctl enable tinyproxy.service

systemctl restart tinyproxy.service

防火墙开放你的配置的代理端口:

iptables -I INPUT -p tcp --dport 8888 -j ACCEPT

3.验证TinyProxy

在另一台主机上运行以下命令检查是否用了代理:

curl -x 代理服务器IP地址:代理端口 httpbin.org/get

上图中访问httpbin.org/get得到本地IP为119.23.xx.x,通过代理端口访问该地址,得到的IP地址为114.104.xx.x,这说明代理搭建成功。

 

四    安装python及编写脚本

1.安装python

下面是我的安装脚本,我每次都是直接用这个脚本来自动安装。

#!/usr/bin/env bash
yum -y install wget zlib zlib-devel openssl-devel gcc make
wget -P /usr/local/src/ https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
tar -xzvf /usr/local/src/Python-3.6.5.tgz

cd Python-3.6.5
./configure --prefix=/usr/local --with-ssl
make
make altinstall
make clean
cd ../
rm -rf Python-3.6.5*

ln -s /usr/local/bin/python3.6 /usr/bin/python3
ln -s /usr/local/bin/pip3.6 /usr/bin/pip3
pip3 install --upgrade pip
python3 -V && pip3 -V

2.编写更新代理的脚本

由于ADSL拨号服务器拨号后,IP已经变化为新的IP,这时候要通知其他使用IP者新的IP地址是什么,这就需要有一个接口或者缓存供其调用、存储变化后的IP。我这里采用redis来缓存。

import re, time, requests
from requests.exceptions import ConnectionError, ReadTimeout

# coding=utf-8
# 拨号间隔
ADSL_CYCLE = 60*60*2
# 拨号出错重试间隔
ADSL_ERROR_CYCLE = 5
# ADSL命令
ADSL_BASH = '/sbin/ifdown ppp0;/sbin/ifup ppp0'
# 代理运行端口
PROXY_PORT = 8888
# 拨号网卡
ADSL_IFNAME = 'ppp0'
# 代理池键名
PROXY_KEY = 'adsl'
# 测试URL
TEST_URL = 'http://www.baidu.com'
# 测试超时时间
TEST_TIMEOUT = 20
# API端口
API_PORT = 8000

# coding=utf-8
import re
import time
import requests
from requests.exceptions import ConnectionError, ReadTimeout
from redis import StrictRedis
import platform

if platform.python_version().startswith('2.'):
    import commands as subprocess
elif platform.python_version().startswith('3.'):
    import subprocess
else:
    raise ValueError('python version must be 2 or 3')


class Sender():
    def get_ip(self, ifname=ADSL_IFNAME):
        """
        获取本机IP
        :param ifname: 网卡名称
        :return:
        """
        (status, output) = subprocess.getstatusoutput('ifconfig')
        if status == 0:
            pattern = re.compile(ifname + '.*?inet.*?(\d+\.\d+\.\d+\.\d+).*?netmask', re.S)
            result = re.search(pattern, output)
            if result:
                ip = result.group(1)
                return ip

    def test_proxy(self, proxy):
        """
        测试代理
        :param proxy: 代理
        :return: 测试结果
        """
        try:
            response = requests.get(TEST_URL, proxies={
                'http': 'http://' + proxy,
                'https': 'https://' + proxy
            }, timeout=TEST_TIMEOUT)
            if response.status_code == 200:
                return True
        except (ConnectionError, ReadTimeout):
            return False

    def remove_proxy(self):
        """
        移除代理
        :return: None
        """
        redis = StrictRedis(host='xxx.xx.xx.x', port=26379, password='xxxxxx', db=0)
        redis.hdel('proxy', PROXY_KEY)
        print('Successfully Removed Proxy')

    def set_proxy(self, proxy):
        """
        设置代理
        :param proxy: 代理
        :return: None
        """
        rediscli = StrictRedis(host='xxx.xx.xx.x', port=26379, password='xxxxxx', db=0)
        if rediscli.hset('proxy', PROXY_KEY, proxy):
            print('Successfully Set Proxy', proxy)

    def adsl(self):
        """
        拨号主进程
        :return: None
        """
        while True:
            print('ADSL Start, Remove Proxy, Please wait')
            try:
                self.remove_proxy()
            except:
                pass
            (status, output) = subprocess.getstatusoutput(ADSL_BASH)
            if status == 0:
                print('ADSL Successfully')
                ip = self.get_ip()
                if ip:
                    print('Now IP', ip)
                    print('Testing Proxy, Please Wait')
                    proxy = '{ip}:{port}'.format(ip=ip, port=PROXY_PORT)
                    if self.test_proxy(proxy):
                        print('Valid Proxy')
                        self.set_proxy(proxy)
                        print('Sleeping')
                        time.sleep(ADSL_CYCLE)
                    else:
                        print('Invalid Proxy')
                else:
                    print('Get IP Failed, Re Dialing')
                    time.sleep(ADSL_ERROR_CYCLE)
            else:
                print('ADSL Failed, Please Check')
                time.sleep(ADSL_ERROR_CYCLE)

if __name__ == '__main__':
    sender = Sender()
    sender.adsl()

3.代理池中的代理检查

打开redsi可以看到对应的db中已经有相应的代理。

 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tianluling2012/article/details/87874043

智能推荐

android studio 用ndk开发生成.h(头文件)时,出现找不到类的错误的解决方案_android ndk 头文件导包失败_朱栋刚哈哈哈哈的博客-程序员秘密

NDK-JNI实战教程(一) 在Android Studio运行第一个NDK程序http://blog.csdn.NET/yanbober/article/details/45309049/ 博友的文章,另外也参考了这篇文章Javah生成JNI头文件出现找不到类的错误http://blog.csdn.net/microsoftwin32/article/details/9968085大概可以完成这

React项目搭建及环境配置_启动react项目必须有react环境吗_gqzydh的博客-程序员秘密

React 脚手架 create-react-app, 快速地进行构建使用 React 的项目开发,FaceBook 官方发布了一个无需配置的、用于快速构建开发环境的脚手架工具 `create-react-app`。

Linux系统中如何将jar包封装成服务_linux将jar包变成服务_IT美男子的博客-程序员秘密

前言我们发布项目一般用java -jar的方式去启动,这样其实很麻烦,而且还有窗口一直打开着,感觉很麻烦。因此我们可以把项目的jar包打包成一个对应的service服务,通过服务后台的方式去启动项目准备工作一台Linux服务器(我用的Centos7)一个打包好的可以运行的jar包服务封装登录服务器并切换到对应目录cd /etc/systemd/systemspringboot_demo为将要设置的服务名称,可根据当前项目名称来设置哟vi springboot_demo.service

单双号限行微信小程序源码_限行小程序源码_ms张张的博客-程序员秘密

限行查询和提醒微信小程序介绍小程序实现了各大城市车牌限行信息,比如单双号限行,区域限行,外地车牌限行等功能,并且可以添加车牌,进行单双号限行提醒安装教程克隆下载该小程序 用微信小程序工具导入 部署服务端,获取接口数据联系我们如果你需要任何帮助,可以联系我微信,如下是微信码微信号是:eeeeazy小程序客户端源码客户端源码小程序服务端源码服务端源码小程序效果图...

Windows进程大全_ggjucheng的博客-程序员秘密

 A——F absr.exe   进程文件: absr or absr.exe   进程名称: Backdoor.Autoupder Virus   描述: 这个进程是Backdoor.Autoupder后门病毒程序创建的。   是否为系统进程: 否   acrobat.exe   进程文件: acrobat or acrobat.exe   进程名称: Adobe Acrobat   描述:

Linux下的文件读写_ctxcl的博客-程序员秘密

一、系统调用应用程序(打开文件)-》各种库(标准库fopen)-》系统调用(open)-》内核(驱动)-》硬件(磁盘)。系统调用:内核提供给外界访问的接口函数,调用这些函数将使进程进入内核态。1、UNIX、Linux大部的系统功能都是功能是通过系统调用的方式提供的。2、这些系统调用被封装成了C函数的形式,但它们并不是C语言的一部分,也不是函数(它是通过向内核发"信号"的方式告诉内核,我要进...

随便推点

02-Vue.js环境准备-使用vue-cli快速搭建项目(cli2)_pick a test runner_光脚丫思考的博客-程序员秘密

一、概述在用Vue.js构建大型应用时,推荐使用npm安装,npm能很好的和webpack等打包工具配合使用。如果使用npm过程中安装速度过慢,可以考虑使用淘宝镜像的cnpm来代替npm。首先Vue的安装依赖于Node.js,要保证你的计算机上已经安装过Node.js。可以参考前面的文章:https://blog.csdn.net/GJYSK/article/details/108210708如何查看Node是否安装或者Node版本呢?进入cmd,输入命令:node -v,回车查看,node最好使

ELK搭建(filebeat、elasticsearch、logstash、kibana)_weixin_30846599的博客-程序员秘密

ELK部署(文章有点儿长,搭建时请到官网将tar包下载好,按步骤可以完成搭建使用)ELK指的是ElasticSearch、LogStash、Kibana三个开源工具LogStash是负责数据的收集和过滤处理ElasticSearch 是一个开源分布式搜索引擎,负责数据的存储、检索和分析Kibana 是提供可视化的页面,对数据进行可视化预览首先前提安装好java环境,jav...

Python 基础语法-Python 基础教程_python里面多行显示_mengy7762的博客-程序员秘密

Python 基础语法Python 语言与 Perl,C 和 Java 等语言有许多相似之处。但是,也存在一些差异。在本章中我们将来学习 Python 的基础语法,让你快速学会 Python 编程。第一个 Python 程序交互式编程交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码。linux上你只需要在命令行中输入 Python 命令即可启动交互式编程,提示窗口如下:$ pythonPython 2.7.6 (default, Sep  9

Windows环境安装Scrapy框架步骤 -详细总结自己安装经验_pypiwin32-223-py3-none-any.whl_俊晗的博客-程序员秘密

首先,第一步安装:Scrapy最简单的方法安装1.安装Scrapypip install scrapy如果命令安装,提示 Failed building wheel for TwistedMicrosoft Visual C++ 14.0 is required...解决问题的过程总结如下:分别安装: wheel,Twisted 18.0,lxml 3.4,pyOpen...

R语言机器学习 趋势分析 SMA EMA_r语言 ema_Mrrunsen的博客-程序员秘密

对于同时存在趋势、周期、波动成分的时间序列曲线,直接分析其趋势特性显然是不合适的。在R语言中,通过使用TTR包中的SMA和EMA函数,来对时序数据进行平滑处理,从而提取时序数据的趋势成分。

Industrial Society and its Future_石小泉的博客-程序员秘密

Industrial Society and its Future(Manifesto of FC–the Unabomber)get 1st part of manifesto get 2st part of manifestoINTRODUCTIONThe Industrial Revolution and its consequences have been a d