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
配置与测试步骤
安装依赖工具:
Debian/Ubuntu系统执行:sudo apt install ipcalc -yRHEL/CentOS系统执行:
sudo yum install ipcalc -y设置脚本权限:
确保脚本归git用户所有且可执行:sudo chown git:git pre-receive sudo chmod +x pre-receiveHTTPS反向代理配置(若有):
若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测试脚本:
手动模拟环境变量测试脚本逻辑:# 模拟被阻止的IP推送 SSH_CONNECTION="192.168.1.100 12345 10.0.0.1 22" ./pre-receive若输出错误提示并返回非0值,说明脚本生效。
全局钩子配置(可选)
如果需要对所有仓库生效,可将脚本放在全局钩子目录:
- 在
gitlab.rb中配置全局钩子路径:gitlab_shell['custom_hooks_dir'] = '/var/opt/gitlab/git-data/custom_hooks' - 创建目录并放置脚本:
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/ - 重新配置GitLab:
sudo gitlab-ctl reconfigure
内容的提问来源于stack exchange,提问作者Sora Tseng
相关产品推荐
相关产品推荐

