如何正确的使用动态VPS(Linux)自动更换IP

背景

现在越来越多的人开始玩网赚项目,蚂蚁再小也是肉,薅羊毛的羊毛党越来越多,一些网赚项目也越来越受欢迎,但是一般的网赚项目都是要求真实用户的,所以要想获得大量的真实ip,一种动态VPS就诞生了,动态VPS采用PPTP或者ADSL拨号的方式获取动态IP,不仅可以做到获取区域性IP,还可以混拨,也就是可以获取全国各地的IP地址,这样对于网赚项目来说就非常好了,轻松模拟出来各种地区IP,达到赚钱的目的。

博主最近接到一单,编写自动化拨号脚本,自动切换动态VPS的外网IP实现自动化网赚,今天就记录下动态VPS的配置以及使用的姿势。

机器

先看下机器的配置,客户给过来的机器,配置如下:

系统:Linux

内存:512M

CPU:单核(PS:博主好想去采购一批ARM单片机来做动态VPS啊,高收益低成本)

硬盘:10G

带宽:2M

由于客户一次性给过来的机器比较多,100多台VPS,配置大体上都差不多,但是各个机器之间的差距很大,比如有的机器只有一个网卡,有的机器有好几张网卡,有的机器装的是Centos 6有的是Centos7,有的已经配置好拨号程序了,有的啥也没有等等各种情况都存在。

配置

既然是要实现自动化拨号程序,自然是要先判断下拨号程序在不在,Linux的拨号程序使用的是 pppoe-start 命令,注意,在不同的Linux里面拨号程序可能不一样,有的版本使用的是adsl-start命令,我这里首先查看下系统的发行版本,使用如下命令

[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.1.1503 (Core)
看到返回了发行版本是centos 7.1,非常好,系统版本比较新,对脚本的支持也会更友好。

拨号命令pppoe-start在系统中已经自带了,所以这里咱们直接使用pppoe-setup设置我们的adsl拨号账号和密码,执行pppoe-setup命令后终端返回如下提示

Welcome to the PPPoE client setup.  First, I will run some checks on
your system to make sure the PPPoE client is installed properly...


LOGIN NAME

Enter your Login Name (default root): 
如果是第一次设置拨号会提示上面那种,如果之前有设置过,会提示是否覆盖之前的记录。

这里需要输入adsl账号,输入完之后回车,终端提示如下

INTERFACE

Enter the Ethernet interface connected to the PPPoE modem
For Solaris, this is likely to be something like /dev/hme0.
For Linux, it will be ethX, where 'X' is a number.
(default eth0): 
询问pppoe拨号使用的网卡是哪个,当前这台机器只有一个网卡,所以选择默认的就行,后面再说多网卡的情况。

输入回车自动选择默认网卡后终端返回如下提示

Do you want the link to come up on demand, or stay up continuously?
If you want it to come up on demand, enter the idle time in seconds
after which the link should be dropped.  If you want the link to
stay up permanently, enter 'no' (two letters, lower-case.)
NOTE: Demand-activated links do not interact well with dynamic IP
addresses.  You may have some problems with demand-activated links.
Enter the demand value (default no):

这个提示意思是询问是按需链接还是始终保持连接,这个选项咱们在路由器的拨号设置里面经常看到,一般选择始终连接,这里系统默认选择始终连接,所以直接回车就好。

接着提示是否需要设置DNS

DNS

Please enter the IP address of your ISP's primary DNS server.
If your ISP claims that 'the server will provide dynamic DNS addresses',
enter 'server' (all lower-case) here.
If you just press enter, I will assume you know what you are
doing and not modify your DNS setup.
Enter the DNS information here: 
这里咱们就不需要设置DNS了,使用自动获取DNS即可,直接回车,之后提示输入adsl的密码
PASSWORD

Please enter your Password:
和再次输入密码
Please re-enter your Password: 
然后会提示是否允许其他用户连接
USERCTRL

Please enter 'yes' (three letters, lower-case.) if you want to allow
normal user to start or stop DSL connection (default yes):
这里咱们不需要其他用户连接,所以输入no回车,接着提示防火墙设置
FIREWALLING

Please choose the firewall rules to use.  Note that these rules are
very basic.  You are strongly encouraged to use a more sophisticated
firewall setup; however, these will provide basic security.  If you
are running any servers on your machine, you must choose 'NONE' and
set up firewalling yourself.  Otherwise, the firewall rules will deny
access to all standard servers like Web, e-mail, ftp, etc.  If you
are using SSH, the rules will block outgoing SSH connections which
allocate a privileged source port.

The firewall choices are:
0 - NONE: This script will not set any firewall rules.  You are responsible
          for ensuring the security of your machine.  You are STRONGLY
          recommended to use some kind of firewall rules.
1 - STANDALONE: Appropriate for a basic stand-alone web-surfing workstation
2 - MASQUERADE: Appropriate for a machine acting as an Internet gateway
                for a LAN
Choose a type of firewall (0-2):
这里有三个选项,具体含义不多说,这里咱们不需要设置防火墙,输入0回车。

系统询问是否需要开机启动自动连接

Start this connection at boot time

Do you want to start this connection at boot time?
Please enter no or yes (default no):
输入yes回车设置成开机自动连接,最后系统展示刚刚的设置以及询问是否生成配置文件
** Summary of what you entered **

Ethernet Interface: eth0
User name:          adsluser
Activate-on-demand: No
DNS:                Do not adjust
Firewalling:        NONE
User Control:       no
Accept these settings and adjust configuration files (y/n)? 
输入y后回车整个adsl拨号就设置完成了,系统会给出一个提示
Adjusting /etc/sysconfig/network-scripts/ifcfg-ppp0
Adjusting /etc/ppp/chap-secrets and /etc/ppp/pap-secrets
  (But first backing it up to /etc/ppp/chap-secrets.bak)
  (But first backing it up to /etc/ppp/pap-secrets.bak)



Congratulations, it should be all set up!

Type '/sbin/ifup ppp0' to bring up your xDSL link and '/sbin/ifdown ppp0'
to bring it down.
Type '/sbin/pppoe-status /etc/sysconfig/network-scripts/ifcfg-ppp0'
to see the link status.
提示中写明了配置文件的位置以及基本的使用方法。

在整个拨号过程中咱们能用到的命令差不多只有三个,pppoe-start、pppoe-stop、pppoe-status,pppoe-status命令是查询adsl拨号的状态,自动化脚本需要通过这个命令查询是否拨号成功。

配置完成之后咱们就来测试下拨号是否成功,直接执行pppoe-start命令,稍等几秒钟,如果没有报错继续执行pppoe-status命令查询下是否拨号成功。

我这里系统返回如下

pppoe-status: Link is up and running on interface ppp0
3: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1480 qdisc pfifo_fast state UNKNOWN qlen 3
    link/ppp 
    inet 10.2.115.19 peer 10.2.254.254/32 scope global ppp0
       valid_lft forever preferred_lft forever
能正常获取到ip地址则为拨号成功,但是我这里的ip地址很明显是个内网地址,尝试ping baidu.com看下能不能连上外网,发现并不能连接外网
ping: unknown host www.baidu.com

问题

既然无法连接外网,那肯定是有问题了,先去看下拨号的配置文件

[root@localhost ~]# cat /etc/ppp/pap-secrets
# Secrets for authentication using PAP
# client	server	secret			IP addresses
"adsluser"	*	"123456"
[root@localhost ~]# cat /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client	server	secret			IP addresses
"adsluser"	*	"123456"

确认了adsl账号密码没有问题,执行ifconfig。系统返回如下

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.14.40  netmask 255.255.255.0  broadcast 192.168.14.255
        inet6 fe80::215:5dff:fe32:ce6b  prefixlen 64  scopeid 0x20<link>
        ether 00:15:5d:32:ce:6b  txqueuelen 1000  (Ethernet)
        RX packets 30860  bytes 4216610 (4.0 MiB)
        RX errors 0  dropped 10  overruns 0  frame 0
        TX packets 321  bytes 24455 (23.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 18  bytes 1778 (1.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 18  bytes 1778 (1.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1480
        inet 10.2.134.26  netmask 255.255.255.255  destination 10.2.254.254
        ppp  txqueuelen 3  (Point-to-Point Protocol)
        RX packets 10  bytes 102 (102.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8  bytes 59 (59.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

确认pppoe拨号是正常的,但是ip却显示内网ip,这个时候就要判断数据包走的是哪个接口了,eth0是直接连接到内网的网关,ppp0是连接的外网,如果数据包一直走内网,自然是不通的,怎么判断数据包走的哪个接口呢?使用route命令查看默认的路由表,系统返回

[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.14.234  0.0.0.0         UG    100    0        0 eth0
10.2.254.254    0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
192.168.14.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0
显示默认网关是192.168.14.234,明显走的是内网,这样数据包肯定是出不去的,所以需要修改一下接口设置,使用vi编辑下eth0接口的配置,系统返回
UUID=d1440e96-0020-4ceb-9407-a722fecb96de
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
TYPE=Ethernet
DEFROUTE=yes
IPV6INIT=yes
IPV4_FAILURE_FATAL=no
PEERDNS=yes
NAME=eth0

IPADDR=192.168.14.40
NETMASK=255.255.255.0
GATEWAY=192.168.14.234
DNS1=8.8.8.8
DNS2=4.4.4.4
可以看到 DEFROUTE=yes 这里设置成了默认路由,我将这里修改成no,保存然后修改ppp0接口的设置,系统返回
USERCTL=no
BOOTPROTO=dialup
NAME=DSLppp0
DEVICE=ppp0
TYPE=xDSL
ONBOOT=yes
PIDFILE=/var/run/pppoe-adsl.pid
FIREWALL=NONE
PING=.
PPPOE_TIMEOUT=80
LCP_FAILURE=3
LCP_INTERVAL=20
CLAMPMSS=1412
CONNECT_POLL=6
CONNECT_TIMEOUT=60
DEFROUTE=yes
SYNCHRONOUS=no
ETH=eth0
PROVIDER=DSLppp0
USER=adsluser
PEERDNS=no
DEMAND=no

这里的DEFROUTE选项已经设置为yes了,所以不需要修改,重启系统或者重启网卡后再次执行route命令,返回如下

[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         0.0.0.0         0.0.0.0         U     0      0        0 ppp0
10.2.254.254    0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
192.168.14.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0
默认接口已经修改成了ppp0,尝试ping www.baidu.com已经可以正常ping通
[root@localhost ~]# ping www.baidu.com
PING www.a.shifen.com (103.235.46.39) 56(84) bytes of data.
64 bytes from 103.235.46.39: icmp_seq=1 ttl=48 time=207 ms
64 bytes from 103.235.46.39: icmp_seq=2 ttl=48 time=214 ms
64 bytes from 103.235.46.39: icmp_seq=3 ttl=48 time=205 ms
64 bytes from 103.235.46.39: icmp_seq=4 ttl=48 time=205 ms
64 bytes from 103.235.46.39: icmp_seq=5 ttl=48 time=204 ms
64 bytes from 103.235.46.39: icmp_seq=7 ttl=48 time=203 ms
64 bytes from 103.235.46.39: icmp_seq=9 ttl=48 time=209 ms
64 bytes from 103.235.46.39: icmp_seq=10 ttl=48 time=202 ms
64 bytes from 103.235.46.39: icmp_seq=11 ttl=48 time=202 ms
64 bytes from 103.235.46.39: icmp_seq=12 ttl=48 time=202 ms

(PS:这个延迟我要给跪了)

如果觉得丢包严重或者网络不顺畅,可以尝试修改DNS为电信的114.114.114.114

至此,服务器已经能够正常的拨号连接外网了,接下来就是编写自动化换ip的脚本。

脚本

自动拨号的脚本写起来就很容易了,主要还是用到了subprocess这个库,用来执行系统的命令,下面贴出来代码

#!/usr/bin/env python
# coding=utf-8
# code by 92ez.com

import subprocess
import time
import sys
import re

reload(sys)
sys.setdefaultencoding('utf8')


def change_ip_for_vps():
    try:
        subprocess.Popen('pppoe-stop', shell=True, stdout=subprocess.PIPE)
        time.sleep(5)
        subprocess.Popen('pppoe-start', shell=True, stdout=subprocess.PIPE)
        time.sleep(5)
        pppoe_restart = subprocess.Popen('pppoe-status', shell=True, stdout=subprocess.PIPE)
        pppoe_restart.wait()
        pppoe_log = pppoe_restart.communicate()[0]
        adsl_ip = re.findall(r'inet (.+?) peer ', pppoe_log)[0]
        print '[*] New ip address : ' + adsl_ip
        return True
    except Exception, e:
        print e
        change_ip_for_vps()

if __name__ == '__main__':
    count = 1
    while True:
        print '[*] 第%s次拨号' % str(count)
        change_ip_for_vps()
        count += 1
测试代码里面用到了一些sleep来做延迟,实际操作中适当调整sleep的值来达到最优的效果。

效果

使用之前当然是要具备Python环境,下面是使用截图(循环拨号测试)

深度截图20170720160300.png - 大小: 113.43 KB - 尺寸: 422 x 634 - 点击打开新窗口浏览全图

注意

这里有几点需要额外注意:

首先,动态VPS服务器的性能比较差,毕竟价格便宜,一台机器3到20块,单核512M内存2M带宽用来挂机也足够,你很难想象你正在使用的机器是哪个年代从机房淘汰下来的,系统自带的软件老旧,不到万不得已,不要使用yum update 来更新系统软件,这个操作可能会耗费你大量的时间。

首次登录系统以后你可能会发现别人使用过的痕迹,所以第一件事就是修改ssh的登录密码,这种机器谁说的准呢。

第一次登录进去需要安装的软件还挺多,下面列出一下最基本的软件包:

如果你对vi不够熟的话最好安装下vim 使用 yum install vim -y 命令

当然,wget也是必备的软件,使用 yum install wget -y 命令

python升级到最新版本 yum install python-devel -y

如果您觉得文章有帮助到您,请到 https://www.92ez.com/index.php?action=show&id=23403 进行打赏/捐赠,谢谢!
如果您觉得文章有帮助到您,请 使劲戳这里 进行打赏/捐赠,谢谢!
本文链接:https://www.92ez.com/?action=show&id=23447
提示:技术文章有一定的时效性,请先确认是否适用你当前的系统环境。

上一篇: 为什么我的博客主要区域只有1240px宽度?
下一篇: Centos上跑Python爬虫遇到的一些问题

访客评论
目前还没有人评论,您发表点看法?
发表评论

评论内容 (必填):