BadVPN详解之--编译与运行

前言

还是要感谢穿皮鞋的经理,为我指示了tun2socks这条路,然则经理日理万机无暇挖掘这种纯技术的东西,只知道有这么回事就OK了,等到需要的时候,用上即可...但我等非经理就不同了,只能撸代码,撸原理。
       从tun2socks一路撸下来,就是BadVPN了。

0.什么是BadVPN

BadVPN是另一种VPN框架,和OpenVPN平级等同,但是我个人认为它要比OpenVPN更加优秀。OpenVPN能实现的,BadVPN几乎都能实现,重要的是,BadVPN是一种更加优雅的Client2client的VPN实现。
       具体套路如何,本文不细讲,本文的目标是先让BadVPN跑起来,至于原理什么的,留到下一篇文章里细说。

1.阅读文档

和往常一样,我首先google关于BadVPN的一切,很遗憾,资源很有限,baidu的结果更是扯。所以和OpenVPN以及BBR一样,又让我树立了标杆,我决定自己来写。当然在写之前,我还是要把现有的资料先读完。
       首先我阅读了它的全部文档:https://code.google.com/archive/p/badvpn/wikis
       从文档介绍中,我知道了BadVPN是一个控制与数据完全分离的VPN框架,这一点和OpenVPN完全不同,但这个并非本文的内容,而是下一篇文章的主题。本文是一个HowTo,旨在把BadVPN先跑起来。

2.下载源码

在资源有限的情况下,源码就是最好的资源,我当然会下载它,我用的是这个版本:https://github.com/ambrop72/badvpn
当然,我下载源码的目的不是去阅读它,而是去运行它。我把源码解压后放在了/root/badvpn/目录下。

3.编译源码

在我的CentOS机器上,我首先安装了BadVPN所依赖的nss,nspr以及cmake:
yum install nss-devel
yum install nspr-devel
yum install cmake

然后我开始编译BadVPN:
cmake /root/badvpn/badvpn-master -DBUILD_NOTHING_BY_DEFAULT=1 -DBUILD_TUN2SOCKS=1 -DBUILD_SERVER=1 -DBUILD_CLIENT=1
上面的cmake处理的含义是,编译tun2socks,badvpn-server,badvpn-client三个模块。
cd /root/badvpn/badvpn-master
make && make install

编译成功!

4.运行BadVPN

这里有详细的实例文档,我阅读并验证了它:https://code.google.com/archive/p/badvpn/wikis/Examples.wiki
       我准备用3台设备组网,1台设备作为服务端,2台设备为客户端。拓扑以及配置如下:

所以,我不得不在另外2台机器上重复上述的下载,编译的过程。以下我省略了生成证书的过程,详情参见Examples.wiki。

4.1.运行服务端

在设备1上运行:
badvpn-server --listen-addr 0.0.0.0:7000 --loglevel 4 --logger stdout  --ssl --nssdb sql:/home/vpnserver/nssdb --server-cert-name "vpnca"
以下是输出:
NOTICE(server): initializing BadVPN server 1.999.130
NOTICE(server): entering event loop
INFO(server): client 0 (192.168.44.131:55685): initialized
INFO(server): client 0 (192.168.44.131:55685) (peer-3): handshake complete
INFO(server): client 0 (192.168.44.131:55685) (peer-3): received hello
INFO(server): client 1 (192.168.44.129:40448): initialized
INFO(server): client 1 (192.168.44.129:40448) (peer-2): handshake complete
INFO(server): client 1 (192.168.44.129:40448) (peer-2): received hello
INFO(server): client 0 (192.168.44.131:55685) (peer-3): accepted 1
INFO(server): client 1 (192.168.44.129:40448) (peer-2): accepted 0

4.2.运行客户端

在设备2上运行:
tunctl -u root -t tap0
ifconfig tap0 10.10.10.131/24 up
badvpn-client --server-addr 192.168.44.100:7000 --transport-mode udp --encryption-mode none --hash-mode none --scope local1 --bind-addr 0.0.0.0:8000 --num-ports 30 --ext-addr 1.1.1.3:8000 local1 --tapdev tap0 --loglevel 4  --server-name "vpnca" --ssl --nssdb sql:/home/vpnclient/nssdb --client-cert-name "peer-3" --encryption-mode blowfish --hash-mode md5 --otp blowfish 3000 2000

以下是输出:
NOTICE(client): initializing BadVPN client 1.999.130
INFO(client): device MTU is 1514
NOTICE(client): entering event loop
NOTICE(ServerConnection): connected
INFO(client): server: ready, my ID is 0
...
在设备3上运行:
tunctl -u root -t tap0
ifconfig tap0 10.10.10.129/24 up
badvpn-client --server-addr 192.168.44.100:7000 --transport-mode udp --encryption-mode none --hash-mode none --scope local1 --bind-addr 0.0.0.0:8000 --num-ports 30 --ext-addr 1.1.1.1:8000 local1 --tapdev tap0 --loglevel 4  --server-name "vpnca" --ssl --nssdb sql:/home/vpnclient/nssdb --client-cert-name "peer-2" --encryption-mode blowfish --hash-mode md5 --otp blowfish 3000 2000

以下是输出:
NOTICE(client): initializing BadVPN client 1.999.130
INFO(client): device MTU is 1514
NOTICE(client): entering event loop
NOTICE(ServerConnection): connected
INFO(client): server: ready, my ID is 1
INFO(client): peer 0 (peer-3): initialized; talking to peer in SSL server mode
NOTICE(client): peer 0 (peer-3): bound to address number 0
INFO(client): peer 0 (peer-3): up
-----------------------------------------------
运行成功,无错误输出。

5.玩法

此时在设备2上执行一个ping,即ping设备3的tap0的地址:
ping 10.10.10.129
显然是通了!抓包,当然是密文。然而你知道以上的输出是什么意思吗?你觉得数据会经由什么路径到达目的地呢?你觉得加密的密钥是如何来的呢?且听下回分解!

时间: 2024-08-24 22:10:26

BadVPN详解之--编译与运行的相关文章

BadVPN详解之--组网原理剖析

这可能是第一篇关于BadVPN原理的中文介绍,所以我恪守职责,希望能将BadVPN的原理阐述清楚,而不仅仅是为了欺世盗名取天下之先. 序:格尔上市 这一段插在这里有点突兀,与BadVPN无关,只是我的一点实感,忽略即可.       明天小小要去厦门演出,今天是什么日子?是小小准备且出发的日子.但是同样在今天,也就是2017年4月21日(写完本文时估计已经到了22日...),上海格尔软件股份有限公司成功上市了.也许你不知道这个公司,确实这公司的业务是很小众,不像BAT布局那般宏大,但这并不意味着

实例详解:反编译Android APK,修改字节码后再回编译成APK

本文详细介绍了如何反编译一个未被混淆过的Android APK,修改smali字节码后,再回编译成APK并更新签名,使之可正常安装.破译后的apk无论输入什么样的用户名和密码都可以成功进入到第二个Activity. 有时难免要反编译一个APK,修改其中的若干关键判断点,然后再回编译成一个全新的可用的apk,这完全是可实现的.若要完成上述工作,需要以下工具,杂家后面会把下载链接也附上.这些软件截止本文发布时,经过杂家确认都是最新的版本. 1.APK-Multi-Toolv1.0.11.zip 用它

【转帖】windows命令行中java和javac、javap使用详解(java编译命令)

windows命令行中java和javac.javap使用详解(java编译命令) 更新时间:2014年03月23日 11:53:15   作者:    我要评论 http://www.jb51.net/article/48380.htm 学习一下java 最近重新复习了一下java基础,这里便讲讲对于一个类文件如何编译.运行.反编译的.也让自己加深一下印象 如题,首先我们在桌面,开始->运行->键入cmd 回车,进入windows命令行.进入如图所示的画面: 可知,当前默认目录为C盘User

bash数组和字符串处理、yum命令详解及编译安装

8月22号主要内容: 一.bash中的数组 二.bash中字符串处理 三.高级变量及配置用户环境 四.yum详解 五.编译安装 一.bash中的数组 1.数组的组成和申明 (1) 数组:存储多个元素的连续的内存空间,相当于多个变量的 集合. (2) 组成:数组名和索引 索引:编号从0开始,属于数值索引 注意:索引可支持使用自定义的格式,而不仅是数值格式 ,即为关联索引,bash4.0版本之后开始支持. bash的数组支持稀疏格式(索引不连续) (3) 申明数组: declare -a ARRAY

windows命令行中java和javac、javap使用详解(java编译命令)(转)

最近重新复习了一下java基础,这里便讲讲对于一个类文件如何编译.运行.反编译的.也让自己加深一下印象 如题,首先我们在桌面,开始->运行->键入cmd 回车,进入windows命令行.进入如图所示的画面: 可知,当前默认目录为C盘Users文件夹下的Administrator文件夹.一般而言,我们习惯改变当前目录.由于windows有磁盘分区,若要跳到其他磁盘,例如E盘,有几种方法: 1.输入命令: pushd 路径(此命令可将当前目录设为所希望的任一个已存在的路径) 2.输入命令: e: 

马哥教育第二十一天httpd高级配置详解、编译安装

1.httpd.conf配置文件                 ★设置默认字符集                         AddDefaultCharset ★CGI脚本路径                         ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"指定cgi路径别名                               bash写CGI脚本:                                  所有

windows命令行中java和javac、javap使用详解(java编译命令)

如题,首先我们在桌面,开始->运行->键入cmd 回车,进入windows命令行.进入如图所示的画面: 可知,当前默认目录为C盘Users文件夹下的Administrator文件夹.一般而言,我们习惯改变当前目录.由于windows有磁盘分区,若要跳到其他磁盘,例如E盘,有几种方法: 1.输入命令: pushd 路径(此命令可将当前目录设为所希望的任一个已存在的路径) 2.输入命令: e:  转移到e盘,然后再输入 cd 转移到所希望的已知路径. 如图: 希望在windows命令行下使用jav

BadVPN详解之--始记:透明socks代理与tun2socks

上周六晚上闲来无事跟以前的同事聊天,问之最近有没有接触到什么比较好玩的技术,答曰tun2socks.这个正合我的胃口,我所谓的好玩的技术是那种简单,有用的技术点或者技术框架,能在10分钟内领略其原理和思想,能在20分钟内跑起来,能在半天内彻底剖析它的结构,能在此后很久的时间受益无穷.OpenVPN就是这样的"好玩"的东西,网卡点灯也算,tun2socks是另一个,当然还有一个更好玩的,那就是BadVPN,我要在另外的文章中单独介绍.本文先来介绍tun2socks,它其实是BadVPN的

【转】Android编译系统详解(三)——编译流程详解

原文网址:http://www.cloudchou.com/android/post-276.html 本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接 1.概述 编译Android的第三步是使用mka命令进行编译,当然我们也可以使用make –j4,但是推荐使用mka命令.因为mka将自动计算-j选项的数字,让我们不用纠结这个数字到底是多少(这个数字其实就是所有cpu的核心数).在编译时我们可以带上我们需要编译的目标,假设你想生成recovery,那么使用mka recov