返回

OpenZiti环境搭建与功能测试

环境搭建

本地-No Docker

搭建网络

  1. 安装依赖
1
sudo apt-get install tar hostname jq curl
  1. 下载OpenZiti 二进制文件并解压缩到~/.ziti/quickstart/$(hostname -s)
1
source /dev/stdin <<< "$(wget -qO- https://get.openziti.io/ziti-cli-functions.sh)"; expressInstall

如果之前成功运行过 expressInstall,则跳过第二步;若之前运行失败想重新运行的话,执行下面命令

1
2
rm -rI "${ZITI_HOME}"  # probably a sub-directory of ~/.ziti/quickstart/ 
unsetZitiEnv

  1. 启动控制器
1
startController
  1. 查看控制器的侦听地址和端口:此值默认为: $(hostname -s):1280
1
echo ${ZITI_CTRL_EDGE_ADVERTISED_ADDRESS}:${ZITI_CTRL_EDGE_ADVERTISED_PORT}
  1. 验证控制器是否可用
1
curl -sk "https://${ZITI_CTRL_EDGE_ADVERTISED_ADDRESS}:${ZITI_CTRL_EDGE_ADVERTISED_PORT}"
  1. 启动edge路由器
1
startRouter
  1. 查看路由器的侦听地址和端口:此值默认为: $(hostname -s):3022
1
echo $ZITI_ROUTER_ADVERTISED_ADDRESS:$ZITI_ROUTER_PORT
  1. 关闭控制器和路由器
1
2
stopRouter
stopController

测试网络

  1. 启动网络
1
2
startController
startRouter
  1. 使用 ziti CLI 登录到网络
1
zitiLogin
  1. 查看边缘路由器是否在线
1
"${ZITI_BIN_DIR-}/ziti" edge list edge-routers
  1. 运行 first-service 教程:此教程创建和运行了一个简单的 echo 服务
1
"${ZITI_BIN_DIR-}/ziti" demo first-service

本地-Docker Compose

安装docker

  1. 卸载原有docker
1
sudo apt-get remove docker docker-engine docker.io contained runc
  • docker: Docker 的主要软件包。
  • docker-engine: Docker 引擎,也是 Docker 的核心组件之一。
  • docker.io: 在某些系统上,docker.io 是 Docker 的软件包名称。
  • containerd: Docker 的核心容器运行时组件之一,负责管理容器的生命周期。
  • runc: Docker 使用的标准容器运行时,用于在容器中运行应用程序。
  1. 更新并升级包
1
2
sudo apt-get update
sudo apt-get upgrade
  • update 命令用于从软件源更新本地软件包列表,但不会安装或升级任何软件包
  • upgrade 命令用于安装所有可用软件包的最新版本,它会检查系统中已安装软件包的可用更新,并进行升级操作
  1. 安装一些必要的软件包,以便进行安全的软件包下载和通信
1
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent
  • apt-transport-https:允许 apt 工具通过 HTTPS 协议下载软件包。
  • ca-certificates:包含了用于验证 SSL/TLS 连接的各种证书颁发机构的根证书。
  • curl:是一个命令行工具,用于通过 URL 进行数据传输,支持多种协议,包括 HTTP、HTTPS、FTP 等。
  • gnupg-agent:用于管理 GnuPG(GNU 隐私卫士)密钥,确保安全通信和软件包的验证。
  1. 下载 Docker 官方的 GPG 密钥,并将其保存到指定的路径 /usr/share/keyrings/docker-archive-keyring.gpg
1
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  1. 将 Docker 官方的 GPG 密钥添加到系统的 apt 的密钥环境中,以便系统验证从 Docker 软件源下载的软件包的真实性
1
sudo apt-key add /usr/share/keyrings/docker-archive-keyring.gpg
  1. 将 Docker 的软件源添加到 Ubuntu 系统的 apt 软件包管理器中
1
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu/ $(lsb_release -cs) stable"

W: https://mirrors.aliyun.com/docker-ce/linux/ubuntu/dists/jammy/InRelease: 密钥存储在过时的 trusted.gpg 密钥环中(/etc/apt/trusted.gpg),请参见 apt-key(8) 的 DEPRECATION 一节以了解详情。

解决:

1
2
cd /etc/apt
sudo cp trusted.gpg trusted.gpg.d
  1. 安装 Docker Engine-Community
1
sudo apt-get install docker-ce docker-ce-cli containerd.io
  • docker-ce: 这是 Docker 社区版的主要软件包,包含 Docker 引擎和相关工具。docker-ce 是 Docker Community Edition 的缩写
  • docker-ce-cli: 这是 Docker 社区版的客户端软件包,提供了 docker 命令行工具,用于与 Docker 引擎进行交互
  • containerd.io: 这是 Docker 使用的容器运行时软件包,用于管理容器的生命周期,包括创建、运行、停止和删除容器等操作
  1. 验证docker安装是否成功
1
docker version

  1. 可以看到,最后会不显示Server,提示权限不够,而且执行docker命令前必须加sudo。因此,将当前用户添加到 docker 用户组中,使得该用户能够运行 docker 命令,不需要使用 sudo 或者管理员权限
1
sudo usermod -aG docker $(whoami)
  1. 重启系统后执行docker version命令验证是否加入成功,显示Server就说明加入成功

  1. 设置docker服务开机自启动
1
sudo systemctl enable docker
  1. 验证docker compose安装是否成功
1
docker compose version

搭建网络

  1. 从ziti存储库中下载 docker-compose.yml 文件和.env环境文件
1
2
curl -so docker-compose.yaml https://get.openziti.io/dock/docker-compose.yml
curl -so .env https://get.openziti.io/dock/.env
  1. 打开 Docker 的配置文件 daemon.json
1
sudo gedit /etc/docker/daemon.json
  1. 修改docker镜像源
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
{
    "registry-mirrors": [
        "https://registry.docker-cn.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://hub-mirror.c.163.com",
        "https://mirror.baidubce.com",
        "https://docker.m.daocloud.io",
        "https://dockerproxy.com",
        "https://ccr.ccs.tencentyun.com",
        "https://docker.nju.edu.cn",
        "https://atomhub.openatom.cn",
        "https://docker.mirrors.aster.edu.pl",
        "https://public.ecr.aws",
        "https://ghcr.io"
    ]
}
  1. 保存配置文件并重启 Docker 服务
1
2
sudo systemctl daemon-reload
sudo systemctl restart docker
  1. 运行网络:启动 Docker Compose 项目,并指定项目名称为 docker
1
docker compose --project-name docker up -d

若想看到控制台打印日志输出,则删除-d,输出包括:创建环境组件、设置环境变量、生成身份、注册各种身份和服务等

  1. 关闭网络
1
docker compose --project-name docker down -v

网络概述

docker-compose-overview.svg

有三个网络:

  • 蓝色网络:蓝色网络包含两个重要资产, ziti-private-blue 路由器和 web-test-blue 服务器。除了这些资产外,网络还包含 ziti-fabric-router-br 。虽然 web-test-blue 服务器默认导出一个端口(本地主机上的端口 80 将转换为 web-test-blue 服务器上的端口 8000),但可以使用 Ziti 访问此服务器,而无需导出端口。
  • 红色网络:红色网络目前仅用于演示。红色网络内除了ziti-private-red 路由器和 ziti-fabric-router-br 外没有任何东西可以访问。这将是放置自己的资产并使用 Ziti 进行探索的好地方。
  • 紫色“逻辑”网络:compose 文件中没有名为“purple”的 docker 网络,它完全是一个逻辑构造,只是为了清楚起见而显示。紫色网络中的所有资产都在蓝色和红色的 docker 网络中(这就是为什么它被称为紫色)。紫色网络中的资产需要同时位于红色和蓝色网络中,因为位于蓝色和红色网络中的资产需要与公共边缘路由器通信,并且还需要与控制器通信。

存在 ziti-fabric-router-br 是为了说明可以创建不一定是完全公开的边缘路由器。这是唯一可以与所有其他路由器通信的路由器。如果算法指示它是最快的路径,Ziti 网状网络可能会选择使用此路由器。

测试网络

  1. 进入控制器所在docker容器:一旦进入到控制器后, ziti CLI 将添加到 PATH 中,还有 zitiLogin 别名,使得可以轻松地向 Ziti 控制器进行身份验证
1
docker exec -it docker-ziti-controller-1 bash

  1. 进行身份验证
1
zitiLogin

  1. 查看边缘路由器是否都在线
1
ziti edge list edge-routers

  1. 查看边缘路由器的身份:在compose文件中有一个脚本为每个边缘路由器添加了一个身份
1
ziti edge list identities

  1. 测试网络连接:控制器应该能够使用底层网络联系红色和蓝色边缘路由器
1
2
ping ziti-private-red -c 1
ping ziti-private-blue -c 1

  1. 退出控制器所在容器
1
exit
  1. 进入蓝色专用路由器所在容器
1
docker exec -it docker-ziti-private-blue-1 bash
  1. 测试蓝色专用路由器能否连接到专用红色路由器
1
ping ziti-private-red -c 1

正常应该是连接不到,显示未知主机;但是我这不知道为什么连接到了

  1. 测试蓝色专用路由器能否连接到 web-test-blue 服务器
1
curl http://web-test-blue:8000

  1. 也可以从本地计算机上的 80 端口访问它
1
curl http://localhost:80

功能测试

零信任主机访问

零信任主机访问不将 OpenZiti SDK 集成到应用程序源代码中,仅在“客户端”和“服务器”上安装 OpenZiti 隧道器,使用隧道器实现对服务的访问。

解决方案概述

下面将演示如何使用 OpenZiti 成功部署和保护现有的“棕色领域”(brown field)应用程序。

**使用 Ziti 之前的 HTTP **

before OpenZiti

此图的 HTTP 服务器是在底层网络上配置的,并且需要通过防火墙开一个洞才能允许客户端连接。

使用 Ziti 之后的 HTTP

after OpenZiti

在使用 OpenZiti 之后,可以看到不再有开放的防火墙允许访问 HTTP 服务器。HTTP 客户端的网络请求将被 OpenZiti 隧道程序拦截。一旦被截获,数据包就会被传送到OpenZiti overlay fabric,该结构负责将截获的数据包传送到目标身份。在此示例中,一旦传送到目标身份,流量将卸载回底层网络,以发送到最终目的地:HTTP 服务器。

先决条件

  1. 启动 OpenZiti 网络
1
docker compose --project-name docker up -d
  1. 进入控制器所在容器(可选):修改证书有效时长,便于测试,修改完成后重启网络
1
2
docker exec -it docker-ziti-controller-1 bash
vi ziti-controller.yaml

  1. 启动HTTP服务器,此处直接使用上文的环境搭建中的 HTTP 服务器,在启动 OpenZiti 网络时已经启动该HTTP服务器
  2. 安装HTTP客户端隧道程序:下载 OpenZiti TUN安装脚本并执行
1
curl -sSLf https://get.openziti.io/tun/scripts/install-ubuntu.bash | bash

  1. 启动客户端隧道程序
1
sudo systemctl enable --now ziti-edge-tunnel.service

  1. 安装HTTP服务端隧道程序:此处直接使用上文docker compose环境搭建中的ziti-private-blue,它已经被配置为服务端隧道器,不需要部署额外的隧道器和创建标识
  2. 下载zitiCLI工具并添加到path中:直接使用上文no docker环境搭建中下载的zitiCLI工具和.env文件完成配置
1
source ~/.ziti/quickstart/$(hostname -s)/$(hostname -s).env

配置网络

  1. 进入控制器
1
docker exec -it docker-ziti-controller-1 bash
  1. 登录
1
zitiLogin

  1. 为 HTTP 客户端创建http-client身份并分配属性http-clients:在授权客户端访问 HTTP 服务时,使用此属性
1
ziti edge create identity user http-client -a 'http-clients' -o http.client.jwt

  1. 为 HTTP 服务端创建身份,此处服务端使用启用了隧道选项的边缘路由器作为隧道,故跳过此步骤
  2. 注册客户端流量拦截器配置:创建 intercept.v1 配置,该配置用于指示客户端隧道器如何正确拦截目标流量并将其放到叠加网络上
1
ziti edge create config http.intercept.v1 intercept.v1 '{"protocols":["tcp"],"addresses":["http.ziti"], "portRanges":[{"low":80, "high":80}]}'

  1. 注册服务端host配置:创建 host.v1 配置,该配置用于指示服务端隧道器如何将流量从覆盖层卸载回底层
1
2
3
4
5
6
7
# 请确保此处使用的端口正确无误。例如,在docker容器内运行时${http_server}变量很可能会被设置为 web.test.blue,而且容器内的http服务器端口监听的是 8000,而不是 80。请注意端口,确保 ${http_server}:port可以从${http_server_id}到达。

# 模板 
ziti edge create config http.host.v1 host.v1 '{"protocol":"tcp", "address":"'"${http_server}"'", "port":80}'

# 此次使用
ziti edge create config http.host.v1 host.v1 '{"protocol":"tcp", "address":"web-test-blue", "port":8000}'

  1. 创建服务:创建一个服务,将创建的客户端和服务端隧道配置关联到一个服务中。
1
ziti edge create service http.svc --configs http.intercept.v1,http.host.v1

  1. 创建服务策略:授权“HTTP 客户端”“拨号”代表 HTTP 服务器的服务
1
ziti edge create service-policy http.policy.dial Dial --service-roles "@http.svc" --identity-roles '#http-clients'

  1. 创建服务策略:授权“HTTP 服务器”“绑定”表示 HTTP 服务器的服务
1
2
3
4
5
# 其中变量${http_server_id}在此处为ziti-private-blue
# 模板
ziti edge create service-policy http.policy.bind Bind --service-roles '@http.svc' --identity-roles "@${http_server_id}"
#此处使用
ziti edge create service-policy http.policy.bind Bind --service-roles '@http.svc' --identity-roles "@ziti-private-blue"

  1. 使用 HTTP 服务器身份启动服务器端隧道程序,从而提供对 HTTP 服务器的访问:由于使用上文docker compose环境搭建中的ziti-private-blue作为服务端隧道器,它已启动,故跳过此步骤
  2. 使用 HTTP 客户端身份启动客户端隧道程序
1
2
3
4
5
6
# 打开一个新终端/新机器,将client的身份文件从docker中复制到本地
docker cp docker-ziti-controller-1:/persistent/http.client.jwt /home/$(whoami)/openziti/quickstart/docker
# 登录客户端
ziti-edge-tunnel enroll --jwt http.client.jwt --identity http.client.json
# 为客户端启动隧道服务
sudo ziti-edge-tunnel run -i http.client.json

测试

  1. 通过 OpenZiti 零信任覆盖层安全地访问 HTTP 服务器
1
curl http.ziti

  1. 访问ZAC
1
https://localhost:8443/login

docker-compose

  1. 用户名和密码在启动控制器的容器里的ziti.env文件里

Built with Hugo
Theme Stack designed by Jimmy