/love-gfw

🔥以社会主义核心价值观为指导**,实现 Linux 和 MacOS 设备的全局智能分流

Primary LanguageShellMIT LicenseMIT

LinuxMacOS 设备智能分流方案

通过路由器 360 度无痛爱国的方案已经层出不穷,然而我们不得不面对一个很现实的问题:你不可能走到哪里都带着一个路由器!

为了解决这个问题,本教程就诞生了,目标是手把手教你在不同操作系统上 360 度无死角自动翻越万里长城。:clap:

PS: 目前只能在 Linux 和 MacOS 系统上实现, Windows 用户请绕行

本教程爱国方案的特点

放弃建立黑名单的方案吧,被墙的网站每天在大量增加,有限的人生不能在无穷的手工添加黑名单、重启设备中度过。

大道至简,一劳永逸!

  • 建立国内重要网站名单,在国内进行dns查询
  • 其他网站通过 shadowsocks 客户端向 shadowsocks 服务端进行 dns 查询
  • 国内或亚洲的 IP 流量走国内通道
  • 其他流量通过 shadowsocks 服务端转发

知识若不分享,实在没有意义

什么是圣人,圣人就是得到和付出比较均衡的人。天地生我,我敬天地;父母育我,我亦养父母;网上获得知识,也要在网上分享知识。于是,花了许多天,查资料,写教程,调试固件,不知不觉一天就过去了。

自由的感觉真好: youtube, hulu, twitter, facebook, google...

本文档不涉及 shadowsocks 的原理及基础配置,如果你连这些基本的知识也没掌握,请左转绕道而行,了解这些基本的知识之后再来看本教程。

欢迎提 Issues 参与维护项目。


这里有两种思路可以实现全局智能分流,一种思路是通过防火墙策略,另一种思路是通过策略路由表。

通过防火墙策略实现

防火墙工具有很多种,我尝试过并且成功实现功能的有两种,一个是 iptables,另一个是 nftablesiptables 大家应该都比较熟悉,nftables 对于大多数人来说也许比较陌生,如果你想进一步了解,请参考 Linux 首次引入 nftables,你可能会喜欢 nftables 的理由

遗憾的是,该方案并不适用于 MacOS 系统,如果你有什么好的建议,欢迎给我提供帮助。

1. 通过 iptables 实现智能分流

这种方案的思路是使用 ipset 载入 chnroute 的 IP 列表并使用 iptables 实现带自动分流国内外流量的全局代理

2. 通过 nftables 实现智能分流

通过策略路由表实现

这种方案的大致思路是先启动一个本地 socks 代理,然后通过工具将 socks 代理伪装成 vpn,最后再通过策略路由进行分流。

有两种工具可以将 socks 代理伪装成 vpn

1. 通过 badvpn 实现智能分流

主要介绍一下 tun2socks,它其实是 badvpn 的一个组成部分。

tun2socks 实现一种机制,它可以让你无需改动任何应用程序而完全透明地将数据用 socks 协议封装,转发给一个 socks 代理,然后由该代理程序负责与真实服务器之间转发应用数据。

使用代理有两种方式,一种是你自己显式配置代理,这样一来,数据离开你的主机时它的目标地址就是代理服务器,另一种是做透明代理,即在中途把原始数据重定向到一个应用程序,由该代理程序代理转发。

tun2socks 在第二种的基础上,完成了socks 协议的封装,并且实现该机制时使用了强大的 tun 网卡而不必再去配置复杂的 iptables 规则。

  • Linux 系统
  • MacOS 系统:暂时无法编译成功,如有人编译成功,望告知

2. 通过 gotun2socks 实现智能分流

gotun2socks 实际上是 badvpngo 语言实现方式,而且更加智能化,它会在启动时自动帮你添加 tuntap 网卡,停止时自动删除该网卡,不需要我们手动添加删除。怎么样,是不是有点小激动呢?是不是从此爱上 go 语言了呢?:relieved:

番外篇

虽然以上各种花式爱国方案都能实现全局智能分流,但对大多数人来说还是太复杂了,令人望而生畏。绝大多数人对于全局智能分流的需求不是很强烈,只需要让某些特殊的应用程序使用代理就行了。有的应用程序可以让你选择使用代理,但很多应用根本不提供这部分的配置。现在为了让一些原本逻辑没考虑/不使用/无法配置代理的软件流量经过代理走,只能通过 hook 的方式劫持系统调用。

利用 Proxifier 就可以实现此功能,在 Proxifier 的帮助下,即使你不懂任何网络原理,通过简单配置也可以轻松地玩转流量转发。并且相比于 VPN(虚拟专用网)全局代理,Proxifier 这种灵活配置还可以实现一些意想不到的功能,例如:监测某个应用的流量或是屏蔽广告等。当然至于最终如何使用,完全取决于您的想像力。

为了更好的使用 Proxifier,我们通过以下示意图来了解一下 Proxifier 工作的原理:

  1. Proxifier 启动后接管系统内所有的网络请求连接;
  2. 接管后的网络请求连接以 Proxifier 配置的规则处理;
  3. Direct (直连) 直接访问外部网络;Proxy (代理) 将请求交给代理服务器处理后再连接到外网;Block (禁止) 则会拦截掉向外发送的请求。

需要说明的是,Proxifier 是收费的,也就几十块钱左右,大家最好还是支持正版。我这里也提供了一个 MacOS 破解版本:Proxifier_2.22.1_xclient.info.dmg。解压密码为:xclient.info,密钥在解压后的文本里。下面的使用教程针对的是 MacOS 用户,Windows 平台类似。

使用教程

接下来配置的三步顺序:

  • 代理服务器配置
  • 代理规则设置
  • 域名解析设置

① 打开软件点击 Proxies:

  • 点击 “Add”
  • 输入本地 shadowshocks 的 ip(默认127.0.0.1)和端口(默认1080)
  • 选择 SOCKS Versin 5
  • OK

接下来的两步配置至关重要,配置错误可能导致代理失败或者循环代理!

② 配置第二步

  • 点击 Rules
  • 选中 localhost,点击 Edit
  • Target hosts 处添加 shadowshocks 代理服务器的 IP 地址(以 123.123.123.123 示例)
  • Action选择Direct(直连)
  • OK

注:此配置步骤允许发送到代理服务器的数据包通过,防止循环代理错误。

配置后如图:

③ 配置第三步

  • 点击 DNS
  • 选择第二个 Resolve hostnames through proxy(通过代理服务器解析域名)
  • OK

如果你已经配置了无污染 DNS,这里可以直接选择 Detect DNS settings automatically,使用系统默认的 DNS。

至此,代理已经配置完毕,接下来我给出一些具体使用场景的示例。平时工作中最常用的需要使用代理的工具就是 git,为了让 git 强制性使用代理,只需在 Proxifier 中创建一个代理规则:

  • 点击 Rules
  • 点击 Add
  • Name 字段填入 git
  • Applications 字段填入 git-remote-https
  • Action 选择 Proxy SOCKS5 127.0.0.1:1080

如果你不知道 Applications 字段该写什么,我可以教你一个方法,在 git clone 的过程中通过下面的命令来寻找使用代理的进程:

$ sudo ps -ef|grep git

  501  5623     1   0  2Dec18 ??         0:00.89 /Applications/Atom.app/Contents/Frameworks/Squirrel.framework/Resources/ShipIt com.github.atom.ShipIt /Users/yangcs/Library/Caches/com.github.atom.ShipIt/ShipItState.plist
  501 77481 92668   0  5:14PM ttys002    0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn git
  501 77184 62902   0  5:14PM ttys003    0:00.07 git clone https://github.com/kubernetes/kubernetes
  501 77185 77184   0  5:14PM ttys003    0:01.58 /usr/local/Cellar/git/2.18.0/libexec/git-core/git-remote-https origin https://github.com/kubernetes/kubernetes
  501 77189 77185   0  5:14PM ttys003    0:00.39 /usr/local/Cellar/git/2.18.0/libexec/git-core/git fetch-pack --stateless-rpc --stdin --lock-pack --thin --check-self-contained-and-connected --cloning https://github.com/kubernetes/kubernetes/
  501 77190 77189   0  5:14PM ttys003    0:01.52 /usr/local/Cellar/git/2.18.0/libexec/git-core/git index-pack --stdin -v --fix-thin --keep=fetch-pack 77189 on MacBookPro --check-self-contained-and-connected --pack_header=2,877904

很明显,git-remote-https 就是我们想找的进程,如果你还不放心,可以将 git 也加入 Applications 字段。

现在如果你通过 git clone 来拉取仓库,就可以看到详细的连接统计信息:

另外一个典型的使用场景就是 Docker。配置方法和 git 类似,我就不演示了,重点提醒一下 Applications 字段值是 com.docker.vpnkit。如果你不放心,可以使用通配符 *docker*。Target Hosts 字段填入 gcr.io; *.docker.io

来,我们来 pull 一个传说中的无法使用代理拉取的 gcr.io 镜像,我就不信这个邪了:

怎么样,还有谁?!

其他还有一些迷之应用,比如 brewSlack 都可以使用这个方法来强制使用代理,大家可以自己探索,再见!

版权

Copyright 2018 Ryan (yangchuansheng33@gmail.com)

MIT License,详情见 LICENSE 文件。