一种VPN自动设置的解决方案
条评论将之前写过的一个小工具做了一些优化,开源出来。起了个没有任何意义的ppter。
ppter概述
为什么叫ppter
任性,没有意义,听着挺好听,嗯就这样。
项目地址: https://github.com/windanchaos/ppter
可用场景
多地办公,没有固定IP,需办公区对办公区建立VPN,办公区和阿里云建立VPN的场景。
能节省的费用就是两条固定IP的费用。拒我了解的一个固定IP的电信一年30万左右,移动的要10来万。对于小公司来说,一年还是能节约不少钱了。
市面上的其他解决方案,我并不太清楚,如果有更优的免费方案,欢迎告知。
文件说明
- aliapi.py 阿里云部分产品api的封装
- ConfigProvider.py 配置相关,读取config.ini转成需要的数据类型
- Jobs.py 运行的进程
- Dockerfile docker image镜像构建文件
- requirement 项目依赖
- config.ini 配置相关
- getDnsInfo.py 获取域名解析信息工具
- ppter_vpn.py vpn相关代码
- ppter_vps.py vps相关代码
- ppter_dns.py dns解析相关
工作原理
使用独立于办公区内部环境的阿里云(或其他共有云),部署redis作为ip交换媒介。
前置动作
- 修改正确的config.ini
- 修改正确vpn配置
具体参考下文。
容器安装
docker的安装和配置优化
其中user是可以操作docker的普通账户,换成自己的即可
1 | <!-- more --> |
监控程序启动操作
1 | 镜像打包 |
直接安装
使用的python3。
依赖安装
1 | sudo pip3 install redis request configparser base64 |
执行
不同环境独立执行:
1 | nohup python3 Jobs.py > log.log & |
程序会做以下动作:
- 5分钟定时获取一次外网IP地址,并同步到redis上
- 对比IP地址是否有变化,有就执行dns解析、阿里云ipes、本地路由vpn配置变更。ip地址包括本地ip变化和连接端的ip变动。A和B的IP任意变动都会触发本地路由vpn配置。
启动前需要修改的配置
config.ini的文件内容,大部分顾名思义。
Credentials
需要配置具有阿里云vps 、dns操作权限的id和secret。
域名解析的配置
[dns] 下的domain设置
一个{’RecordId’:’xxx’,’RR’:’record’}就是一条记录
用’|’符号作分隔符。多条记录:{’RecordId’:’4154842768102400’,’RR’:’recordA’}|{’RecordId’:’4154842768102400’,’RR’:’recordB’}
其中RR标识map.baidu.com 中的map。
按规则添加即可,删除也是
如何获取domain的recordId和RR(主机记录)?
1 | python3 getDnsInfo.py |
执行后会打印‘baidu.com’的所有解析信息。复制粘贴到json在线解析,找到需要的解析信息。
如果要换域名就修改getDnsInfo.py的内容。
vpn的设置
前三个参数是路由器的登录地址和账户密码。
redisLocalVpnName 是redis中IP地址的本地标识。
redisRemoteVpnName 是vpn连接远端的标识。
A、B环境的名字需要互换。
A环境的配置:
1 | redisLocalVpnName = A |
B环境的配置:
1 | redisLocalVpnName = B |
vpn 的配置数据这里没有做到配置文件中,在updata_vpn.py中修改vpn_data,默认vpn-config[0]是对阿里云的vpn设置。vpn-config[1:]之后的是本地对本地的设置。
这类数据可能不同路由器,值是不一样的。需要自己去抓包了解一下了。
VPS设置
不同环境名字区别开即可。
详细的配置在update_vps.py中,主要修改CreateVpnConnection参数。
1 | CreateVpnConnection = {'Action': 'CreateVpnConnection', 'RegionId': 'cn-hangzhou', |
网关的名字是设置的name取第二个字符(不含)之后的字符,比如现在name为tohzh,则对应网关名hzh。
Psk 要设置成自己定义的值。
特别注意,用户网关如果没有和ipsce关联,就不要提前设置,否则无法新建。
开源小总结
1、requests类库是个优秀的开发语言级别的“浏览器”库,基本上不用费神去操作cookies之类的,畅快的request就好;
2、程序持续运行,异常抛出后继续运行的机制设置对程序进程稳定性很重要,异常抛出一般接不住就用所有异常类父类:BaseException
3、学会了一项新的技能,在服务器上控制台上做调试。可参考这篇文章。
1 | python3 -m pdb test.py |
如果要简单说,下面wsn三个我用了比较实用。我在码代码过程中,遇到一个问题,始终不知道为什么在服务器上运行失败,而本地是ok的。调试后发现是配置文件没有换(服务器上是请求url有单引号,解析不出来)
w:(where)打印当前执行堆栈
s:(step)执行下一条命令
n:(next)执行下一条语句
4、docker是个好东西
5、扒拉一个系统的运行过程,才能结合自己的需求去做优化和修改。