14
0
0

关于雷池Docker配置Halo反代的记录

2026-10-24
2026-10-24
文章摘要
|

关于雷池Docker配置Halo反代的记录

前情提要

本人在自建Halo的博客网站时,突然想加一个waf,最后选择了雷池waf。
但是,在配置的时候发现雷池不允许 localhost、 127.0.0.1 等反代。
我查了一下,localhost其实是 docker compose 定义的 safeline-ce 网段中的ip,所以waf禁止这样反代也是正确做法。

通过docker网桥实现反代

创建网桥以及配置Halo的compose文件

我打算使用docker网桥将我的halo docker和safeline-ce串起来,所以先创建一个网桥

docker network create waf-proxy-net

然后在halo docker-compose.yaml 中的 networks 加入

networks:
  halo_network:
  waf-proxy-net: # <------- 这里!!!
    external: true

在services中halo配置中networks修改为

networks:
  - halo_network
  - waf-proxy-net

最后

docker compose up -d

这样就能把halo网络接到 waf-proxy-net 上了。

配置雷池

加入网桥waf-proxy-net

在雷池的 compose.yaml 中的 networks 中加入

networks:
  safeline-ce:
    name: safeline-ce
    driver: bridge
    ipam:
      driver: default
      config:
        - gateway: ${SUBNET_PREFIX:?SUBNET_PREFIX required}.1
          subnet: ${SUBNET_PREFIX}.0/24
    driver_opts:
      com.docker.network.bridge.name: safeline-ce
  waf-proxy-net: # <------- 这里!!!
     external: true

然后在 service: mgt 中修改 networks

networks:
  safeline-ce:
    ipv4_address: ${SUBNET_PREFIX}.4
  waf-proxy-net: # <------- 这里!!!

这一步修改 mgt 是因为在waf中添加应用的时候,它会检测这个http地址是否是合法的。
比如我们添加 http://halo:8090 的时候,他会用dns lookup我们的halo是否是合法的。
如果没有添加 waf-proxy-net 的话,waf mgt 会报dns找不到halo这个域名,从而不给你添加应用

修改雷池tengine配置

在翻雷池waf的 compose.yaml 时,我发现用于反代的引擎的代码如下:

tengine:
  container_name: safeline-tengine
  restart: always
  image: ${IMAGE_PREFIX}/safeline-tengine${REGION}${ARCH_SUFFIX}:${IMAGE_TAG}
  volumes:
    - /etc/localtime:/etc/localtime:ro
    - /etc/resolv.conf:/etc/resolv.conf:ro
    - ${SAFELINE_DIR}/resources/nginx:/etc/nginx
    - ${SAFELINE_DIR}/resources/detector:/resources/detector
    - ${SAFELINE_DIR}/resources/chaos:/resources/chaos
    - ${SAFELINE_DIR}/logs/nginx:/var/log/nginx:z
    - ${SAFELINE_DIR}/resources/cache:/usr/local/nginx/cache
    - ${SAFELINE_DIR}/resources/sock:/app/sock
  environment:
    - TCD_MGT_API=https://${SUBNET_PREFIX}.4:1443/api/open/publish/server
    - TCD_SNSERVER=${SUBNET_PREFIX}.5:8000
    # deprecated
    - SNSERVER_ADDR=${SUBNET_PREFIX}.5:8000
    - CHAOS_ADDR=${SUBNET_PREFIX}.10
    - TCD_MGT_TOKEN=${MGT_INTERNAL_TOKEN:-}
  security_opt:
    - no-new-privileges:true
  ulimits:
    nofile: 131072
  network_mode: host

其中 network_mode 为 host,所以它不会接受 halo 域名
我们需要把 host 重新改为内部网络
我们修改 service: tengine 配置为

tengine:
  container_name: safeline-tengine
  restart: always
  image: ${IMAGE_PREFIX}/safeline-tengine${REGION}${ARCH_SUFFIX}:${IMAGE_TAG}
  volumes:
    - /etc/localtime:/etc/localtime:ro
    - /etc/resolv.conf:/etc/resolv.conf:ro
    - ${SAFELINE_DIR}/resources/nginx:/etc/nginx
    - ${SAFELINE_DIR}/resources/detector:/resources/detector
    - ${SAFELINE_DIR}/resources/chaos:/resources/chaos
    - ${SAFELINE_DIR}/logs/nginx:/var/log/nginx:z
    - ${SAFELINE_DIR}/resources/cache:/usr/local/nginx/cache
    - ${SAFELINE_DIR}/resources/sock:/app/sock
  environment:
    - TCD_MGT_API=https://${SUBNET_PREFIX}.4:1443/api/open/publish/server
    - TCD_SNSERVER=${SUBNET_PREFIX}.5:8000
    # deprecated
    - SNSERVER_ADDR=${SUBNET_PREFIX}.5:8000
    - CHAOS_ADDR=${SUBNET_PREFIX}.10
    - TCD_MGT_TOKEN=${MGT_INTERNAL_TOKEN:-}
  security_opt:
    - no-new-privileges:true
  ulimits:
    nofile: 131072
  networks: # network mode 去掉,改为networks
    safeline-ce: # 把tengine加入safeline-ce网桥,重新分配tengine的ip为6
      ipv4_address: ${SUBNET_PREFIX}.6
    waf-proxy-net: # 加入waf-proxy-net网桥
  ports: # 把tengine的80,443端口公开到公网上
    - "80:80"
    - "443:443"

最后

docker compose up -d

修改nginx

最后在访问网站的时候,访问http的时候发现不能301转到https上,于是我查找waf
img
居然还不给我修改,只能进nginx里面修改

root@iZ7xv9gz48mu2txdqxn887Z:/data/safeline/resources/nginx# ls -l
total 88
-rw-r--r-- 1 root root 5202 Oct 24 12:28 browsers
drwxrwxrwx 2 root root 4096 Oct 24 13:42 certs
drwxr-xr-x 2 root root 4096 Oct 24 12:28 conf.d
drwxr-xr-x 2 root root 4096 Oct 24 14:04 custom_params
-rw-r--r-- 1 root root 1034 Oct 24 12:28 fastcgi.conf
-rw-r--r-- 1 root root  964 Oct 24 12:28 fastcgi_params
-rw-r--r-- 1 root root 2837 Oct 24 12:28 koi-utf
-rw-r--r-- 1 root root 2223 Oct 24 12:28 koi-win
-rw-r--r-- 1 root root 4053 Oct 24 12:28 mime.types
-rw-r--r-- 1 root root 3312 Oct 24 12:28 module_stubs
-rw-r--r-- 1 root root 3536 Oct 24 13:32 nginx.conf
-rw-r--r-- 1 root root  295 Oct 24 14:02 proxy_params
drwxr-xr-x 2 root root 4096 Oct 24 12:28 safeline-static
-rw-r--r-- 1 root root 2254 Oct 24 12:28 safeline.conf
-rw-r--r-- 1 root root 1572 Oct 24 13:32 safeline_unix.conf
-rw-r--r-- 1 root root  596 Oct 24 12:28 scgi_params
drwxr-xr-x 2 root root 4096 Oct 24 13:43 sites-enabled
-rw-r--r-- 1 root root    0 Oct 24 12:28 ssl_engine
drwxr-xr-x 3 root root 4096 Oct 24 13:36 tamper-enabled
-rw-r--r-- 1 root root 4034 Oct 24 13:32 tx_ignore_types
-rw-r--r-- 1 root root  623 Oct 24 12:28 uwsgi_params
-rw-r--r-- 1 root root 3610 Oct 24 12:28 win-utf

我们找到 sites-enabled 目录,查看 IF_ 开头的文件,找到我们需要修改的网站
以 blog.qqof.net 为例,打开 IF_Backend_2 文件

log_format safeline_2 '$remote_addr | $remote_user | $time_local | "$host" | '
                    '"$request" | $status | $body_bytes_sent | '
                    '"$http_referer" | "$http_user_agent"';
upstream backend_2 {
    server halo:8090;
    keepalive 128;
    keepalive_timeout 75;
}
map $scheme $hsts_header {
        https   "max-age=15768000;";
}
server {
    listen 0.0.0.0:80 default_server backlog=65536 reuseport;
    listen 0.0.0.0:443 ssl default_server backlog=65536 reuseport;
    server_name _ blog.qqof.net; # 找到了,在这里!
    # others configurations
    # ...
}

然后在 nginx/custom_params 文件夹中找到对应的 backend_{num}, 修改为

proxy_ssl_server_name on;
proxy_ssl_name $host;

# 强制 HTTP 跳转 HTTPS
if ($scheme = http) {
    return 301 https://$host$request_uri;
}

保存之后,执行

docker exec -it safeline-tengine /usr/sbin/nginx -t
docker exec -it safeline-tengine /usr/sbin/nginx -s reload

最后就能跳转了!

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或者给予支持!