使用说明 - GangZhuo/http-proxy GitHub Wiki

http-proxy 能够把 socks5 代理转换为 http 代理,另外,可以根据 IP 段来 决定哪些 IP 应该走 socks5,哪些 IP 应该直连。 这对于经常从国内外服务器拉取代码的人非常有用。

例如,因为一些原因,我们拉取或推送代码到 github 时,速度非常慢,因此我 们需要配置 git 的 http(s).proxy,当我们需要拉取国内源的代码时,我们又需 要取消 git 的 http(s).proxy 设置。

通过 http-proxy 我们仅需要配置一次,然后,是否需要通过 socks5 代理,可由 http-proxy 自行决定。

注意和限制:

  1. 仅支持 socks5 协议的代理,且上游 socks5 代理必须无认证。可以使用 shadowsocks-libev 作为上游代理。
  2. 必须使用无污染的 DNS 服务器才能正常工作。可以使用 CleanDNSChinaDNS 等提供无污染的 DNS 服务。

配置和使用

前置条件

  1. 根据 shadowsocks-libev 文档,部署和配置好 socks5 代理,假设我们配置好的 socks5 代理为 127.0.0.1:1080。
  2. 根据 CleanDNS 文档,部署和配置好 DNS 服务,假设配置好的 DNS 服务为 127.0.0.1:5354。

安装和配置 http-proxy (以 Debian 为例)

  1. 安装依赖项
$ sudo apt-get install build-essential libc-ares-dev git
  1. 获取源代码
$ git clone https://github.com/GangZhuo/http-proxy.git
$ git submodule update --init --recursive
  1. 编译
$ cd http-proxy
$ make
  1. 安装到 /usr/local/bin
$ sudo cp http-proxy /usr/local/bin/
  1. 创建配置目录
$ mkdir /etc/http-proxy
  1. 复制配置文件
$ sudo cp asset/chnroute.txt /etc/http-proxy/
$ sudo cp asset/chnroute6.txt /etc/http-proxy/
$ sudo cp asset/lan.txt /etc/http-proxy/
$ sudo cp asset/http-proxy.config /etc/http-proxy/
  1. 修改配置项
$ sudo vim /etc/http-proxy/http-proxy.config # 也可使用其他文本编辑工具

# 各配置项的说明如下:

config cfg

	# 以下两行配置绑定的 IP:PORT。

	option bind_addr '127.0.0.1'
	option bind_port '1081'

	# chnroute 配置直连网段,不在这些网段中的 IP 走代理。
	# 如果 reverse 设置为 1,则 chnroute 配置的是需要走代理的网段,不在网段中的 IP 则直连。

	option chnroute '/etc/http-proxy/lan.txt,/etc/http-proxy/chnroute.txt,/etc/http-proxy/chnroute6.txt'

	# forbidden 配置的是禁止访问的网段。

	#option forbidden '/etc/http-proxy/lan.txt'

	# timeout 配置的是超时时间(秒)。
	# 超时时间到达后,无论是否 keep-alive 都关闭连接。

	option timeout '30'

	# 写入日志到 log_file 指定的文件中。
	# 如果不配置,则以 daemon 运行时,写入到系统日志,
	# 非 daemon 运行时,直接写入到控制台。

	option log_file '/var/log/http-proxy.log'

	# log_level 为日志级别,最大 7,越大记录的日志越详细。

	option log_level '5'

	# proxy 指定上游 socks5 代理。仅支持无认证的 socks5 代理。
	# 指定多个(英文逗号分隔)时,如果第 1 个不可用时,自动切换到第 2 个代理,以此类推。
	# 每次都会从第 1 个代理开始测试,因此请保证第 1 个代理为最优代理。

	option proxy '127.0.0.1:1080'

	# DNS 解析域名时,如果 ipv6_prefer 配置为 1,则优先获取 IPv6 地址。
	# 默认情况下,优先获取 IPv4。

	option ipv6_prefer '0'

	# dns_server 指定上游 DNS 服务器。默认使用操作系统的配置。
	# 此配置项原样传入 c-ares 库的 ares_set_servers_ports_csv() 函数,
	# 因此,支持 c-ares 的语法,即支持多个上游,语法:IP[:PORT],IP[:PORT]...

	option dns_server '127.0.0.1:5354'

	# 设置 DNS 缓存的超时时间(秒)。
	# http-proxy 会缓存一会 DNS 解析结果。
	# 0 表示永不过期。

	option dns_timeout '600'

	# 如果 reverse 配置为 1,则反转 chnroute 规则,即,
 	# 如果 IP 在 chnroute 规则中,则走代理,否则直连。

	option reverse '0'
  1. 测试
$ /usr/local/bin/http-proxy --config=/etc/http-proxy/http-proxy.config
# CTRL + C 可停止程序

另起一个 terminal,然后执行如下命令:

$ export http_proxy=http://127.0.0.1:1081   # 设置系统 HTTP 代理
$ export https_proxy=http://127.0.0.1:1081  # 设置系统 HTTPS 代理
$ curl https://www.google.com               # 打开 Google

如果控制台输出正确内容,则表示代理配置成功,否则请检查如上步骤。

  1. 安装为服务(以 systemd 为例)
$ sudo cp debian/http-proxy.service /etc/systemd/system/
$ sudo systemctl start http-proxy.service    # 启动服务
$ sudo systemctl status http-proxy.service   # 打印服务状态
$ sudo systemctl enable http-proxy.service   # 开机运行
  1. 配置系统代理
$ echo 'export proxy="http://127.0.0.1:1081"' >> ~/.bashrc
$ echo 'export http_proxy=$proxy' >> ~/.bashrc
$ echo 'export https_proxy=$proxy' >> ~/.bashrc
$ echo 'export no_proxy="localhost, 127.0.0.1, ::1"' >> ~/.bashrc
$ source ~/.bashrc

更新 chnroute

$ curl -O 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest'
$ cat delegated-apnic-latest | grep ipv4 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > chnroute.txt
$ cat delegated-apnic-latest | grep ipv6 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, $5) }' > chnroute6.txt
$ sudo cp chnroute.txt /etc/http-proxy/
$ sudo cp chnroute6.txt /etc/http-proxy/
$ rm chnroute.txt
$ rm chnroute6.txt
$ rm delegated-apnic-latest