logo NodeSeekbeta

防止源站 IP 被泄露

防止泄露

防止源站 IP 被泄露是个常见的话题,主要就是归纳以下几点:

  1. 套 CDN

  2. Nginx 配置时在 host 不匹配时拒绝握手或者返回空证书

    如以下配置:

    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

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

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

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

挽救 docker 被 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 启动

可以使用以下脚本方便修改所有容器映射地址(同时注意修改你的 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

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

123
  • bd

  • 为什么要两个10808

  • @id #2

    你是指 127.0.0.1:10808:10808 吗?前面的 127.0.0.1:10808 是指明本地宿主机端口,后者 10808 是指明容器端口

  • 防止源站 IP 不被泄露

    不泄露不行吗 xhj002

  • 防止不被泄漏=泄漏

  • @lllei #6

    防止源站 IP 不被泄露是个常见的话题,主要就是归纳以下几点:

    正文没改

  • 不如跑本地

123

你好啊,陌生人!

我的朋友,看起来你是新来的,如果想参与到讨论中,点击下面的按钮!

📈用户数目📈

目前论坛共有61578位seeker

🎉欢迎新用户🎉