防止泄露
防止源站 IP 被泄露是个常见的话题,主要就是归纳以下几点:
-
套 CDN
-
Nginx 配置时在 host 不匹配时拒绝握手或者返回空证书
如以下配置:
server { listen 443 ssl default_server; ssl_reject_handshake on; }当没有匹配到 server 时,拒绝 ssl 握手。
-
将服务只监听 127.0.0.1,外部网络靠 Nginx 反代来访问。如使用 docker 注意映射端口时尽量使用
127.0.0.1,比如映射 $10808$ 端口:127.0.0.1:10808:10808。
目前很多服务给出的默认 docker 命令或者 compose 文件都是在端口映射中未指明映射地址,导致默认映射 0.0.0.0 导致服务直接暴露在公网上。
这可能还好,最重要的是你暴露的服务所展现的内容(如 html 文件)可能直接暴露了对应的域名(比如网站的 favicon 链接),导致 censys 这类扫描 IP 地址的能够直接将域名和 IP 对应起来!!!
如著名图床 EasyImage2.0 服务就完美地踩中了以上两点。
挽救 docker 被 0.0.0.0 映射的服务
一个黑魔法:
-
docker ps找到对应容器的 ID -
systemctl stop docker停止 docker -
vim /var/lib/docker/containers/<container-id>/hostconfig.json将
"HostIp": "0.0.0.0"或者"HostIp": ""改为HostIp": "127.0.0.1" -
systemctl start docker启动
可以使用以下脚本方便修改所有容器映射地址(同时注意修改你的 docker compose 文件上的映射地址;以及之后如果使用 docker run 命令,请注意显式指明映射 127.0.0.1):
#!/bin/bash
# 检查 jq 是否存在
if ! command -v jq >/dev/null 2>&1; then
echo "❌ 错误:jq 未安装,请先安装 jq"
exit 1
fi
# 停止 docker
echo "停止 docker"
systemctl stop docker
# 修改所有容器的 hostconfig.json,把 HostIp 从 "" 改为 "127.0.0.1"
DOCKER_DIR="/var/lib/docker/containers"
for cid in $(ls $DOCKER_DIR); do
CONFIG="$DOCKER_DIR/$cid/hostconfig.json"
if [ -f "$CONFIG" ]; then
# 检查是否存在 HostIp == ""
EMPTY_COUNT=$(jq '[.PortBindings[] | .[].HostIp] | map(select(. == "")) | length' "$CONFIG")
if [ "$EMPTY_COUNT" -gt 0 ]; then
echo "容器 $cid: 检测到 $EMPTY_COUNT 个 HostIp 未指定,准备修改为 127.0.0.1"
# 先备份配置文件
cp "$CONFIG" "$CONFIG.bak.$(date +%s)"
# 修改 HostIp
TMP_FILE=$(mktemp)
jq '(.PortBindings[] | .[].HostIp) |= if . == "" then "127.0.0.1" else . end' "$CONFIG" > "$TMP_FILE" \
&& mv "$TMP_FILE" "$CONFIG"
echo "容器 $cid: 修改完成,原文件已备份为 $CONFIG.bak"
fi
fi
done
echo "所有容器遍历完成,开始启动 docker"
systemctl start docker
运行脚本后,你可能还需要启动容器。
bd
为什么要两个10808
@id #2
你是指
127.0.0.1:10808:10808吗?前面的127.0.0.1:10808是指明本地宿主机端口,后者10808是指明容器端口不泄露不行吗
防止不被泄漏=泄漏
@乐哈哈 #4 @iShare #5
感谢提醒,已改标题
@lllei #6
正文没改
@乐哈哈 #7
已修改,感谢指正。
不如跑本地
@mc123153 #9
使用容器好处很多吧