You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab CE 13.12.15如何通过pre-receive hook限制特定网段用户推送?

在GitLab CE 13.12.15的pre-receive钩子中获取推送IP并阻止特定网段推送

核心思路

GitLab的pre-receive钩子不会主动传递客户端IP,但可通过环境变量提取不同推送方式(SSH/HTTPS)下的IP地址,再结合CIDR匹配逻辑拦截指定网段的推送请求。

提取客户端IP的逻辑

不同推送场景对应不同的环境变量:

  • SSH推送:GitLab自动设置SSH_CONNECTION变量,格式为客户端IP 客户端端口 服务器IP 服务器端口,提取第一个字段即可获得客户端IP。
  • HTTPS推送:直连GitLab时用REMOTE_ADDR变量;若GitLab前端有反向代理,需确保代理传递X-Forwarded-For头,此时从HTTP_X_FORWARDED_FOR变量提取(多IP场景取第一个真实客户端IP)。

完整pre-receive钩子脚本

创建pre-receive脚本(放在目标仓库的custom_hooks目录,或全局钩子目录):

#!/bin/bash

# 定义需要阻止的网段(可自行修改)
BLOCKED_CIDR="192.168.1.0/24"

# 提取客户端IP
CLIENT_IP=""
if [ -n "$SSH_CONNECTION" ]; then
    CLIENT_IP=$(echo "$SSH_CONNECTION" | awk '{print $1}')
elif [ -n "$HTTP_X_FORWARDED_FOR" ]; then
    # 处理多代理IP场景,取第一个真实客户端IP
    CLIENT_IP=$(echo "$HTTP_X_FORWARDED_FOR" | cut -d',' -f1 | xargs)
elif [ -n "$REMOTE_ADDR" ]; then
    CLIENT_IP="$REMOTE_ADDR"
else
    # 无法获取IP时的处理,这里选择放行,可根据需求改为exit 1拒绝
    echo "无法识别客户端IP,允许推送"
    exit 0
fi

# 检查IP是否在阻止网段内(需服务器安装ipcalc工具)
if ipcalc -c "$CLIENT_IP" "$BLOCKED_CIDR"; then
    echo "ERROR: 你的IP $CLIENT_IP 属于被限制网段,禁止推送代码"
    exit 1
else
    echo "IP $CLIENT_IP 验证通过,允许推送"
    exit 0
fi

配置与测试步骤

  1. 安装依赖工具:
    Debian/Ubuntu系统执行:

    sudo apt install ipcalc -y
    

    RHEL/CentOS系统执行:

    sudo yum install ipcalc -y
    
  2. 设置脚本权限:
    确保脚本归git用户所有且可执行:

    sudo chown git:git pre-receive
    sudo chmod +x pre-receive
    
  3. HTTPS反向代理配置(若有):
    若GitLab前端有Nginx等反向代理,需在/etc/gitlab/gitlab.rb中添加以下配置:

    nginx['real_ip_header'] = 'X-Forwarded-For'
    nginx['set_real_ip_from'] = ['10.0.0.0/24'] # 替换为你的代理服务器网段
    

    然后重载配置并重启GitLab:

    sudo gitlab-ctl reconfigure
    sudo gitlab-ctl restart
    
  4. 测试脚本:
    手动模拟环境变量测试脚本逻辑:

    # 模拟被阻止的IP推送
    SSH_CONNECTION="192.168.1.100 12345 10.0.0.1 22" ./pre-receive
    

    若输出错误提示并返回非0值,说明脚本生效。

全局钩子配置(可选)

如果需要对所有仓库生效,可将脚本放在全局钩子目录:

  1. 在gitlab.rb中配置全局钩子路径:
    gitlab_shell['custom_hooks_dir'] = '/var/opt/gitlab/git-data/custom_hooks'
    
  2. 创建目录并放置脚本:
    sudo mkdir -p /var/opt/gitlab/git-data/custom_hooks/pre-receive.d
    sudo mv pre-receive /var/opt/gitlab/git-data/custom_hooks/pre-receive.d/
    
  3. 重新配置GitLab:
    sudo gitlab-ctl reconfigure
    

内容的提问来源于stack exchange,提问作者Sora Tseng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:52:33