CI 任务、AI 编码代理和沙箱容器可以发起任意的出站请求。一个被攻陷的依赖、一次提示注入,或一个恶意的构建步骤,都可能窃取机密、回连外部服务器,或打开反向 shell。大多数团队对工作负载外发的流量毫无可见性,更不用说阻止它了。
iron-proxy 是一个内置 DNS 服务器的 MITM 出站代理,位于不受信任的工作负载与互联网之间。它在网络边界强制执行默认拒绝策略,因此工作负载只能访问你明确允许的域名。真实机密永远不会进入沙箱。工作负载使用代理令牌,iron-proxy 在出站时替换为真实凭据,这意味着即使工作负载被攻陷,攻击者窃取到的令牌在代理之外也毫无价值。
单一二进制文件。单一 YAML 配置。
169.254.169.254、fd00:ec2::254 和 fd20:ce::254)以及回环地址默认被拒绝;可通过 proxy.upstream_deny_cidrs 或 IRON_PROXY_UPSTREAM_DENY_CIDRS 覆盖。HTTP_PROXY、HTTPS_PROXY 或 SOCKS5 设置进行代理配置的工具。SET ROLE,并通过 SQL AST 遍历拒绝客户端修改角色的尝试(SET ROLE、set_config('role', ...)、DO 块等)。与 PostgreSQL 行级安全配合使用,当应用程序以共享服务账户用户连接时,可实现按租户的数据隔离。要求 PgBouncer(如果使用)以 pool_mode = session 运行——事务或语句池模式会在查询之间静默重新绑定后端,从而破坏该策略。详情请参阅 docs.iron.sh。专为 CI 流水线、GitHub Actions、AI 代理(Claude Code、Cursor、Codex)以及任何运行你并不完全信任的代码的环境而构建。
Docker 镜像可在 Docker Hub 获取, 适用于 Linux/macOS(amd64/arm64)的预构建二进制文件可在 GitHub Releases 获取。
或从源码构建:```bash go build -o iron-proxy ./cmd/iron-proxy
## 快速开始```bash
cd examples/docker-compose
docker compose up
这会启动 iron-proxy 和一个演示客户端,该客户端通过代理发起五个请求。查看日志以了解被允许、被阻止以及被重写密钥的请求:```bash docker compose logs proxy
每个请求都会生成一条结构化的 JSON 审计条目:```json
{
"host": "httpbin.org",
"method": "GET",
"path": "/headers",
"action": "allow",
"status_code": 200,
"duration_ms": 142,
"request_transforms": [
{ "name": "allowlist", "action": "continue" },
{
"name": "secrets",
"action": "continue",
"annotations": { "swapped": [{ "secret": "OPENAI_API_KEY", "locations": ["header:Authorization"] }] }
}
]
}
被拒绝的请求包含一个 rejected_by 字段,并以 WARN 级别记录日志。完整模式请参见
审计日志格式。
iron-proxy 通过动态生成由您提供的 CA 签名的叶子证书来终止 TLS。客户端容器必须信任此 CA。```bash
mkdir -p certs
openssl genrsa -out certs/ca.key 4096
openssl req -x509 -new -nodes
-key certs/ca.key
-sha256 -days 3650
-subj "/CN=iron-proxy CA"
-addext "basicConstraints=critical,CA:TRUE"
-addext "keyUsage=critical,keyCertSign"
-out certs/ca.crt
### 2. 创建 Docker 网络
iron-proxy 需要一个固定 IP,以便容器可以将其 DNS 指向它:```bash
docker network create --subnet=172.20.0.0/24 iron-proxy
创建一个包含你的密钥的环境文件(不要将其纳入版本控制):```bash echo "OPENAI_API_KEY=sk-real-key" > .env
## 核心功能
- **多协议支持**:HTTP/HTTPS、SOCKS4、SOCKS5 代理
- **智能验证**:自动检测代理可用性
- **地理位置**:IP 地理定位和 ISP 信息
- **匿名检测**:识别透明、匿名和精英代理
- **并发处理**:多线程代理检查
- **多种输出格式**:JSON、CSV、TXT
- **实时进度**:实时进度条和统计信息
- **灵活输入**:支持单个代理、文件或 stdin
- **自定义超时**:可配置的连接超时
- **重试机制**:自动重试失败的检查
## 安装
### 从源码安装
```bash
git clone https://github.com/yourusername/proxy-checker.git
cd proxy-checker
pip install -r requirements.txt
# 检查单个代理
python proxy_checker.py -p 192.168.1.1:8080
# 从文件检查代理
python proxy_checker.py -f proxies.txt
# 从 stdin 检查代理
cat proxies.txt | python proxy_checker.py
# 使用自定义超时和线程数检查代理
python proxy_checker.py -f proxies.txt -t 10 -c 50
# 以 JSON 格式输出结果
python proxy_checker.py -f proxies.txt -o json
# 保存结果到文件
python proxy_checker.py -f proxies.txt -o csv -O results.csv
# 启用详细输出
python proxy_checker.py -f proxies.txt -v
-p, --proxy PROXY 要检查的单个代理
-f, --file FILE 包含代理列表的文件
-t, --timeout TIMEOUT 连接超时时间(秒)(默认:5)
-c, --concurrent NUM 并发线程数(默认:20)
-o, --output FORMAT 输出格式:json、csv、txt(默认:txt)
-O, --output-file FILE 将结果保存到文件
-v, --verbose 启用详细输出
--no-geo 禁用地理位置查询
--no-anonymity 禁用匿名检测
--retry NUM 失败检查的重试次数(默认:1)
--version 显示版本信息
代理应按照以下格式提供,每行一个:
protocol://host:port
protocol://user:pass@host:port
host:port
示例:
http://192.168.1.1:8080
socks5://user:[email protected]:1080
192.168.1.1:3128
[+] 192.168.1.1:8080 - HTTP - 精英 - 美国 - 正常
[-] 192.168.1.2:8080 - 连接失败
{
"results": [
{
"proxy": "192.168.1.1:8080",
"protocol": "http",
"status": "working",
"anonymity": "elite",
"country": "United States",
"isp": "Example ISP",
"response_time": 0.523
}
],
"statistics": {
"total": 1,
"working": 1,
"failed": 0
}
}
proxy,protocol,status,anonymity,country,isp,response_time
192.168.1.1:8080,http,working,elite,United States,Example ISP,0.523
--no-geo 和 --no-anonymity 标志可加快检查速度--no-geo 标志可跳过地理位置查询欢迎贡献!请随时提交 Pull Request。
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)本项目采用 MIT 许可证 - 详情请参阅 LICENSE 文件。
本工具仅供教育和安全研究目的使用。用户有责任遵守所有适用的法律和法规。作者不对本软件的任何滥用行为负责。
如果您遇到任何问题或有任何疑问,请:
注意:请务必负责任地使用此工具,并遵守您所在司法管辖区的所有适用法律。```bash
docker run -d --name iron-proxy
--network iron-proxy --ip 172.20.0.2
-v $(pwd)/proxy.yaml:/etc/iron-proxy/proxy.yaml:ro
-v $(pwd)/certs/ca.crt:/etc/iron-proxy/ca.crt:ro
-v $(pwd)/certs/ca.key:/etc/iron-proxy/ca.key:ro
--env-file .env
ironsh/iron-proxy:latest -config /etc/iron-proxy/proxy.yaml
### 4. 通过代理路由容器
最简单的方法是使用基于 DNS 的路由:将容器的 DNS 指向
iron-proxy,所有主机名查询都会解析到代理 IP,从而自动将流量
路由通过代理:```bash
docker run --rm \
--network iron-proxy \
--dns 172.20.0.2 \
-v $(pwd)/certs/ca.crt:/certs/ca.crt:ro \
curlimages/curl --cacert /certs/ca.crt https://httpbin.org/get
为了更强的执行力度,可以叠加 nftables 规则来阻止非代理出口流量,或使用 TPROXY 进行内核级拦截。关于每种方法的详细信息,请参阅将流量路由到 代理。