使用说明 - 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 自行决定。
注意和限制:
- 仅支持 socks5 协议的代理,且上游 socks5 代理必须无认证。可以使用 shadowsocks-libev 作为上游代理。
- 必须使用无污染的 DNS 服务器才能正常工作。可以使用 CleanDNS、ChinaDNS 等提供无污染的 DNS 服务。
配置和使用
前置条件
- 根据 shadowsocks-libev 文档,部署和配置好 socks5 代理,假设我们配置好的 socks5 代理为 127.0.0.1:1080。
- 根据 CleanDNS 文档,部署和配置好 DNS 服务,假设配置好的 DNS 服务为 127.0.0.1:5354。
http-proxy (以 Debian 为例)
安装和配置- 安装依赖项
$ sudo apt-get install build-essential libc-ares-dev git
- 获取源代码
$ git clone https://github.com/GangZhuo/http-proxy.git
$ git submodule update --init --recursive
- 编译
$ cd http-proxy
$ make
- 安装到 /usr/local/bin
$ sudo cp http-proxy /usr/local/bin/
- 创建配置目录
$ mkdir /etc/http-proxy
- 复制配置文件
$ 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/
- 修改配置项
$ 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'
- 测试
$ /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
如果控制台输出正确内容,则表示代理配置成功,否则请检查如上步骤。
- 安装为服务(以 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 # 开机运行
- 配置系统代理
$ 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