系统版本:Centos 7.x
1.安装软件
[root@www ~]# yum install -y ppp pptp pptp-setup
2.注册ppp_mppe kernel module
[root@www ~]# modprobe ppp_mppe
3.创建VPN连接
自定义连接名:vpn
PPTP Server:ip.ip.ip.ip
用户名:vpname
密码:123456
[root@www ~]# pptpsetup --create vpn --server ip.ip.ip.ip --username vpname --password 123456 --encrypt -- start # --create 表示创建的连接(VPN账号)名称 # --encrypt 表示该连接需要加密 # --start 表示创建完成后立即连接
4.配置VPN开启关闭脚本
[root@www ~]# cp /usr/share/doc/ppp-2.4.5/scripts/pon /usr/sbin/ [root@www ~]# cp /usr/share/doc/ppp-2.4.5/scripts/poff /usr/sbin/ [root@www ~]# chmod +x /usr/sbin/pon [root@www ~]# chmod +x /usr/sbin/poff
5.开启VPN连接
[root@www ~]# pon vpn
6.验证连接是否成功
[root@www ~]# ip a | grep ppp 96: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1496 qdisc pfifo_fast state UNKNOWN qlen 3 link/ppp inet 172.16.36.2 peer 172.16.36.1/32 scope global ppp0
如果上面命令没有任何返回,则说明连接失败了,可以查看/var/log/message文件查询错误原因
[root@www ~]# tailf /var/log/messages
(1)服务端不支持MPPE
若报错信息为:
[root@www ~]# MPPE required but peer negotiation failed
说明服务端不支持MPPE加密,pptpsetup时不需要使用–encrypt选项。可以修改/etc/ppp/peers/vpn文件,注释掉
[root@www ~]# #require-mppe-128
(2)客户端不支持MPPE
若报错信息为:
[root@www ~]# LCP terminated by peer (MPPE required but peer refused)
说明服务端要求MPPE加密,但是客户端不支持,pptpsetup时漏掉了–encrypt选项。修改/etc/ppp/peers/vpn文件添加一行
[root@www ~]# require-mppe-128
然后重启VPN连接
[root@www ~]# poff vpn [root@www ~]# pon vpn
7.配置默认路由,让全部流量都通过VPN
连接成功后,查看路由
[root@www ~]# route -n [root@localhost crontab]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.18.188.1 0.0.0.0 UG 0 0 0 eno1 38.95.236.211 172.18.188.1 255.255.255.255 UGH 0 0 0 eno1 103.65.181.107 172.18.188.1 255.255.255.255 UGH 0 0 0 eno1 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eno1 172.16.36.1 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0 172.18.188.0 0.0.0.0 255.255.255.0 U 0 0 0 eno1
会发现多了一个虚拟网口ppp0,注意这时候并没有真正的走vpn访问外网,可以通过ip138检查
[root@www ~]# curl http://1212.ip138.com/ic.asp *******您的IP是:[116.228.38.26] 来自:上海市闵行区******
这里还没有完,需要添加路由,让所有流量都走vpn访问外网,下面加一个默认路由:
[root@www ~]# route add -net 0.0.0.0 dev ppp0
再按上面命令poff/pon vpn 重启VPN
这时看到的情况如下:
[root@www ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 ppp0 0.0.0.0 172.18.188.1 0.0.0.0 UG 0 0 0 eno1 38.95.236.211 172.18.188.1 255.255.255.255 UGH 0 0 0 eno1 103.65.181.107 172.18.188.1 255.255.255.255 UGH 0 0 0 eno1 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eno1 172.16.36.1 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0 172.18.188.0 0.0.0.0 255.255.255.0 U 0 0 0 eno1
8.测试
[root@www ~]# curl http://1212.ip138.com/ic.asp *******您的IP是:[38.95.236.xxx] 来自:美国******
完成….
下面写了一个简单有点Bug的重启小程:
#!/usr/bin/python # -*- coding: utf-8 -*- import re import os import sys import time import urllib def restart_pptp() : os.popen("poff pma") print "关闭VPN完成" time.sleep(3) os.popen("pon pma") print "启动PPTP完成" time.sleep(6) vpn_status = os.popen('/sbin/ifconfig').read().find('ppp0') if -1 == vpn_status : return False #添加pptp路由,所有流量都走VPN cmd = '/sbin/route add -net 0.0.0.0 dev ppp0' out = os.popen(cmd).read().find('SIOCADDRT') if -1 == out : print "添加路由完成," + cmd + " " + str(out) else : print "添加路由失败,无法得到外网IP....." + cmd return False time.sleep(3) out = os.popen("route -n").read() print "当前路由情况" + str(out) return True def get_export_ip() : url = "http://1212.ip138.com/ic.asp" op = urllib.urlopen(url) html = op.read() op.close() text = re.findall(r'\[(.*)\]',html,re.S)[0] return "===========" + text print get_export_ip() running = restart_pptp() print get_export_ip() vpn_status = os.popen('/sbin/ifconfig').read().find('ppp0') if -1 == vpn_status or not running : print "VPN 已经退出...." else : print "VPN 正在运行...."