#!/usr/bin/env python # -*- coding: utf-8 -*- # 使用方法: # 1. 运行本script将成两个文件, vpnup和vpndown # 2. 执行 chmod a+x vpnup; chmod a+x vpndown 让文件变成可执行 # 3. 把这两个文件copy到openvpn客户端配置文件所在目录 # 4. 编辑openvpn客户端配置文件. 加上两行命令: up vpnup 和 down vpndown # 如果之前没有配置(服务端或者客户端)使用vpn server作为default gateway # 那么请在配置文件上加上一行 redirect-gateway. 最后保存, 重连openvpn # 注意: 最好在服务端使用 push 命令修改一下dns, 否则使用原有的dns也还是会被劫持的. # 如果不能控制服务器, 在客户端配置里也务必设置. import re import urllib url=r'http://ftp.apnic.net/apnic/dbase/data/country-ipv4.lst' VPNUPBASE=""" #!/bin/sh export PATH="/bin:/sbin:/usr/sbin:/usr/bin" PSID=$( (scutil | grep PrimaryService | sed -e 's/.*PrimaryService : //')<< EOF open get State:/Network/Global/IPv4 d.show quit EOF ) OLDGW=`netstat -nr | grep '^default' | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+.[0-9]\+'` if [ ! -e /tmp/openvpn_oldgw_${PSID} ]; then echo "${OLDGW}" > /tmp/openvpn_oldgw_${PSID} fi """ VPNDOWNBASE=""" #!/bin/sh export PATH="/bin:/sbin:/usr/sbin:/usr/bin" PSID=$( (scutil | grep PrimaryService | sed -e 's/.*PrimaryService : //')<< EOF open get State:/Network/Global/IPv4 d.show quit EOF ) if [ ! -e /tmp/openvpn_oldgw_${PSID} ]; then exit 0 fi ODLGW=`cat /tmp/openvpn_oldgw_${PSID}` """ handler=urllib.urlopen(url) upfile=open('vpnup','w') downfile=open('vpndown','w') upfile.write(VPNUPBASE) upfile.write('\n') downfile.write(VPNDOWNBASE) downfile.write('\n') for line in handler.readlines(): if line.find(': cn ') < 0: continue r=line.split(':')[1] r=r.strip() ip,mask=r.split('/') ip=ip.split('.') if len(ip) < 4: ip.append('0') #生成的脚本所用的route命令是针对mac osx的. linux下的大概会有所不同, 需要适当修改以下两句 upfile.write('route add %s/%s ${OLDGW}\n'%('.'.join(ip),mask)) downfile.write('route delete %s/%s ${OLDGW}\n'%('.'.join(ip),mask)) downfile.write('\n\nrm /tmp/openvpn_oldgw_${OLDGW}\n') upfile.close() downfile.close()