既然有了一个OpenVPN的前端控制程序,那么就可以在一台机器上启动多个OpenVPN实例了,不同的客户端只要连接不同的实例就好。事实证明,这种方式可以完美利用多处理器的优势,比在OpenVPN内部实现的多进程或者多线程等多处理方式要好很多,这也是广义的KISS原则,也遵循了“每次做好一件事”的原则。
现在的关键问题是如何将这多个OpenVPN实例集合在一起作为一个整体。既然OpenVPN使用了更底层的虚拟网卡技术,那么做这件事的技术也和这些底层技术有关了,我试了下bridge方式,非常不错,bridge在Linux上的实现非常棒,工具也很齐全,不过一个brctl够了。方法是,将多个OpenVPN服务端实例的tap网卡bridge在一起,这样它们就可以共享一个IP地址了,也就可以使用同一个地址段了,剩下的事情,由bridge来完成吧!
我的bridge-multiVPN实现使用“预生成实例”的方式,也就是预先生成一组OpenVPN服务端实例,生成多少由CPU的个数决定,一般生成“CPU*2-2”个即可,我还是相信“操作系统的调度要比OpenVPN本身的调度做得好”...当然也可以使用“每客户端一例”的方式,不过那样对于管理不是很方便,具体也没有测试。
#!/usr/bin/python
#coding=gbk
import signal
import socket
import sys
import os
def signal_handler(signal, frame):
os.popen("goaway.sh")
sys.exit(0)
if __name__ == '__main__':
signal.signal(signal.SIGINT, signal_handler)
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 = 2
delta = 8
currport = minport
# 启动(maxport-minport)个OpenVPN实例,侦听不同的端口,分配不同的地址段
while currport <= maxport:
if currport == maxport:
cmd = "openvpn --config"\
" server.conf"\
" --up createBR.sh"\
" --port %s"\
" --ifconfig-pool 10.8.0.%s 10.8.0.%s 255.255.255.0"\
% (currport, minsubnet, minsubnet+delta)
else:
cmd = "/root/openvpn-ipv6/openvpn --config"\
" /root/openvpn-ipv6/server.conf"\
" --port %s"\
" --ifconfig-pool 10.8.0.%s 10.8.0.%s 255.255.255.0"\
% (currport, minsubnet, minsubnet+delta)
os.popen(cmd)
print cmd
currport = currport + 1
minsubnet = minsubnet + delta + 1
currport = minport
while True:
connection,address = sock.accept()
try:
connection.settimeout(5)
buf = connection.recv(1024)
if buf == 'getport':
# 按照轮转的方式为客户端分配OpenVPN实例
connection.send(str(currport))
currport = currport + 1
if currport > maxport:
currport = minport
except socket.timeout:
os.popen("goaway.sh")
print 'time out'
connection.close()
os.popen("goaway.sh")
最后一个OpenVPN的虚拟网卡启动的时候,调用createBR.sh,将所有的虚拟网卡和bridge联系起来:
#!/bin/bash
# 获取服务端的IP地址,实际只需要第一个,因为大家最终都一样
virtual_GW=$(ifconfig tap0|awk -F 'inet addr:' '/inet addr/{print $2}'|awk -F ' ' '{print $1}');
# 创建一个bridge
brctl addbr virtual_BR;
# 将各个虚拟网卡陆续添加到bridge
for virtual_interface in $(ifconfig |grep -o tap[0-9]);
do
brctl addif virtual_BR $virtual_interface;
# 清除已经有的地址
ifconfig $virtual_interface 0.0.0.0;
done;
# 将地址赋予bridge
ifconfig virtual_BR $virtual_GW up
类似的,清理程序goaway.sh:
killall -9 openvpn
ifconfig virtual_BR down
brctl delbr virtual_BR
服务端的配置文件:
daemon VPNS
script-security 2
mode server
tls-server
tls-cipher RC4-MD5
cipher BF-CBC
duplicate-cn
dev tap
proto udp
keepalive 10 60
# 配置本地的虚拟地址
ifconfig 10.8.0.1 255.255.255.0
local 0.0.0.0
# 留给server.py去设置,多个实例设置成不同的
;port 6119
verb 4
dh dh1024.pem.dh.confca CA.cer
cert A.pem
key A.key
客户端的前端程序:
#!/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 192.168.2.249 %s ' % (port)
os.popen(cmd)
分享到:
相关推荐
Windows11 装不了虚拟网卡,可能可以帮助您解决问题
Win10系统—VPN连接无法启动虚拟网卡任务.pdf
Tap-Windows Adapter 虚拟网卡 vpn 多联 神器
tap虚拟网卡驱动64位系统
这是将linux下的openvpn移植到windows下,可以在windows下实现基于ssl vpn功能.zip
python库。 资源全名:openvpn_status-0.1.1-py2.py3-none-any.whl
windows TAP虚拟网卡驱动及详细安装方法 无病毒,安装步骤很简单都在驱动文件夹内 windows TAP虚拟网卡驱动及详细安装方法 无病毒,安装步骤很简单都在驱动文件夹内
SoftEther虚拟网卡一个新的好软件
校园网inode使用过程中的配置以及连不上网的解决办法。
Use this to get a proxy on kali
里面有锐捷客户端,详细的使用说明和认证失败错误原因和解决办法,希望对大家有帮助
openvpn基础知识-详细笔记文档总结
Hillstone山石网科基础配置手册
OpenVpn TAP驱动程序池溢出 信用 )电报用户名: : 此漏洞已报告给OpenVpn。 成功利用此漏洞可以帮助攻击者绕过Windows中的驱动程序唱歌强制执行和加载未签名的恶意驱动程序。 OpenVpn Tap驱动程序使用...
用于建立vpn,windows的虚拟网卡。 什么是 TAP-windows? TAP-Windows 是一个网络驱动程序,用于在 Windows 上提供虚拟 Tap 设备功能。它是 OpenVPN 开源 VPN 解决方案的一个组件。 什么是虚拟 Tap 设备? 虚拟分路...
根据本人运维经验,结合openVPN社区相关案例,针对TAP-Windows-adapter安装失败“an error occured installing the TAP device driver”错误提示,提出五种解决方案
基于linux的+openvpn网络.pdf
本软件是一个模似网卡和集线器的工具,可以模似集线器功能,实现VPN的功能。使得系统把此软件识别成一块网卡,有了这个东西,只要可以访问外网,都可以连接到虚拟HUB上与其他电脑组成局域网,在此虚拟的局域...
与原版open-build-master相比,我做了稍稍修改,已经包含Open虚拟专网2.5源代码和依赖项源代码,需要VS2019、ActivePerl、WDK10,可以直接按照我写的教程进行编译,100%可编译。
简单管理openvpn3