简单的多进程OpenVPN前端控制程序
来源:互联网 发布:考勤机采集数据超时 编辑:程序博客网 时间:2024/06/05 02:24
不管你有多么强劲的多核心处理器,单进程的OpenVPN都是始终如一的坚守在单独的一个核心上,其它的处理器核心干着急却帮不上什么忙。由于流量的不确定性,OpenVPN不知道按照什么粒度去支持多处理器,因此利用多核处理器的任务就交给了外部,当然使用xinetd是可以的,OpenVPN本身也支持xinetd,然而它对UDP的fork分发支持的却不是那么好,而OpenVPN的建议协议却是UDP协议...
曾经在《点击打开链接动手写一个OpenVPN的wrapper来优化OpenVPN性能》里面提到了一个包装器,本文就是该包装器的一个实现。这是一个超级简单的实现,预先启动N个OpenVPN实例,然后按照端口轮转的方式去为客户端分配一个实例让其连接。实际上完全可以实现一个每客户端(每隧道)一个实例的方式,在客户端连接的当时去启动一个OpenVPN服务器端,这种方式的背后的想法在于,我深信内核的调度比OpenVPN自己的调度做得好,仅考虑单核CPU,当有1000个客户端接入时,我宁可启动1000个OpenVPN进程让内核去调度,也不想让1000个客户端拥挤在一个服务端上让OpenVPN进程来调度!这样做的缺点在于不易管理,其实它太像xinetd的思想了,也和Apache的实现有些类似,只是它服务于第三层的VPN,而不是第七层的应用协议,对于管理,这无疑增加了难度,特别是虚拟网段的管理以及客户端互通(client-to-client)上。这个包装器使用python编写,服务器端代码如下:
客户端代码如下:
这只是一个框架,为了实现多个OpenVPN进程看起来像是一个,也为了更好的统一在多个实例上获取一份单一的客户端信息,可能需要动用共享内存技术,多个实例共享一块内存,将客户端信息(即管理接口导出的那一堆信息)写在那块共享内存中即可。
曾经在《点击打开链接动手写一个OpenVPN的wrapper来优化OpenVPN性能》里面提到了一个包装器,本文就是该包装器的一个实现。这是一个超级简单的实现,预先启动N个OpenVPN实例,然后按照端口轮转的方式去为客户端分配一个实例让其连接。实际上完全可以实现一个每客户端(每隧道)一个实例的方式,在客户端连接的当时去启动一个OpenVPN服务器端,这种方式的背后的想法在于,我深信内核的调度比OpenVPN自己的调度做得好,仅考虑单核CPU,当有1000个客户端接入时,我宁可启动1000个OpenVPN进程让内核去调度,也不想让1000个客户端拥挤在一个服务端上让OpenVPN进程来调度!这样做的缺点在于不易管理,其实它太像xinetd的思想了,也和Apache的实现有些类似,只是它服务于第三层的VPN,而不是第七层的应用协议,对于管理,这无疑增加了难度,特别是虚拟网段的管理以及客户端互通(client-to-client)上。这个包装器使用python编写,服务器端代码如下:
#!/usr/bin/python#coding=gbkif __name__ == '__main__': import socket import os sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('0.0.0.0', 61195)) sock.listen(1024) # 起始端口 minport = 6119 # 结束端口 maxport = 6125 # 起始虚拟IP地址分量 minsubnet = 0 currport = minport # 启动(maxport-minport)个OpenVPN实例,侦听不同的端口,分配不同的地址段 while currport <= maxport: cmd = 'openvpn --config server.conf --port %s --server 12.%s.0.0 255.255.0.0' % (currport, minsubnet) os.popen(cmd) print cmd currport = currport + 1 minsubnet = minsubnet + 1 currport = minport while True: connection,address = sock.accept() connection.settimeout(5) buf = connection.recv(1024) if buf == 'getport': # 按照轮转的方式为客户端分配OpenVPN实例 connection.send(str(currport)) currport = currport + 1 if currport > maxport: currport = minport connection.close()
客户端代码如下:
#!/usr/bin/python#coding=gbkif __name__ == '__main__': import socket import os sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('192.168.2.249', 61195)) # 请求连接端口 sock.send('getport') # 接收连接端口 port = sock.recv(1024) sock.close() # 根据服务器的建议,启动OpenVPN客户端实例 cmd = 'openvpn --config client.conf --remote 127.0.0.1 %s ' % (port) os.popen(cmd)
这只是一个框架,为了实现多个OpenVPN进程看起来像是一个,也为了更好的统一在多个实例上获取一份单一的客户端信息,可能需要动用共享内存技术,多个实例共享一块内存,将客户端信息(即管理接口导出的那一堆信息)写在那块共享内存中即可。
- 简单的多进程OpenVPN前端控制程序
- LINUX 进程控制程序设计
- Linux进程控制程序设计
- 基于Erlang实现的一个简单的并发控制程序
- 桥接多进程OpenVPN虚拟网卡解决多处理问题
- Wince在进程控制程序里的解决办法 error LNK2019错误解决办法
- Wince在进程控制程序里的解决办法 error LNK2019错误解决办法
- 多鼠标控制程序
- 控制程序的启动数量(限制游戏多开)
- linux学习笔记-进程控制程序设计
- 进程控制程序设计----------(Linux---C)
- Windows开发--控制程序运行单一进程
- OpenVPN客户端多处理器的支持
- OpenVPN多实例优化的思考过程
- 32位汇编语言学习笔记(28)--一个简单的光标控制程序
- 控制程序运行实例的个数
- WindowsXP音量控制程序的安装
- 【组件】控制程序的过期时间
- Android 容易混淆的属性Padding 与 margin,android:gravity与android:layout_gravity
- linux 套接字接口
- 中秋节
- awk与shell之间的变量互相传递方法
- unp实现回射服务器
- 简单的多进程OpenVPN前端控制程序
- android如何防止apk程序被反编译
- 生产者消费者问题
- 生产者消费者问题
- 桥接多进程OpenVPN虚拟网卡解决多处理问题
- SGU181_X-Sequence(暴力寻找循环节)
- Android编程编码规范
- cvCopy与cvCloneImage的区别
- android管理wifi