返回博客

2024年伊朗开发者的代理:在制裁下如何访问GitHub、npm和PyPI

伊朗开发者因制裁面临GitHub、npm和PyPI的封锁。我们讲述如何通过代理绕过限制,继续顺利工作。

📅2026年7月10日
```html

伊朗开发者定期面临严格的限制:GitHub封锁账户,npm包无法安装,PyPI返回连接错误。这一切都是制裁的后果,切断了整个国家的基础开发基础设施。如果您在伊朗工作或雇佣伊朗专家,这篇文章将为您提供具体的解决方案——没有废话和理论。

具体被封锁的内容及其原因

美国对伊朗的制裁不仅仅涉及金融交易——它们还影响技术服务。受美国管辖的公司(几乎涵盖了现代开发的整个技术栈)必须限制来自制裁国家用户的访问。因此,伊朗开发者面临以下问题:

  • GitHub — 封锁账户,仓库变得不可用,Actions无法启动,Copilot无法工作。
  • npm (npmjs.com) — 尝试通过 npm install 安装包时出现连接错误或明确拒绝访问。
  • PyPI (pypi.org)pip install 停滞或返回403错误。
  • Docker Hub — 拉取镜像被封锁。
  • Cloudflare,AWS,Azure,Google Cloud — 部分服务不可用或不稳定。
  • Stack Overflow,JetBrains,VS Code Marketplace — IP级别的间歇性封锁。

封锁发生在IP地址级别:如果您的IP属于伊朗提供商(AS号码IRANCELL,Shatel,MCI等),请求会在检查账户之前自动被拒绝。这就是为什么使用来自其他国家的IP的VPN或代理不是绕过限制的手段,而是获得开发基础设施访问的唯一有效方法。

重要的是要理解:

代理和VPN在不同层面上解决问题。VPN重定向整个系统的流量——这对于浏览器很方便,但对于命令行工具(git,npm,pip)来说不方便,因为需要精确的配置。代理允许仅为特定工具设置绕过制裁,而不影响其余流量。

哪种类型的代理适合开发

对于开发者的任务——处理仓库,安装包,CI/CD——连接的稳定性,速度和IP的清洁性是重要的。我们将讨论三种主要类型的代理及其适用的具体场景。

住宅代理

住宅代理 使用来自不同国家的真实家庭用户的IP地址。对于GitHub来说,这一点至关重要:平台不仅分析IP的地理位置,还分析其声誉。数据中心的IP会引起怀疑,而美国或欧洲的家庭IP则被视为普通用户。住宅代理是长期使用GitHub账户的最可靠选择。

数据中心代理

数据中心代理 — 快速且便宜。它们非常适合通过npm和pip安装包:PyPI和npmjs.com对IP的声誉检查没有GitHub那么严格。如果您只需在CI/CD管道中下载依赖项,数据中心代理可以完成任务并且成本更低。

移动代理

移动代理 使用移动运营商的IP(4G/5G)。从反欺诈系统的角度来看,这是最“干净”的IP类型:一个移动IP背后同时有成千上万的真实用户,因此封锁它是不划算的。如果您已经遇到过GitHub账户被封锁的问题,并希望最大限度地降低再次被封锁的风险,移动代理是相关的。

为GitHub设置代理

GitHub使用两种协议与仓库进行交互:HTTPS和SSH。每种协议的代理设置方式不同。我们将讨论这两种情况。

通过HTTPS的git代理

这是与GitHub交互的最常见方式。通过git配置进行设置。打开终端并执行:

# 为git设置HTTP代理(将host,port,user,password替换为您的信息)
git config --global http.proxy http://user:password@proxy-host:port
git config --global https.proxy http://user:password@proxy-host:port

# 检查设置
git config --global --get http.proxy

# 如果代理不需要身份验证:
git config --global http.proxy http://proxy-host:port

在此设置后,所有 git clonegit pushgit pull 命令将通过代理进行。如果您只想为GitHub设置代理,而不是所有仓库:

# 仅为github.com设置代理
git config --global http.https://github.com.proxy http://user:password@proxy-host:port

通过SSH的git代理

SSH连接到GitHub通过22端口(或443作为替代)。用于代理SSH流量的工具是 nc(netcat)或 connect。编辑文件 ~/.ssh/config

Host github.com
  HostName github.com
  User git
  ProxyCommand nc -X connect -x proxy-host:port %h %p
  # 或者对于SOCKS5:
  # ProxyCommand nc -X 5 -x proxy-host:port %h %p

如果您使用Windows,可以用 connect.exe 替代 nc,或者通过PuTTY设置ProxyCommand。在macOS和Linux上,netcat通常已经安装。

设置环境变量

另一种方法是使用环境变量。它们不仅适用于git,还适用于许多其他命令行工具:

# Linux / macOS — 添加到 ~/.bashrc 或 ~/.zshrc
export HTTP_PROXY="http://user:password@proxy-host:port"
export HTTPS_PROXY="http://user:password@proxy-host:port"
export NO_PROXY="localhost,127.0.0.1"

# Windows (PowerShell)
$env:HTTP_PROXY = "http://user:password@proxy-host:port"
$env:HTTPS_PROXY = "http://user:password@proxy-host:port"

为npm和Node.js设置代理

npm内置了对代理的支持。设置只需一条命令,并立即应用于所有包安装操作。这对于使用JavaScript/TypeScript栈的伊朗开发者尤其重要:React,Vue,Angular,Next.js — 所有这些都积极使用npmjs.com。

# 为npm设置代理
npm config set proxy http://user:password@proxy-host:port
npm config set https-proxy http://user:password@proxy-host:port

# 检查当前配置
npm config get proxy
npm config get https-proxy

# 关闭代理(如果需要恢复直接连接)
npm config delete proxy
npm config delete https-proxy

设置保存在文件 ~/.npmrc 中。您也可以直接编辑此文件:

# ~/.npmrc的内容
proxy=http://user:password@proxy-host:port
https-proxy=http://user:password@proxy-host:port
strict-ssl=false

Yarn和pnpm

如果您使用Yarn或pnpm,设置类似:

# Yarn v1
yarn config set proxy http://user:password@proxy-host:port
yarn config set https-proxy http://user:password@proxy-host:port

# Yarn v2/v3 (Berry) — 编辑 .yarnrc.yml
# httpProxy: "http://user:password@proxy-host:port"
# httpsProxy: "http://user:password@proxy-host:port"

# pnpm
pnpm config set proxy http://user:password@proxy-host:port
pnpm config set https-proxy http://user:password@proxy-host:port

CI/CD建议:

如果您使用GitHub Actions,GitLab CI或其他系统,请将变量 HTTP_PROXYHTTPS_PROXY 添加到项目的机密中。这将使所有管道步骤自动使用代理。

为PyPI和pip设置代理

伊朗的Python开发者特别频繁地面临PyPI的封锁:pip使用HTTPS下载包,如果IP被封锁,安装将停滞或返回错误。有几种方法可以为pip设置代理。

方法1:安装时使用--proxy标志

# 通过代理进行一次性安装
pip install requests --proxy http://user:password@proxy-host:port

# 对于pip3
pip3 install django --proxy http://user:password@proxy-host:port

方法2:pip.conf配置文件

为了不在每个命令中指定代理,请将设置添加到pip的配置文件中:

# Linux/macOS: ~/.config/pip/pip.conf
# Windows: %APPDATA%\pip\pip.ini

[global]
proxy = http://user:password@proxy-host:port
trusted-host = pypi.org
               pypi.python.org
               files.pythonhosted.org

方法3:环境变量

# pip会自动获取标准环境变量
export HTTP_PROXY="http://user:password@proxy-host:port"
export HTTPS_PROXY="http://user:password@proxy-host:port"

# 之后,普通的pip install通过代理工作
pip install numpy pandas scikit-learn

Poetry和Conda

如果您使用Poetry来管理依赖项,代理设置通过环境变量进行——Poetry会自动继承 HTTP_PROXYHTTPS_PROXY。对于Conda,请添加到文件 ~/.condarc

# ~/.condarc
proxy_servers:
  http: http://user:password@proxy-host:port
  https: http://user:password@proxy-host:port

其他开发者工具:Docker,Composer,Maven

封锁不仅影响GitHub,npm和PyPI。让我们看看如何为其他流行的开发工具设置代理,这些工具在伊朗也可能不可用。

Docker

Docker Hub对伊朗IP被封锁。要执行 docker pull,请在Docker守护程序配置中设置代理:

# Linux: 创建或编辑 /etc/docker/daemon.json
{
  "proxies": {
    "http-proxy": "http://user:password@proxy-host:port",
    "https-proxy": "http://user:password@proxy-host:port",
    "no-proxy": "localhost,127.0.0.1"
  }
}

# 重启Docker
sudo systemctl restart docker

在macOS和Windows上,Docker Desktop的代理设置通过图形界面完成:设置 → 资源 → 代理。

Composer (PHP)

# Composer使用环境变量
export HTTP_PROXY="http://user:password@proxy-host:port"
export HTTPS_PROXY="http://user:password@proxy-host:port"

# 或者通过Composer配置
composer config --global http-basic.repo.packagist.org user password

Maven (Java)

<!-- ~/.m2/settings.xml -->
<settings>
  <proxies>
    <proxy>
      <id>my-proxy</id>
      <active>true</active>
      <protocol>http</protocol>
      <host>proxy-host</host>
      <port>port</port>
      <username>user</username>
      <password>password</password>
      <nonProxyHosts>localhost|127.0.0.1</nonProxyHosts>
    </proxy>
  </proxies>
</settings>

Go模块

# Go使用GOPROXY下载模块
# 可以指定镜像或设置系统代理
export GOPROXY="https://goproxy.io,direct"
export HTTP_PROXY="http://user:password@proxy-host:port"
export HTTPS_PROXY="http://user:password@proxy-host:port"

安全性:如何不丢失GitHub账户

使用代理解决了访问问题,但产生了一个新问题:如果您从不同的IP地址登录GitHub(今天从伊朗,明天通过美国代理,后天通过欧洲代理),GitHub的安全系统可能会将账户标记为可疑并封锁。因此,您需要避免这种情况。

IP一致性规则

使用同一个代理服务器与GitHub进行交互。如果您的代理提供商在每次连接时更改IP(旋转代理),这可能会引起怀疑。对于GitHub,最适合的是静态代理——一个长期固定的IP。

  • 静态住宅代理 — 一个来自美国或欧洲的家庭IP,长期固定。对于GitHub的最大可靠性。
  • 旋转代理 — 适合npm/pip(下载包),但不适合登录GitHub账户。
  • 不要混合直接连接和代理连接:要么始终通过代理,要么从不。

双因素认证

在GitHub上启用2FA——这将保护账户,即使有人截获了您的凭据。使用身份验证应用程序(Google Authenticator,Authy),而不是SMS——SMS在伊朗可能不可用或不可靠。

使用SSH密钥而不是密码

设置SSH密钥以通过GitHub进行工作,而不是通过密码进行HTTPS认证。SSH密钥绑定到设备,而不是IP,因此在使用SSH时更改IP对GitHub的安全系统影响较小。

开发者代理类型比较

让我们通过表格总结一下:哪种类型的代理最适合伊朗开发者的具体任务。

任务 住宅 数据中心 移动
GitHub(账户,push/pull) ✅ 非常好 ⚠️ 封锁风险 ✅ 非常好
npm install(安装包) ✅ 好 ✅ 非常好 ✅ 好
pip install(PyPI) ✅ 好 ✅ 非常好 ✅ 好
Docker Hub(拉取镜像) ✅ 好 ✅ 好 ⚠️ 昂贵
CI/CD管道(批量请求) ⚠️ 昂贵 ✅ 非常好 ❌ 不适合
连接速度 中等 中等
IP封锁风险 中等 非常低
成本 中等

推荐策略

开发者的最佳方案:

  1. 对于GitHub — 来自美国或德国的静态住宅代理。一个IP,始终相同。
  2. 对于npm/pip/Docker — 数据中心代理,具有良好的带宽。速度比IP声誉更重要。
  3. 对于浏览器和网络服务 — 相同的住宅代理或单独的代理。

协议:HTTP与SOCKS5

大多数开发工具(git,npm,pip)支持HTTP/HTTPS代理。SOCKS5更通用——它在TCP级别工作,适用于任何协议,包括SSH。如果您的代理提供商支持SOCKS5,请在与GitHub的SSH连接中使用它。对于HTTP流量(npm,pip)几乎没有区别。

结论和建议

制裁为伊朗开发者创造了真正的障碍,但并没有使工作变得不可能。正确配置的代理允许您充分利用GitHub,安装npm和pip包,从Docker Hub拉取镜像——而不会丢失账户或遭遇持续封锁。

文章的关键结论:

  • 与GitHub交互时使用静态住宅代理——来自美国或欧洲的一个固定IP。
  • 安装包(npm,pip,Composer)时,便宜的数据中心代理速度更快。
  • 在工具级别(git confignpm configpip.conf)设置代理,而不仅仅是在系统级别。
  • 对于同一个GitHub账户,不要混合直接连接和代理。
  • 启用2FA并使用SSH密钥以确保账户的最大安全性。

如果您正在寻找一个可靠的解决方案,以便持续与GitHub和其他被封锁的服务进行交互,建议您关注 住宅代理——它们通过真实的家庭IP地址提供稳定的访问,这些地址极少受到GitHub和其他平台的封锁。

```