流量中继代理原理及实验
内部网络如何通过代理访问其他网络?想必一些朋友曾经或现在已经有了一些妙招,但这些妙招是如何实现的呢?今天笔者就带大家解开其中的秘密。
中继代理原理
正常网络访问
首先我们先了解一下正常的网络访问,如图,内部客户端通过防火墙访问外部云服务,但随着策略规则的增加,内部客户端通过防火墙访问外部云服务的这条链路被阻断,如下图所示。
代理网络访问
此时,有人会选择使用代理来访问外部云服务,这里的代理访问一般都是加密的,但也不排除使用socks5之类的代理,如图所示。但这类代理一般建立在外部网络上,而内部客户端如想访问该代理服务器,也会通过防火墙,即使是加密访问代理服务器,也有可能被阻断,如下图所示。
中继代理网络访问
当代理网络访问受阻时,有人发现只有内部客户端访问外部网络时会被阻断,而内部服务器访问外部网络一般不会被阻断,因此有人选择在内部网络中搭建一个代理服务器,以下简称内部服务器,由内部服务器进行加密代理。
这种中继代理网络访问已经比较靠谱了,但寻找合适的内部服务器却是大难题,因为你不知道哪个内部服务器可以通过防火墙,什么时候又不可以通过。因此存在这种可能性,经过此内部服务器的流量不知道什么时候就会被阻拦,如下图所示。
具体而言,这类内部服务器一般指联通的AS9928骨干网(原网通国际骨干网)。
特殊中继代理网络访问
普通中继代理存在很多不可靠性,此时有人发现大型云厂商因为会提供多网络的服务器,在这些服务器内部通常使用私有网络连接,这些私有网络不经过防火墙,因此比普通中继网络代理稳定了许多。
这种私有网络分为两类,一类是IPLC(国际专线),根据中国电信的介绍,IPLC具有严格的带宽保证、带宽独享、全透明的端到端,它由物理的电缆构成,可承载多种业务,例如以太网,一条物理电缆可以承接多用户,但这些用户的数据在时间上是隔离的,即时分复用。另一类是IEPL(国际以太网专线服务),根据中国电信的介绍,它基于MSTP平台,直接对客户提供以太网服务。
实验
由于笔者没有服务器,因此只能在vmware虚拟机上进行实验,实验系统均为debian 11.5.0版本,代理软件为v2ray。
网络划分如下:
- vmnet2,192.168.70.0/24网段,代表纯内网。
- vmnet1,192.168.52.0/24网段,代表云厂商私有网络。
- vmnet0,192.168.10.0/24网段,代表云服务网络。
虚拟机配置
- inner_client,表示内部客户端,网卡1,ens33:vmnet2,192.168.70.100。
- inner_server,表示内部服务器,网卡1,ens33:vmnet2,192.168.70.200,网卡2,ens34:vmnet1,192.168.52.200
- out_server,表示外部服务器,网卡1,ens33:vmnet1,192.168.52.210,网卡2,ens34:vmnet0,192.168.10.210
具体方案如图:
out_server配置
/etc/network/interfaces
auto ens33
iface ens33 inet static
address 192.168.52.210
netmask 255.255.255.0
auto ens34
iface ens34 inet static
address 192.168.10.210
netmask 255.255.255.0
gateway 192.168.10.1
/etc/v2ray/config.json
{
"log":{
"access":"/var/log/v2ray/access.log",
"error":"/var/log/v2ray/error.log",
"loglevel":"debug"
},
"inbounds":[
{
"port":10086,
"listen":"192.168.52.210",
"protocol":"socks",
"settings":{
"auth":"noauth",
"udp":true,
"ip":"192.168.52.210",
"accounts":[
{
"user":"test",
"pass":"root"
}
]
}
}
],
"outbounds":[
{
"protocol":"freedom",
"settings":{
}
}
]
}
此时可通过下面的方式进行验证:
curl -i -x socks5://test:root@192.168.52.210:10086 http://baidu.com
如果返回下面的内容,则表示成功。
HTTP/1.1 200 OK
Date: Fri, 07 Oct 2022 03:06:07 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Sat, 08 Oct 2022 03:06:07 GMT
Connection: Keep-Alive
Content-Type: text/html
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
inner_server配置
/etc/network/interfaces
iface ens33 inet static
address 192.168.70.200
netmask 255.255.255.0
auto ens34
iface ens34 inet static
address 192.168.52.200
netmask 255.255.255.0
gateway 192.168.52.1
/etc/v2ray/config.json
{
"log":{
"access":"/var/log/v2ray/access.log",
"error":"/var/log/v2ray/error.log",
"loglevel":"debug"
},
"inbounds":[
{
"port":10084,
"protocol":"vmess",
"settings":{
"clients":[
{
"id":"b831381d-6324-4d53-ad4f-8cda48b30811",
"alterId":64
}
]
}
},
{
"port":10085,
"listen":"192.168.70.200",
"protocol":"socks",
"settings":{
"auth":"noauth",
"accounts":[
{
"user":"test",
"pass":"root"
}
],
"udp":true,
"ip":"192.168.70.200",
"userLevel":0
}
}
],
"outbounds":[
{
"protocol":"socks",
"settings":{
"servers":[
{
"address":"192.168.52.210",
"port":10086
}
]
}
}
]
}
由于这台服务器目前已经不能连接任何外部网络,因此拿不到dns,所以只能连接192.168.10.0/24网络下的服务进行测试,这里笔者用了路由器的地址进行测试,大家可以自行搭建服务测试。
curl -i -x socks5://test:root@192.168.70.200:10085 http://192.168.10.1
或者使用这台虚拟机上的firefox进行测试,在firefox配置的网络设置中,手动配置代理,socks服务器选择192.168.70.200,端口记得填写为10085。然后启用使用SOCKS v5时代理DNS查询,启用启用基于HTTPS的DNS,提供商选择https://dns.alidns.com/dns-query。此时就可以使用firefox访问百度了。
inner_client配置
/etc/network/interfaces
auto ens33
iface ens33 inet static
address 192.168.70.100
gateway 192.168.70.1
netmask 255.255.255.0
/etc/v2ray/config.json
{
"log":{
"access":"/var/log/v2ray/access.log",
"error":"/var/log/v2ray/error.log",
"loglevel":"debug"
},
"inbounds":[
{
"port":1080,
"listen":"0.0.0.0",
"protocol":"socks",
"settings":{
"auth":"noauth",
"udp":true,
"ip":"192.168.70.100"
}
}
],
"outbounds":[
{
"protocol":"vmess",
"settings":{
"vnext":[
{
"address":"192.168.70.200",
"port":10084,
"users":[
{
"id":"b831381d-6324-4d53-ad4f-8cda48b30811",
"alterId":64
}
]
}
]
}
}
]
}
由于这台虚拟机目前已经不能连接任何外部网络,因此拿不到dns,所以只能连接192.168.10.0/24网络下的服务进行测试,这里笔者用了路由器的地址进行测试,大家可以自行搭建服务测试。
curl -i -x socks5://test:root@192.168.70.100:1080 http://192.168.10.1
或者使用这台虚拟机上的firefox进行测试,在firefox配置的网络设置中,手动配置代理,socks服务器选择192.168.70.100,端口记得填写为1080。然后启用使用SOCKS v5时代理DNS查询,启用启用基于HTTPS的DNS,提供商选择https://dns.alidns.com/dns-query。此时就可以使用firefox访问百度了。
小结
由于是手动配置IP,因此out_server需要配置系统dns,调整/etc/systemd/resolved.conf
,在其中增加DNS指向223.5.5.5
由于代理都作用在应用层,并且有加解密任务,因此网速不会特别高,取决于cpu的执行速度,以及是否有硬件加解密芯片。
这个技术掌握了可以经常外面混,不过还是要注意安全