容器中部署飞网
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模式
- 容器启动时gvisor为默认配置
- 若内置应用需要请求其他应用可配置对应代理服务
-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镜像
可选用以下两种启动方式
- 正常启动飞网
docker run -d -e GMZTA_AUTHKEY=gmkey-auth-123456qwerty -e GMZTA_COMMAND="/app/gmzta set --subnet=true" -e GMZTA_HOSTNAME="gmztademo" gmzta
- 映射自定义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