BadVPN详解之--编译与运行

来源:互联网 发布:java入门培训费用 编辑:程序博客网 时间:2024/06/06 05:46

前言

还是要感谢穿皮鞋的经理,为我指示了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.131: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.129: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
显然是通了!抓包,当然是密文。然而你知道以上的输出是什么意思吗?你觉得数据会经由什么路径到达目的地呢?你觉得加密的密钥是如何来的呢?且听下回分解!
0 0