SuperRouter 自建旁路由
SuperRouter 自建旁路由
1. 什么是旁路由
主路由即是我们的网关路由器,负责网络数据的处理与传输,旁路由一般是一个单网卡设备,上级也是我们的网关路由器,我们可以在该设备上开启tcp转发等设置,然后把电脑或其他设备的网关地址改成该旁路由的地址,达到所有流量先通过该设备进行处理,然后在发送到网关路由器。
如果我们在旁路由上对特定的流量进行处理即可实现XX效果。
2. 运行原理
其中先在旁路由设备上开启proxy Client链接到远程的proxy Server,并在本地开启socks5代理,然后在使用ipt2socks把普通的socks5代理转换成iptable支持的透明代理
其中proxy Sever使用的是kcpTun+socks5(不支持udp),然后针对不同的内网IP进行指定不同的代理,如果针对不同的远程IP进行分流,则可以使用ipset进行增加规则,在通过iptable的match进行匹配。
3. 配置
1. 开启远程代理
这里使用的是我自己修改的kcptun,内置了socks5代理,执行运行
nohup ./kcp_server &
默认会监听29900(udp)端口,作为kcp的通讯端口,监听127.0.0.1:12489(tcp)作为本地s5,
客户端运行
nohup ./kcp_server -r remote_addr:29900 -l 127.0.0.1:65000 > /dev/null &
这样就会把远程的12498的s5转发到本地的65000(tcp)上
测试是否成功可使用
curl ipinfo.io -x socks5://127.0.0.1:65000
查看是否可以正常访问,若没问题则代表代理链接成功。
2. 开启本地透明代理
使用开源项目 ipt2socks
nohup ipt2socks -s 127.0.0.1:65000 -p 55000 -l 0.0.0.0 -R > /dev/null &
即可实现把本地的65000上的s5转化成监听在0.0.0.0:55000(tcp)上的透明代理
3. 配置iptables指定设备走代理上网
首先需要忽略掉本地IP的访问,否则会导致本地网络无法访问到旁路由设备
...
private $ips=array(
"10.10.0.0/16",
"10.0.0.0/8",
"169.254.0.0/16",
"172.16.0.0/12",
"192.168.0.0./16",
"127.0.0.1/32",
"224.0.0.0/4",
"240.0.0.0/4"
);
...
public function runIPTABLE(){
//先通过ulimit 设置可同时打开的文件句柄数量,并清空之前的iptable的nat记录
$cmd="ulimit -n 65535;iptables -t nat -F;";
system($cmd);
foreach($this->ips as $ip){
$cmd="iptables -t nat -I PREROUTING -d {$ip} -j RETURN;";
system($cmd);
}
}
在设定指定IP走55000这个透明代理
iptables -t nat -A PREROUTING -p tcp -s 192.168.1.100 -j REDIRECT --to-ports 55000
这里的192.168.1.100为需要通过代理上网的内网客户机IP
到这里,所有192.168.1.100的所有出口流量都会被转发到本地55000进行处理,也就是会走之前配置的proxy Sever
4. 使用DOH
因为该代理只代理了tcp流量,所以我们DNS解析实际还是可以被干扰,这里我们使用cloudflare提供的DOH服务器和起dns转发工具
cloudflared proxy-dns --address 0.0.0.0 > /dev/null &
5.国内外流量分流
如果需要国内流量不通过该proxy进行转发,那么我们需要绕过所有的国内ip
public function ipset_china(){
$check='ipset -N china hash:net';
$data=shell_exec($check);
if(stripos($data,'already')!==false) return;
// 通过ipset设置一个分组,并把所有中国的IP倒入进去
$cmd=array(
'ipset destroy china',
'ipset -N china hash:net',
'rm temp/cn.zone',
'wget -O temp/cn.zone http://www.ipdeny.com/ipblocks/data/countries/cn.zone',
'for i in $(cat ./temp/cn.zone ); do ipset -A china $i; done',
);
foreach($cmd as $c){
system($c);
}
}
public function connect_nochina($iptPort,$clientIp){
$this->disconnect($clientIp);
$this->ipset_china();
$cmd=array(
// 绕过国内IP
"iptables -t nat -A PREROUTING -p tcp -s {$clientIp} -m set --match-set china dst -j RETURN",
"iptables -t nat -A PREROUTING -p tcp -s {$clientIp} -j REDIRECT --to-ports {$iptPort}"
);
foreach($cmd as $c){
system($c);
}
}
6. 使用
现在只需要把客户机的ip分配改为手动,最后把网关写成该旁路由设备的ip地址,并把dns也改成该设备的IP即可。
3. 自动化
机遇上面的基础上,我们可以打造一套自己的流量转发系统
在该基础下也写了Frp的Gui管理
最终实现结果如下:
7. 依赖
cloudflared DOH客户端
ipt2socks socks5转透明代理工具
kcpTun加速协议
go-socks5 服务端
frp端口转发神器