关于雷池Docker配置Halo反代的记录
关于雷池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

居然还不给我修改,只能进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
最后就能跳转了!
