基于ZeroTier虚拟网络搭建分流策略及创建IPv6网络

news/2024/11/8 5:49:16/

假设无数个成员(移动设备、终端、Docker),需要劫持所有请求,并根据它们请求所访问的域名解析出IPv6或者IPv4地址来进行有效的选择性访问

说的直白一点点就是:分流策略

这里例一下需要做的工作,来看一下:

  1. 如何为所有成员设备分配IPv6的网络地址及IPv4地址?
  2. 如何有效的完成DNS解析及地址管理
  3. 如何有效的管理所有成员

1跟2在技术上看了资料也是可以用iptables来做转发,然后dnsmasq做DNS解析,最后ipset来做地址池,但是问题来了,所有的成员设备如何来有效的管理呢?如何去分配成员IPv6的网络地址呢?

所以ZeroTier one很好的解决了这个问题,它支持IPv4、IPv6的地址分配,并且有管理界面。虽然开源的功能不及官方的闭源版本,但是好在都是基于API的一个操作,后续二次开发新增一些功能以及优化的话也是很方便的

尽管它不支持DNS解析,但是可以找其他的应用比如Clash来替代。这样的话在访问一些网站的时候它会尝试IPv4根IPv6的地址进行访问,优先选择快的!

那选择了ZeroTier所以这篇文章主要还是记录分享一下如何创建IPv6的网络及相关服务搭建

安装ZeroTier控制器

  Key-networks开源的zerotier controller,提web管理UI, zntcui,功能与zerotier central官方一致。并且ztncui提供了容器化的部署方式,在实验中,通过容器部署在node上

git clone https://github.com/key-networks/ztncui-containerized
cd ztncui-containerized
sudo docker build -t ztncui .

开始运行它:

sudo docker run --rm --privileged=true -e HTTP_ALL_INTERFACES=yes --volume ztncui:/opt/key-networks/ztncui/etc/ --volume zt1:/var/lib/zerotier-one/ --name=ztcui -dp 9321:3000 --cap-add=NET_ADMIN -t ztncui

访问ztncui服务,服务器地址加9321端口:
在这里插入图片描述

创建IPv6网络

  首先需要一台服务器用来搭建网关,并且至少需要有/64的IPv6block,像Vultr就行,这边就拿Vultr做示范

ZeroTier本身是一个P2P组网的工具,很多人用它做内网穿透。因其本身支持IPv6自定义路由的功能跟巨多的可以使用的地址空间根本用不完

  1. 开始安装工具:
apt -y update
apt -y install curl sudo net-tools
apt -y install ndppd
  1. 修改内核参数,支持ipv6转发:
echo "net.ipv6.conf.default.forwarding = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.proxy_ndp = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.accept_ra = 2" >> /etc/sysctl.conf
sysctl -p

分配IPv6公网地址

设置地址自动分配池跟IPv6地址设置
在这里插入图片描述
选择v6AssignMode
在这里插入图片描述
勾选ZT rfc4193 (/128 for each device)和Auto-assign from IP Assignment Pool
在这里插入图片描述
设置2001工网地址的分配池,以便为之后的每个加入网络的成员分配一个ipv6公网地址

将Vultr那台网关服务器下的公网/80地址块作为分配池,如下图所示:
在这里插入图片描述
配置ipv6路由,设置服务器的zt+接口获得zerotier(RFC2419)地址,作为网关地址
::0/0. fdba:d2ea:2faf:223f:2199:93ec:2cc7:eef7

在这里插入图片描述
设置zt+的fd开头地址为ipv6的网关地址
在这里插入图片描述
设置2001开头的/80地址路由,只有设置了这个路由项,zt控制器才会给成员分配地址。(同时ipv6自动范围设定,并且从ipv6的地址范围池中自动分配ipv6地址勾选)
在这里插入图片描述
设置完毕后,ipv6的路由如下图:
在这里插入图片描述

创建ZeroTier-one客户端

  如果选择使用官方版本的话,注册账号就能使用了!并不需要自己去搭开源版本的服务,它们的区别有下面两点:

  官方版本UI比开源的做得功能全一些,设置网络分配的时候比较直观
  开源的版本需要自己搭建服务,而官方的直接注册账号就可以使用

现在服务搭建好了,我这里也测试了自己的机器、Dokcker容器等等加入到网络组中,首先在需要加入网络组成员的本地下载zerotier客户端服务:

  curl -s https://install.zerotier.com | sudo bash

使用zerotier-cli的交互命令行模式添加到网络组:
  zerotier-cli join 网络组ID

为了方便的话也可以去下载应用程序,这样的话更方便,因为它有一个Join Network点击输入你要添加的网络组ID就可以:
在这里插入图片描述

添加到网络组之后,我们在服务的UI管理界面可以看到新增设备成员,选择同意勾选上,这个时候它是不会给成员分配地址的。需要我们打开全局模式

命令行模式如下:

  zerotier-cli set 网络组ID allowGlobal=true

应用程序的话直接勾选就行,如下:
在这里插入图片描述
这个时候刷新一下ZT服务的管理界面,开源版本显得比较简洁。所有的操作也是基于API,可以看到所有的设备(移动设备、Docker容器、服务器等)加入到ZT的网络组当中会自动给它分配一个内网的IPv4虚拟地址及公网的IPv6地址
在这里插入图片描述
IPv4的虚拟地址可以相互通讯,也就是上面所有的成员都可以相互之间通讯。这也是它独具特色之处,实现了虚拟局域网的组建

而IPv6的地址也就是本次要讲得重点,当Docker容器下载了ZT服务之后加入到虚拟网络组内,使用ifconfig查看Docker容器中会出现一块ZT的网卡
在这里插入图片描述
可以看到这块ZT的网卡中有inet6的地址,IPv6地址它可以让你的容器访问所有支持IPv6网络的网站

但是如果没有做DNS解析规则的话,通过域名访问还是访问不了的,需要在/etc/hosts文件中加入对应的域名解析规则

这里记录一下比较重要的点,如果在Docker容器中部署的话,要创建IPv6网络及对应的支持有以下几个坑

首先,我们在启动Docker服务之前保证容器支持IPv6地址,打开 /etc/docker/daemon.json文件进行配置:

 {"ipv6": true}

然后进入到容器内安装ZT客户端服务

#install zerotier server
curl -s https://install.zerotier.com/ | sudo bash

这里有一个问题就是容器内拉完ZT客户端并不是自启动服务,需要手动把服务起来:

zerotier-one -d

这个时候检查一下容器中IPv6状态,默认的话都是关闭的|即为1

sysctl -a | grep ipv6 | grep disable

在这里插入图片描述
如果发现是关闭状态则激活:

sysctl net.ipv6.conf.all.disable_ipv6=0

然后加入ZT网络组,并通过zerotier的命令行模式设置allowGlobal

最后查看ifconfig,发现Docker容器中的ZT网卡已成功分配IPv6的地址
在这里插入图片描述

  好了,到这里又到了跟大家说再见的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章


http://www.ppmy.cn/news/77973.html

相关文章

计算机网络知识汇总(十万字超详细)

文章目录 1 计算机网络概述1.1 概念、组成、功能和分类1.2 标准化工作及相关组织1.3 速率相关的性能指标1.4 时延、时延带宽积、往返时间RTT、利用率1.5 分层结构、接口、协议、服务1.6 OSI参考模型1.7 TCP/IP与五层参考模型1.8 第一章知识大纲 2.物理层2.1 物理层基本概念2.2 …

Rocky Linux基础配置

任务一:windows脚本文件使用.(ps1) 复制物理机D:\soft\scriptswin的脚本文件复制虚拟机C:\根目录运行>./windows1.ps1将生成txt文档考的物理机上Linux脚本文件使用(.sh) 复制物理机D:\soft\scriptslin的脚本文件复制虚拟机/root目录下权限 #chmod 777 Linux1.sh运行 #./…

如何使用HTML、CSS和JavaScript来制作这两种类型的时钟

随着计算机技术的不断发展和普及,人们对于时间的精准度要求也越来越高。时钟作为我们日常生活必不可少的工具之一,也得到了越来越多的关注和研究。而在Web开发中,我们同样可以使用HTML、CSS和JavaScript的组合,制作出各式各样的时…

【初始scrapy框架下】——全栈开发——如桃花来

目录索引 Scrapy配置文件说明:第一部分:基本配置第二部分:并发与延迟第三部分:智能限速第四部分:爬取深度与爬取方式第五部分:中间件、Pipelines、扩展第六部分:缓存 DEBUG、INFO、WARN、ERROR、…

MySQL 中的 截断为指定位数 TRUNCATE、ROUND、FLOOR

1. 关于 MySQL 中的 TRUNCATE 函数 1.1 TRUNCATE 函数 TRUNCATE 函数用于将数字型数据截断为指定位数,常用于处理金额等数字列,以满足业务需求。语法如下: TRUNCATE(number, decimals) 其中,number 表示要截断的数字&#xff0…

2023-05-23 题目

1、在java中定义一个无参的构造方法的作用: 在java程序执行子类的构造方法之前,如果是没有super()来调用父类的特定的构造方法,则会调用父类中没有参数的构造方法。 如果java中没有定义无参的方法,且没有指定super()方法&#x…

MySQL主从同步(不开GTID)

一、背景 了解并熟悉MySQL的主从同步的搭建过程,并解决搭建过程中所碰到的问题。 二、目标 了解并熟悉MySQL的主从同步的搭建过程,并解决搭建过程中所碰到的问题。 IP地址MySQL版本主从关系192.168.3.2445.6.51Master192.168.3.2455.7.41Slaver192.16…

实时频谱-2.5DPX

数字荧光显示 “数字荧光”一词源自包在阴极射线管(CRT)上的荧光,电视机、计算机监视器和其它测试设备显示器都使用阴极射线管。在电子束激活荧光时,它会发出荧光,照亮电子流画出的路径。 尽管液晶显示器(LCD)之类的光栅扫描技术由于厚度和…