容器中部署飞网

1 TUN模式与Gvisor模式

    飞网创建的网络接口包括TUN模式和Gvisor模式两种,下面分别进行介绍。

    在Linux操作系统中,TUN模式通过使用/dev/net/tun设备来创建虚拟网络接口,与以太网或Wi-Fi等其他网络接口类似。这种模式下,飞网终端程序可以直接与操作系统底层进行交互(加解密等),并通过TUN虚拟网络接口来处理网络数据包的收发。

    Gvisor模式是一种应用层封装的内核接口,适用于没有操作系统内核权限的场景,例如用于容器中。不是所有的Linux操作系统都支持/dev/net/tun,特别是在一些基于容器的应用程序平台(如阿里云容器服务或Google Cloud Run)中。针对这些环境,飞网终端程序提供了Gvisor模式的运行方式。在Gvisor模式中,飞网终端程序充当SOCKS5或HTTP代理,与容器内其他进程通信。这种模式使得飞网零信任能够在没有 /dev/net/tun 设备或权限的环境中工作,通过代理的方式提供网络连接功能。

2 指定网络模式启动飞网终端程序

    在Docker启动时可以通过GMZTA_COMMAND命令配置飞网零信任的网络模式。

2.1 Gvisor模式

  1. 容器启动时gvisor为默认配置
  2. 若内置应用需要请求其他应用可配置对应代理服务
-e GMZTA_COMMAND=/app/gmztad 
--tun=gvisor 
--socks5=localhost:1055  
--httpproxy=localhost:1055 
  • --tun:配置了飞网零信任使用Gvisor方式启动
  • --socks5与--httpproxy:指定飞网零信任开启代理服务,供其他应用接入

2.2 TUN模式

     TUN模式启动时需指定额外参数与/dev/net/tun文件的映射

-e GMZTA_COMMAND=/app/gmztad 
--tun=tun 
-v /dev/net/tun:/dev/net/tun 
--cap-add=NET_ADMIN 
--cap-add=NET_RAW` 
  • --tun:配置飞网零信任使用/dev/net/tun方式启动
  • -v:挂载本地/dev/net/tun到容器内
  • --cap-add:为容器添加网络权限

3 容器内启动飞网

3.1 准备Dockerfile文件

vi dockerfile
FROM alpine:latest as gmzta
WORKDIR /app
#下载飞网二进制文件
#根据所需的CUP架构调整以下变量。
ENV CPUARCH=amd64
ENV FILE=feiwang-gmzta-${CPUARCH}.tar.gz
RUN wget https://pkgs.gmzta.com/docker/${FILE} && \
 tar xzf ${FILE} --strip-components=1

FROM alpine:latest
#自定义gmztad启动参数
ENV GMZTAD_COMMAND="/app/gmztad --tun=gvisor -state=/var/lib/gmzta/gmztad.state --socket=/var/run/gmzta/gmztad.sock"
#自定义gmzta启动后执行命令
ENV GMZTA_COMMAND=""
#复制源文件到运行目录
WORKDIR /app
###飞网配置Beginning###
COPY --from=gmzta /app/* /app/
RUN wget https://pkgs.gmzta.com/docker/DockerStart.sh
RUN chmod +x DockerStart.sh
###飞网配置END###
#使用脚本启动飞网
CMD ["/bin/sh", "-c", "/app/DockerStart.sh && tail -f /dev/null"]

3.2 构建Docker容器

docker build -t gmzta .

3.3 自定义启动文件DockerStart.sh (可选)

#!/bin/sh
# 启动Nginx服务器并以非守护进程模式运行
gmztadcmd=$GMZTAD_COMMAND
gmztacmd=$GMZTA_COMMAND
$gmztadcmd &
echo 执行启动命令
/app/gmzta on --token=${GMZTA_AUTHKEY} --hostname=${GMZTA_HOSTNAME}
echo 执行自定义命令
$gmztacmd

4 运行Docker镜像

可选用以下两种启动方式

  1. 正常启动飞网
docker run -d -e GMZTA_AUTHKEY=gmkey-auth-123456qwerty -e GMZTA_COMMAND="/app/gmzta set --subnet=true" -e GMZTA_HOSTNAME="gmztademo" gmzta
  1. 映射自定义Dockerstart.sh启动服务
docker run -d -e GMZTA_AUTHKEY=gmkey-auth-123456qwerty -e GMZTA_COMMAND="/app/gmzta set --subnet=true" -e GMZTA_HOSTNAME="gmztademo" -v /app/DockerStart.sh:./DockerStart gmzta

5 Nginx示例

5.1 准备Dockerfile文件

vi dockerfile
FROM alpine:latest as gmzta
WORKDIR /app
#下载飞网二进制文件
#根据所需的CUP架构调整以下变量。
ENV CPUARCH=amd64
ENV FILE=feiwang-gmzta-${CPUARCH}.tar.gz
RUN wget https://pkgs.gmzta.com/docker/${FILE} && \
 tar xzf ${FILE} --strip-components=1

FROM alpine:latest
#自定义gmztad启动参数
ENV GMZTAD_COMMAND="/app/gmztad --tun=gvisor -state=/var/lib/gmzta/gmztad.state --socket=/var/run/gmzta/gmztad.sock"
#自定义gmzta启动后执行命令
ENV GMZTA_COMMAND=""
#使用阿里云alpine源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
#安装基础环境
RUN apk update && apk add --no-cache libc6-compat
RUN apk add ca-certificates iptables ip6tables libc6-compat && rm -rf /var/cache/apk/*
#复制源文件到运行目录
WORKDIR /app
###NGINX配置Beginning###
# 安装Nginx和创建必要的目录
RUN apk update && apk add nginx
# 创建必要的目录
RUN mkdir -p /usr/share/nginx/html
RUN mkdir -p /etc/nginx/conf.d

# 设置默认欢迎页面
RUN echo "Hello, Gmzta!" > /usr/share/nginx/html/index.html

###NGINX配置END###
###飞网配置Beginning###
COPY --from=gmzta /app/* /app/
RUN wget https://pkgs.gmzta.com/docker/DockerNginxStart.sh
RUN chmod +x DockerNginxStart.sh
RUN mkdir -p /var/run/gmzta /var/cache/gmzta /var/lib/gmzta
###飞网配置END###
#使用脚本启动飞网
CMD ["/bin/sh", "-c", "/app/DockerNginxStart.sh && tail -f /dev/null"]

5.2 构建Docker容器

docker build -t gmztanginx .

5.3 配置启动文件start.sh(可选)

#!/bin/sh
#获取请求命令
gmztadcmd=$GMZTAD_COMMAND
gmztacmd=$GMZTA_COMMAND
$gmztadcmd &
echo 执行启动命令
/app/gmzta on --token=${GMZTA_AUTHKEY} --hostname=${GMZTA_HOSTNAME}
echo 执行自定命令
$gmztacmd
echo 启动nginx
nginx

5.4 配置nginx 文件

# /etc/nginx/nginx.conf

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

    server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /usr/share/nginx/html;
        index index.html;

        location / {
            try_files $uri $uri/ =404;
        }
    }
}

5.5 运行Docker镜像

请自行修改所需配置

docker run -d -e GMZTA_AUTHKEY=gmkey-auth-k5ba123456 -e GMZTA_COMMAND="/app/gmzta service --bg 80" -e GMZTA_HOSTNAME="gmztanginx" -v ./nginx.config:/etc/nginx/nginx.conf -v ./var_lib_gmzta:/var/lib/gmzta gmztanginx

6 DockerHub示例

拉取镜像

docker pull gmzta/gmzta:latest

启动镜像

 docker run -d -e GMZTA_AUTHKEY=gmkey-auth-kd58a1CONTRL-5C4e12305E54484A89D944378B227c72 -e GMZTA_COMMAND="/app/gmzta set --subnet=true" -e GMZTA_HOSTNAME="gmztademo" gmzta/gmzta:latest
上次更新: