怎么使用动态拨号vps代理服务器搭建HTTP代理ip?今天小编给大家做个详细的教程:
关于动态拨号vps代理服务器搭建HTTP代理ip的流程分为以下几步:
第一步:购买动态拨号vps服务器;
第二步:连接动态拨号vps服务器,拨号成功后,安装必要的软件;
第三步:安装及启动TinyProxy搭建代理;
第四步:安装python/编写HTTP代理池脚本;
第五步:提取ip,测试,搭建完成,投入使用。
一,购买动态拨号vps代理服务器
首先,确认自己需要的动态拨号vps服务器类型:目前91vps提供有拨号vps服务器和动态ECS服务器二种,均包含有全国混播/单地区,然后在选择配置,目前91vps提供有4种类型的配置可供选择;最后确认购买,购买完成。(关于机器的选择,可根据自己的需求来,如不清楚,可联系91vps在线客服:800193021咨询推荐)
点击直达:91vps动态拨号vps服务器购买地址
二 远程连接拨号vps服务器,并调试成功
这里就不多做介绍了,需要强调一点的是,搭建http代理,必须使用liunx系统连接,所以,这个直接提供liunx系统连接的详细教程:
点击查看:动态拨号vps服务器lunix使用教程
三 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中已经有相应的代理。