将所有互联网连接通过 SOCKS 代理进行隧道传输
一个故事
让它在有缺陷的 Linux 系统上运行
结语
一个故事
问题的根源
几年前我住在古巴的时候,唯一能上网的方式就是使用我工作单位或学校设置的代理服务器。这些网络的管理员会尽可能严格地限制你能访问的内容,所以上班的时候你根本没法浏览Facebook或其他社交媒体,但这还不是最主要的问题。由于古巴被美国禁运,很多重要的资源,比如Docker镜像、GitLab和谷歌的Android编程资源,都被古巴IP屏蔽了。结论:想上网就必须用VPN。因为没钱
租VPS(古巴没有信用卡),我只能大量使用Tor、YourFreedom,甚至如果有人借给我VPS的访问权限,我还会用SSH隧道。总之,我用了好几种方法来绕过网络审查。大多数情况下,这些连接最终都会建立在我电脑或本地可信网络上的 SOCKS 代理上,我可以轻松地通过浏览器或在多个使用tsocks或proxychains 的应用程序中使用它们。但解决这个问题的终极目标是让所有来自电脑的流量都仅通过 SOCKS 代理进行隧道传输,而我一直未能实现这一点。直到现在 :-)
最新进展
我万万没想到,这么多年过去了,我的朋友也会遇到同样的问题。就目前而言,我认为有两个不错的替代方案。
首先是sshuttle,我非常喜欢它。它曾经帮了我很多忙,但它也有个缺点:它只能在 SSH 环境下运行,而古巴唯一的电信公司目前屏蔽了 SSH,所以我们无法使用它。
其次是Outline,这个工具也很棒。我查阅了很多资料,因为它似乎被广泛用于绕过网络审查,而它实际上只是对一套非常优秀的工具进行封装。它主要通过建立Shadowsocks连接来配置你的设备,使其像 VPN 一样工作。这看起来是正确的选择,但不知何故,它在我的朋友的电脑上却无法正常工作。
为什么不直接使用VPN呢?
古巴对公民使用各种手段绕过其审查和管控非常不满,因此他们设法封锁了像 OpenVPN 这样的协议。任何使用易于识别的握手/标头的 VPN 都很容易被屏蔽。我们可以对 VPN 进行一些混淆处理,但这需要用户在他们那边也进行一些设置,这对技术娴熟的人来说“没问题”,但对老年人来说就不方便了。在大多数情况下,Outline 就足够了,因为 Shadowsocks 很难被识别或屏蔽。
让它在有缺陷的 Linux 系统上运行
大多数人会选择重装系统再试一次,但这次行不通。而且,我真的很想再次解决这个问题,所以既然 Outline 是最合适的选择,我就决定深入了解一下它的底层工作原理。Outline 是开源的(https://github.com/Jigsaw-Code/outline-client),所以这项工作相对容易。
遗憾的是,我们无法在我朋友的电脑上重现这个问题,但我们成功复现了 Outline 团队的操作,以下是相关指南:
你就直接告诉我怎么做吧!
- 如果还没有设置 Shadowsocks 服务器,请启动一个
ss-server -p 6276 -k password。从现在开始,该服务器的 IP 地址将是 $server_ip。 - 安装该
shadowsocks-libev软件包。这将为您提供所有 Shadowsocks 工具,并设置连接到Shadowsocks服务器的本地代理。 - 安装
badvpn-tun2socks。此应用程序将使用Linux 中的Tun网络接口对您的所有数据进行隧道传输。要安装它,请克隆其存储库https://github.com/ambrop72/badvpn ,然后按照此处的编译和安装说明进行操作。 - 现在,让我们创建一个新的tun网络接口
ip tuntap add dev tun0 mode tun user my_user,为其添加一个 IP 地址ip a add 10.0.0.1/24 dev tun0,并启动该接口ip link set dev tun0 up。 - 连接到我们的 Shadowsocks 服务器
ss-local -s $server_ip -p 6276 -k password -l 1080并进行测试curl --socks5 socks5://localhost:1080 https://myip.wtf/json。如果显示了您的服务器 IP 地址,则表示连接正常。 - 启动badvpn-tun2socks
tun0以开始将发送到 SOCKS 代理的数据进行隧道传输badvpn-tun2socks --tundev tun0 --netif-ipaddr 10.0.0.2 --netif-netmask 255.255.255.0 --socks-server-addr 127.0.0.1:1080。之后,您应该能够 ping 通虚拟网关ping 10.0.0.2并获得成功结果。 - 添加网络路由以确保您的 SOCKS 代理仍然能够使用您的默认网关进行连接。
ip r a $server_ip via $default_gateway - 添加一条默认路由,其跃点数低于 NetworkManager 为默认网关提供的跃点数
ip r a default via 10.0.0.2 metric 10。这样就完成了。之后,Linux 机器上的所有连接都会路由到tun0接口,进而路由到 SOCKS 代理。快速curl https://myip.wtf/json检查一下你是否在 Shadowsocks 服务器所在的位置,然后就可以去喝杯咖啡了。
结语
不,如果 Outline 对你来说运行正常,你可能不需要这些,但对我来说,最终解决这个问题并帮助我的朋友真的很有成就感。我们没能找到 Outline 对他不起作用的原因,但我们成功地几乎完全复现了 Outline 的功能,而且这个过程很有趣。
你喜欢这篇文章吗?给我点个赞(<3),并分享给你的极客朋友们吧 :-)