Categories
Networks

分享一个点对点隧道软件:vpncloud

隧道软件何其多,好用的个人感觉并不算多。盖因大部分隧道软件建立成功之后,是创建了类似C/S架构的点对点的通信,也就是会有服务器和客户端的区别,下个设备再进来,也一样这样创建。

如果你需要创建类似zerotier这样的虚拟局域网,那么你就应该看看这个隧道软件,它是开源的,名字叫做vpncloud。

功能和优点,文档之类的,你们直接去看官网的说明好了:https://vpncloud.ddswd.de

对我来说它的最大优点是去中心化(decentralize)的虚拟组网,多个设备接入后,可以互相通信(P2P)而不需要经过所谓的主服务器,这样就能符合虚拟局域网的需求。

有中心节点的隧道技术有:pptp、gre、ipsec/ike、gre over ipsec、ipip、openvpn、l2tp、wireguard、ocserv等等

去中心化节点的隧道技术有:n2n、zerotier、zeronet、vpncloud、tinc-vpn、freelan

——————– 分割线 ——————–

我已经在我的生产环境中用了接近两年,非常稳定。我需要把我的几个服务器/vps放在一个子网内,以规避一些问题。

比如我有一个应用场景是这样:

在公司有一个机柜,里面放着许多网络设备,有nas、voip、打印机、监控摄像等,但tm没有公网IP,在网关做端口映射毫无意义,只能接入虚拟局域网

然后在我家里,也有若干的设备,有时候也在家里办公,需要时时到公司的网段弄点什么东西的。

这时候我只需要把公司和家里连到一个局域网内,再做个路由表,我就可以把公司和家里的所有设备都能组在一起

——————– 分割线 ——————–

另外一个场景是web应用

我有一个用gitea搭建的服务,服务器放在公司机柜,没有公网IP。。。所以我把它加入到虚拟局域网

然后我用的阿里云国内ecs,也加入到虚拟局域网了。gitea我们用的时候除了需要用到https,也需要ssh这种方式,所以这时候就可以直接端口转发到这个隧道IP上

————————————- 大分割线 ————————————-

BB 那么多,直接分享安装步骤吧

我平时只玩ubuntu,所以其他发行版你们有兴趣自己折腾,官网也有说明。

ubuntu就简单了。直接apt安装即可。

$ echo “deb https://repo.ddswd.de/deb stable main” | sudo tee /etc/apt/sources.list.d/vpncloud.list
$ wget https://repo.ddswd.de/deb/public.key -qO – | sudo apt-key add
$ sudo apt update
$ sudo apt install vpncloud

然后配置隧道参数,进入/etc/vpncloud/路径,里面有一个示例文件,再单独创建一个,然后编辑

$ cd /etc/vpncloud
$ sudo touch private.net
$ sudo vim private.net

private.net的内容是

# each vpn running on their own port
port: 3210

# members of our private network
peers:
– 202.175.123.1:3210 #10.192.88.1
– 140.238.220.31:3210 #10.192.88.2

# timeouts
peer_timeout: 1800
dst_timeout: 300

# token that identifies the network and helps to distinguish from other networks
magic: “22e03358”

# pre shared key
shared_key: “eTBK6A37u9NUYQ4GPWpQSdNj4zsjcWMG”

# encryption
crypto: aes256

# device info
device_name: “vpncloud%d”
device_type: tap

# vpn modes: hub / switch / router / normal
mode: normal

# subnet to be used for our private network
subnets:
– 10.192.0.0/16

# command to setup the network
ifup: “ifconfig $IFNAME 10.192.88.1/16 mtu 1400”
ifdown: “ifconfig $IFNAME down”

# user/group owning the process
user: “root”
group: “root”

最后让vpncloud开机启动和运行

$ sudo systemctl enable vpncloud@private
$ sudo systemctl restart vpncloud@private

——————– 分割线 ——————–

经验分享

0. 每个节点的IP都需要在配置文件中配置,不会自动分配的。也就是ifup: “ifconfig $IFNAME 10.192.88.1/16 mtu 1400” 这行

1. 这个是udp的,或多或少会收到qos影响

2. 如果你的设备的CPU能硬解AES,那么在配置文件中crypto选择用aes256,否则用chacha20,所有连上来的节点都需要同样的加密方式

3. ping或测速什么,都是取决于你原来到目标服务器的延迟和速度有多少,和隧道没太大关系,网络该烂的还是烂。

4. 如果想要优化吞吐量,可以考虑把MTU加大,我自己目前设置的MTU是7000,用下来也是非常靠谱的,对比测试可以看官方的文档 https://vpncloud.ddswd.de/features/performance/

5. 关于加密,这里有两个地方可以设置的,一个是长度为4byte的magic,另外一个是预共享密钥shared_key,长度为32位,每一个节点都是一样的。

6. 我习惯在peers那里留两个长期稳定运行的节点,其他不重要的节点就没必要写在这个配置文件中了,有节点上线,会自动并入网络的。

——————– 分割线 ——————–

关于nat的问题

既然这是个虚拟组网的软件,那自然nat是不在话下的,你只需要在某个节点,把iptable转发打开,就跟你们常用的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/16 ! -d 10.192.0.0/16 -m comment –comment “vpncloud” -j MASQUERADE
$ sudo iptables -t nat -A PREROUTING -s 10.192.0.0/16 -p udp –dport 53 -j DNAT –to 8.8.8.8:53
$ sudo iptables -t nat -A PREROUTING -s 10.192.0.0/16 -p tcp –dport 53 -j DNAT –to 8.8.8.8:53

换句话说这可以怎么玩?

你可以在国内一个主机上做最简单的socks代理,分别把要代理的目标,通过策略路由导到不同的落地节点去。

策略路由在另外一个节点上做,如果不做策略会使整个机器的路由发生改变,生产环境慎用。

祝大家玩的愉快。

Leave a Reply

Your email address will not be published. Required fields are marked *