SuperRouter 自建旁路由

-w988

1. 什么是旁路由

主路由即是我们的网关路由器,负责网络数据的处理与传输,旁路由一般是一个单网卡设备,上级也是我们的网关路由器,我们可以在该设备上开启tcp转发等设置,然后把电脑或其他设备的网关地址改成该旁路由的地址,达到所有流量先通过该设备进行处理,然后在发送到网关路由器。
如果我们在旁路由上对特定的流量进行处理即可实现XX效果。

2. 运行原理

-w720

其中先在旁路由设备上开启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管理
最终实现结果如下:
-w988
-w1455
-w1092

7. 依赖

cloudflared DOH客户端
ipt2socks socks5转透明代理工具
kcpTun加速协议
go-socks5 服务端
frp端口转发神器

标签: none