官方已发布version 2.x的版本,建议使用最新版本。本文配置已改为2.x的版本。
Linux下的隧道(打洞)软件非常多,大部分隧道软件建立成功之后,是创建了类似C/S架构的点对点的通信,也就是会有服务器和客户端的区别,下个设备再进来,也一样这样创建。
如果你需要创建类似zerotier这样的虚拟局域网,那么你就应该看看这个隧道软件,它是开源的,名字叫做vpncloud。
功能和优点,文档之类的,你们直接去看官网的说明好了:https://vpncloud.ddswd.de
它的原理跟MPLS、VXLAN差不多,vpncloud也是通过源MAC地址学习,将虚机的MAC和VTEP的IP地址关联,理论上也能支持多播(multicast),但是官方并没有特别说明多播,你得自己多测试一下。那么对我来说,MPLS、VXLAN、VPNCLOUD他们最大的优点是去中心化(decentralize)的虚拟组网,多个设备接入后,可以互相通信而不需要经过所谓的主服务器节点,这样就能符合虚拟局域网的需求。
有中心节点的隧道技术有:pptp、gre、ipsec/ike、gre over ipsec、ipip、openvpn、l2tp、wireguard、ocserv等等
去中心化节点的隧道技术有:n2n、zerotier、zeronet、vpncloud、tinc-vpn、freelan、nebula
——————– 分割线 ——————–
我已经在我的生产环境中用了接近两年,非常稳定。我需要把我的几个服务器/vps放在一个子网内,以规避一些问题。
比如我有一个应用场景是这样:
在公司有一个机柜,里面放着许多网络设备,有nas、voip、打印机、监控摄像等,但tm没有公网IP,在网关做端口映射毫无意义,只能接入虚拟局域网
然后在我家里,也有若干的设备,有时候也在家里办公,需要时时到公司的网段弄点什么东西的。
这时候我只需要把公司和家里连到一个局域网内,再做个路由表,我就可以把公司和家里的所有设备都能组在一起
——————– 分割线 ——————–
另外一个场景是web应用
我有一个用gitea搭建的服务,服务器放在公司机柜,没有公网IP。。。所以我把它加入到虚拟局域网
然后我用的阿里云国内ecs,也加入到虚拟局域网了。gitea我们用的时候除了需要用到https,也需要ssh这种方式,所以这时候就可以直接端口转发到这个隧道IP上
——————–——————– 大分割线 ——————–——————–
说了那么多,直接分享安装步骤吧
我平时只玩ubuntu,所以其他发行版你们有兴趣自己折腾,官网也有说明。其实也可以直接去github下载对应的cpu架构下的二进制包,也很简单。
ubuntu就简单了。直接apt安装即可。
$ wget https://github.com/dswd/vpncloud/releases/download/v2.2.0/vpncloud_2.2.0_amd64.deb
$ sudo dpkg -i vpncloud_2.2.0_amd64.deb
然后配置隧道,进入/etc/vpncloud/路径,里面有一个示例文件,单独创建一个,然后编辑
$ cd /etc/vpncloud
$ sudo touch private.net
$ sudo vim private.net
private.net的内容如下,我的环境里面有两台peers长期运行,用于维持源mac地址学习
listen: 3210
peers:
– 202.175.123.1:3210 #10.192.0.1
– 140.238.220.31:8080 #10.192.0.2crypto:
password: “eTBK6A37u9NUYQ4GPWpQSdNj4zsjcWMG” #自己生成一段密码
algorithms:
– “aes128”
– “aes256”
– “chacha20”ip: “10.192.0.100”
# ———- Advanced features ahead ———-
auto-claim: true
claims:
– 10.192.0.0/24#ifup: ~
#ifdown: ~device:
name: “vpncloud%d”
type: tap #支持tun、tap两种类型
fix-rp-filter: truemode: normal #tap模式默认是switch,tun模式默认是router。这里维持normal即可
port-forwarding: true
switch-timeout: 300
peer-timeout: 300
keepalive: 300user: “root”
group: “root”#beacon:
# store: ~
# load: ~
# interval: 3600
# password: “eTBK6A37u9NUYQ4GPWpQSdNj4zsjcWMG”#statsd:
# server: ~
# prefix: ~#pid-file: ~
#stats-file: ~#hook: ~
#hooks: {}
最后让vpncloud开机启动和运行
$ sudo systemctl enable vpncloud@private
$ sudo systemctl restart vpncloud@private
——————– 分割线 ——————–
经验分享
0. 每个节点的IP都需要在配置文件中配置,不会自动分配的。也就是ip: “10.192.0.100” 这行
1. 这个是udp的,或多或少会受到qos影响的。所有打洞软件中,udp效率应该是最高的,如果你想再套一层udp over tcp,我个人测试只会是更差的。
2. 配置文件中crypto默认是chacha20,可以保持默认,如果你的设备的CPU能硬解AES,可以尝试用aes256。新版本中会自动选择合适的加密方式
3. ping或测速什么,都是取决于你原来到目标服务器的延迟和速度有多少,和隧道没太大关系,网络该烂的还是烂。
4. 如果想要优化吞吐量,可以考虑把MTU加大,我自己目前设置的MTU是7000,用下来也是非常靠谱的,对比测试可以看官方的文档 https://vpncloud.ddswd.de/features/performance/,个人建议如果不是物理延迟很低,这个值还是1400比较好。还是得根据实际情况定。
5. 关于加密,这里有个地方是可以设置的,crypto:password,长度为32位,注意每一个节点都是一样的。
6. 我习惯在peers那里留两个长期稳定运行的节点,其他不重要的节点就没必要写在这个配置文件中了,有节点上线,会自动并入网络的。
——————– 分割线 ——————–
关于nat的问题
既然这是个虚拟组网的软件,那自然nat是不在话下的,你只需要在某个节点,把iptables转发打开,就跟你们常用的vpn那种设置一样。其他节点再整个策略路由,把ip整理好,直接走这个虚拟内网就好。
在落地节点上打开转发,对vpncloud的网段进行nat转发,并劫持一下dns查询吧。
$ sudo echo "1" > /proc/sys/net/ipv4/ip_forward
$ sudo iptables -t nat -A POSTROUTING -s 10.192.0.0/24 ! -d 10.192.0.0/24 -m comment --comment "vpncloud" -j MASQUERADE
$ sudo iptables -t nat -A PREROUTING -s 10.192.0.0/24 -p udp --dport 53 -j DNAT --to 8.8.8.8:53
$ sudo iptables -t nat -A PREROUTING -s 10.192.0.0/24 -p tcp --dport 53 -j DNAT --to 8.8.8.8:53
这样实现了什么?换句话说这可以怎么玩?
你可以在国内一个主机上做最简单的socks代理,分别把要代理的目标,通过策略路由导到不同的落地节点去。
祝大家玩的愉快。
看起来不错,准备试试