如何防止源站 IP 被泄露

本文最后更新于 2025年9月12日 上午

常见查询 censys

  1. 不要在未套 cdn 的情况下直接 DNS 解析到源站(如果解析了,但时间不长,此时可能还没被扫留下记录)

  2. Nginx 配置时在 host 不匹配时拒绝握手

    如以下配置:

    1
    2
    3
    4
    server {
    listen 443 ssl default_server;
    ssl_reject_handshake on;
    }

    当没有匹配到 server 时,拒绝 ssl 握手。

  3. 将服务只监听 127.0.0.1,外部网络靠 Nginx 反代来访问。如使用 docker 注意映射端口时尽量使用 127.0.0.1,比如映射 $10808$ 端口:127.0.0.1:10808:10808

  4. 注意 ufw 命令行为与 docker 端口的冲突,详见该项目

目前很多服务给出的默认 docker 命令或者 compose 文件都是在端口映射中未指明映射地址,导致默认映射 0.0.0.0 导致服务直接暴露在公网上

这可能还好,最重要的是你暴露的服务所展现的内容(如 html 文件)可能直接暴露了对应的域名(比如网站的 favicon 链接),导致 censys 这类扫描 IP 地址的能够直接将域名和 IP 对应起来!!!

如著名图床 EasyImage2.0 服务就完美地踩中了以上两点。

挽救被 0.0.0.0 映射的服务

一个黑魔法:

  1. docker ps 找到对应容器的 ID

  2. systemctl stop docker 停止 docker

  3. vim /var/lib/docker/containers/<container-id>/hostconfig.json

    "HostIp": "0.0.0.0" 或者 "HostIp": "" 改为 HostIp": "127.0.0.1"

  4. systemctl start docker 启动

  5. 如果容器没启动,启动容器

可以使用以下脚本方便修改所有容器映射地址(同时注意修改你的 docker compose 文件上的映射地址;以及之后如果使用 docker run 命令,请注意显式指明映射 127.0.0.1):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/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

运行脚本后,你可能还需要启动容器。


如何防止源站 IP 被泄露
https://lllei.top/2023/12/31/如何防止源站 IP 被泄露/
作者
Lei
发布于
2023年12月31日
更新于
2025年9月12日
许可协议