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

官方已发布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.2

crypto:
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: true

mode: normal #tap模式默认是switch,tun模式默认是router。这里维持normal即可

port-forwarding: true

switch-timeout: 300

peer-timeout: 300
keepalive: 300

user: “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代理,分别把要代理的目标,通过策略路由导到不同的落地节点去。

祝大家玩的愉快。

Comments

  1. zh
    3 years ago
    2021-10-15 9:51:47

    看起来不错,准备试试

Send Comment Edit Comment


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
Previous
Next