Skip to content

ICKelin/zta

Repository files navigation

zero trust access

正在尝试开发的一款零信任访问的项目,项目先从一个内网穿透开始做起,然后逐步加上认证功能。

img.png

如果您对项目感兴趣,可以通过B站和Youtube查看项目的演进过程。

里程碑 功能描述 状态 参考视频
MVP版本 完成最简单的TCP内网穿透 自己动手实现一个内网穿透3:MVP版本发布
HTTP内网穿透 结合Apisix实现一个内网穿透,实现复用80和443端口 自己动手实现一个内网穿透5:里程碑2,接入Apisix实现HTTP内网穿透
HTTP内网穿透+身份认证 基于OIDC协议实现身份认证功能,保护内网穿透的数据安全 自己动手实现一个内网穿透8】里程碑3,给HTTP内网穿透加身份认证
TCP内网穿透+身份认证 实现原生TCP应用的身份认证功能 自己动手实现一个内网穿透10】最后一个里程碑,TCP的身份认证
加餐: UDP内网穿透实现 实现UDP的内网穿透 应网友需求,增加UDP的实现
可视化,安全防护方面的功能 内容待定

运行

二进制文件运行

服务端

cd release

nohup ./zta-gw_linux_amd64 -c gateway.yaml &

客户端

./zta-gw_darwin_amd64 -client_id=客户端id -server_addr=服务端IP:端口

docker方式运行(推荐)

cd docker-compose 
docker-compose up --build -d

配置详解

  • gateway.yaml: 主配置文件
# 服务端监听地址
gateway:
  listen_addr: ":12359"

# http路由模块配置
http_routes:
  apisix: |
    {
      "api": "http://127.0.0.1:9180",
      "key": "edd1c9f034335f136f87ad84b625c8f1"
    }
# http身份认证配置
http_authenticate: /opt/apps/zta/etc/authenticate.json

# 内网穿透配置
listener_file: /opt/apps/zta/etc/listener.json

# ssl证书和密钥配置
ssl_file: /opt/apps/zta/etc/ssl.json
  • listener.json: 内网穿透配置,支持tcp,udp,http和https
[
  {
    # 客户端ID
    "client_id": "test-client",
    # 公网协议(tcp/udp/http/https)
    "public_protocol": "tcp",
    # 监听ip(tcp用0.0.0.0,http,https用127.0.0.1)
    "public_ip": "0.0.0.0",
    # 监听端口,不能冲突
    "public_port": 10000,
    # 穿透内网的协议
    "internal_protocol": "tcp",
    # 穿透内网的ip
    "internal_ip": "127.0.0.1",
    # 穿透内网的端口
    "internal_port": 2000
  },
  {
    "client_id": "test-client",
    "public_protocol": "http",
    "public_ip": "127.0.0.1",
    "public_port": 10002,
    "internal_protocol": "tcp",
    "internal_ip": "127.0.0.1",
    "internal_port": 2002,
    # http路由类型,仅针对public_protocol=http或https
    "http_route_type": "apisix",
    # http路由配置参数,根据http_route_type决定,以下配置为apisix的http路由配置参数
    "http_param": { # 参考:[apisix路由api](https://apisix.apache.org/zh/docs/apisix/admin-api/#route)
      "id": "zta_localhost_10002",
      "uri": "/*",
      "hosts": [
        "hulu2.byc.net"
      ],
      "upstream": {
        "type": "roundrobin",
        "nodes": {
          "127.0.0.1:10002": 1
        }
      }
    }
  }
]
  • ssl.json, https证书和密钥配置
[
  {
    "id": "1",
    # 证书文件
    "cert_file": "/opt/apps/zta/etc/certs/hulu2.byc.net.crt",
    # 密钥文件
    "key_file": "/opt/apps/zta/etc/certs/hulu2.byc.net.key",
    # sni列表
    "snis": ["hulu2.byc.net"]
  }
]
  • authenticate.json 身份认证服务配置,如果需要使用自身的基于OIDC的身份认证,可以使用该配置,需要对OIDC有所了解
[
  {
    "id": "1",
    "type": "OIDC",
    "issuer": "http://oidc.zta.beyondnetwork.net:14001",
    "private_key_file": "/opt/apps/zta/etc/certs/oidc.key",
    "public_key_file": "/opt/apps/zta/etc/certs/oidc.crt",
    "listen_addr": ":14001",
    "static_folder": "/opt/apps/zta/web",
    "clients": [
      {
        "client_id": "test_app_id",
        "client_secret": "it is a secret",
        "redirect_uri": "http://app2.zta.beyondnetwork.net:9080/.apisix/redirect",
        "users": [
          {
            "username": "username",
            "password": "password"
          }
        ]
      }
    ]
  }
]

编译

./build.sh

执行成功之后会生成一个release的目录,里面包含各个系统的服务端程序zta-gw_$GOOS_$GOARCH以及客户端zta-client_$GOOS_$GOARCH

构建docker镜像(可选)

./build_image.sh

执行成功之后会在本地构建一个ickelin/zta的镜像