如何防止源站 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日
许可协议