之前在《什么是软路由?硬路由又是什么?都有什么特点?》中提到了一点透明代理,现在就再展开讲讲这个透明代理在科学上网中发挥的作用。

使用代理的最简单方法

最简单的方法当然是下载一个XXVPN或者是XX加速器,然后打开开关就可以网上冲浪了。这些软件在手机端中一般会调用系统的VPN功能来将流量交给代理软件处理,而电脑端一般是自动配置一下系统代理功能,让系统代理指向代理软件。这种用法不难,即使是使用机场也只是多了一个配置订阅的步骤。

这里有些缺点,那就是要为所有的设备安装软件,手机和电脑还好说,电视这类的要怎么才能翻出去呢?好吧,电视大多都是特殊一点的安卓系统,像安卓手机那样安装软件就是了,但这只是个开始。一般没什么人在电视上使用VPN功能,万一厂家把VPN相关的功能精简掉了怎么办?问题不大!安卓也有系统代理功能,里面写上代理软件的IP和代理端口也能用,就是用电视遥控器打字非常麻烦,这要是还得输入订阅链接岂不是要一个一个字符打到天荒地老?要是不留神打错了几个就……如果是无法安装代理软件的VR头显,游戏机呢?

显然给每一个设备安装软件的方法只适合不常翻墙的用户。

该如何减轻这繁琐的配置项目呢?

聪明的你很快就发现了,几乎所有操作系统上都有代理服务器的设置,那么可不可以在其中一台上面安装代理软件,然后把所有需要科学上网的设备的代理服务器指向那台唯一安装的代理软件的设备?当然可以!只要别忘了开启允许局域网选项。

这样一来就不需要繁琐的为每一台设备安装软件了,只需要一点配置就能让同局域网下的其他设备共享科学上网。

那这种办法有没有缺点呢?也有。系统的其他软件可以检测到你有没有配置系统代理,而且用不用系统代理也要看软件自己的设置,比如游戏一般不会使用系统代理。

这该怎么办?有没有办法在不惊动系统各类软件的情况下,悄无声息的将所有的流量交给代理客户端处理呢?

透明代理

你仔细寻找着符合上述要求的用法,你发现家中的路由器似乎很适合做这项工作。你看,它刚好处于局域网的枢纽,家里所有的设备所有的软件发出的所有数据都需要经过路由器处理,只要不破坏软件的数据谁会知道数据包被送到其他地方做处理了呢?

理论上很合理,但是要怎么实现呢?你在互联网上找到了两个钟方式,一种是截取全部流量的虚拟网卡以及截取大多数常用流量的redirect与tproxy方式。但是想要实现这两种方式需要一台Linux系统的路由器完成,你二话不说为家里安装了软路由(能解锁SSH的路由器也行),折腾可以继续了。

常见的TUN,TAP就是虚拟网卡。原理不复杂,在系统中虚拟一个网卡然后调高虚拟网卡的优先级,这样所有的流量都会使用虚拟网卡发送了。

redirect和tproxy是Linux的内核功能,通过iptables/nftables命令使用,redirect就是一种特殊一点的NAT,通过转换目标端口将指定流量转发给本机的某个端口(比如代理软件的redirect端口),缺点就是只能转发TCP流量。
tproxy则是专门用来透明代理的,它不使用NAT,性能损失小,还同时支持TCP和UDP,堪称完美。

现在有截取流量的能力了,因为格式不同,代理软件不太可能直接处理这些截取到的流量,代理软件一般有Socks5或者是HTTP/HTTPS的代理端口,HTTP类代理有限制不考虑它,Socks5既支持TCP也支持UDP,它是个很理想的接收端口。

现在只需要将虚拟网卡、redirect和tproxy的流量转换到socks5类型的流量即可。我们只需要利用tun2socks或者ip2socks这类软件就可以将相关的流量转换给代理软件了!

利用其他软件将流量转换后发给代理软件的方法还是有些麻烦,有没有更方便的用法?

也有,需要其他软件转换只是早期代理软件不支持的用法,现在各类的代理软件如:Clash、V2ray、Xray、Sing-Box等都支持通过虚拟网卡、redirect以及tproxy的方式接收流量。

现在,在路由器上安装了透明代理的你如愿以偿,终于可以直接在打开电视后直接访问油管了,不再需要那些繁琐的操作。甚至不用担心机场的客户端数量限制,因为所有的设备都以路由器的名义科学上网,只占用一台设备而已。