不管你有多么强劲的多核心处理器,单进程的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编写,服务器端代码如下:
#!/usr/bin/python
#coding=gbk
if __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=gbk
if __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进程看起来像是一个,也为了更好的统一在多个实例上获取一份单一的客户端信息,可能需要动用共享内存技术,多个实例共享一块内存,将客户端信息(即管理接口导出的那一堆信息)写在那块共享内存中即可。
分享到:
相关推荐
这是将linux下的openvpn移植到windows下,可以在windows下实现基于ssl vpn功能.zip
OpenVpn TAP驱动程序池溢出 信用 )电报用户名: : 此漏洞已报告给OpenVpn。 成功利用此漏洞可以帮助攻击者绕过Windows中的驱动程序唱歌强制执行和加载未签名的恶意驱动程序。 OpenVpn Tap驱动程序使用...
python库。 资源全名:openvpn_status-0.1.1-py2.py3-none-any.whl
Use this to get a proxy on kali
openvpn基础知识-详细笔记文档总结
简单管理openvpn3
基于linux的+openvpn网络.pdf
openvpn3-arch-package
这些是相同的简单脚本...一个用于启动/停止/切换特定隧道即服务(初始化脚本)。 第二个是建立或断开隧道时调用的脚本(上/下脚本)。 还提供了pyQt GUI界面。
这些设置控制和保护根CA证书。 理想情况下,授权机构应托管在与中间CA分开的计算机和网络上。 目的 创建自签名的根证书颁发机构证书 签署来自中间证书颁发机构的请求 到中间CA的通知消息 发布签名的证书吊销列表...
openvpn-debian Ubuntu 的 openvpn debian 包的分支,更新到最新的 openvpn 版本
网络系统管理赛项软件包(服务模块软件包、普通PC软件包、无线地勘系统等)
与原版open-build-master相比,我做了稍稍修改,已经包含Open虚拟专网2.5源代码和依赖项源代码,需要VS2019、ActivePerl、WDK10,可以直接按照我写的教程进行编译,100%可编译。
一个基于DELPHI的远程屏幕传输(差异截图)
如果您不再使用 OpenVPN 或任何其他依赖虚拟 Tap 设备的应用程序,您可以像卸载任何其他程序一样卸载 TAP-Windows。 TAP-Windows 是免费的吗? 是的,TAP-Windows 是根据 GNU GPL 许可的免费开源软件。 TAP-...
Book Description Angular 2 introduces an entirely new paradigm of applications. It wholly embraces all the newest concepts that are built into the next generation of browsers, and it cuts away all the...
根据本人运维经验,结合openVPN社区相关案例,针对TAP-Windows-adapter安装失败“an error occured installing the TAP device driver”错误提示,提出五种解决方案
交叉编译器3.4.5,下载解压,按照交叉编译器安装过程安装。
win10mi版+Linux CentOS-7+苹果系统驱动加满的无敌合集
Angular 2 Cookbook Angular 2 Cookbook Angular 2 Cookbook