Skip to content

Latest commit

 

History

History
95 lines (80 loc) · 4.47 KB

2021-06-16-旁路由科学上网.md

File metadata and controls

95 lines (80 loc) · 4.47 KB
title date categories tags
旁路由科学上网
2021-06-16 14:52:30 -0700
Tech
RaspBerry Pi
RouterOS
V2ray

准备工作

  1. RouterOS主路由
  2. RaspBerry Pi旁路由
  3. 可出国链路(V2ray)

旁路由设置

参考这里对旁路由进行设置。 V2ray的配置基本没改什么,就是把域名和id换成自己的。

iptable的规则我只设置了以下这部分

# 设置策略路由
ip rule add fwmark 1 table 100 
ip route add local 0.0.0.0/0 dev lo table 100

# 代理局域网设备
iptables -t mangle -N V2RAY
iptables -t mangle -A V2RAY -d 127.0.0.1/32 -j RETURN
iptables -t mangle -A V2RAY -d 224.0.0.0/4 -j RETURN 
iptables -t mangle -A V2RAY -d 255.255.255.255/32 -j RETURN 
iptables -t mangle -A V2RAY -d 192.168.0.0/16 -p tcp -j RETURN # 直连局域网,避免 V2Ray 无法启动时无法连网关的 SSH,如果你配置的是其他网段(如 10.x.x.x 等),则修改成自己的
iptables -t mangle -A V2RAY -d 192.168.0.0/16 -p udp ! --dport 53 -j RETURN # 直连局域网,53 端口除外(因为要使用 V2Ray 的 DNS)
iptables -t mangle -A V2RAY -j RETURN -m mark --mark 0xff    # 直连 SO_MARK 为 0xff 的流量(0xff 是 16 进制数,数值上等同与上面V2Ray 配置的 255),此规则目的是解决v2ray占用大量CPU(https://github.com/v2ray/v2ray-core/issues/2621)
iptables -t mangle -A V2RAY -p udp -j TPROXY --on-ip 127.0.0.1 --on-port 12345 --tproxy-mark 1 # 给 UDP 打标记 1,转发至 12345 端口
iptables -t mangle -A V2RAY -p tcp -j TPROXY --on-ip 127.0.0.1 --on-port 12345 --tproxy-mark 1 # 给 TCP 打标记 1,转发至 12345 端口
iptables -t mangle -A PREROUTING -j V2RAY # 应用规则

另外加了一条

iptables -t nat -I POSTROUTING -j MASQUERADE

RouterOS设置

添加Route

IP->Routers里添加一个Route,Gateway设置成旁路由的IP地址,Distance设置为1,Routing Mark我这里设置为pi(就是个名字,记住就好),其他不变。

如果你的Router List里有也有一个Distance为1的Route(一般是PPPOE),请把它设置为2,否则会冲突!!

设置防火墙规则

主路由负责数据包的分流工作,国外的包转给旁路由处理,国内的包直接处理。 所以首先得让路由器知道哪些IP需要转发,哪些不需要。 执行以下脚本就能获取到国内IP地址的列表

curl -s https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt |sed -e 's/^/add address=/g' -e 's/$/ list=CNIP/g'|sed -e $'1i\\\n/ip firewall address-list' -e $'1i\\\nremove [/ip firewall address-list find list=CNIP]' -e $'1i\\\nadd address=10.0.0.0/8 list=CNIP comment=private-network' -e $'1i\\\nadd address=172.16.0.0/12 list=CNIP comment=private-network' -e $'1i\\\nadd address=192.168.0.0/16 list=CNIP comment=private-network'>cnip.rsc

然后我们把它上传到RouterOS中,在Console执行

import cnip.rsc

打开IP->Firewall->Address Lists 会发现防火墙列表里会多了CNIP的条目。

此外,由于我的V2ray使用了ws,还得添加一条Address Lists,Name一栏填写VPN,Address一栏填入你的域名,方便我们将发送到这个域名的请求直接放行,而不是转发到旁路由,因为那样就循环了。

然后点开IP->Firewall->Mangle,我们来添加几条规则。

非国内IP转发到旁路由规则:

旁路由来的数据包直接转发规则:

V2ray域名直接转发规则:

注意域名转发规则要在其他两条规则之前!(因为规则的优先级是按先后顺序的,域名的IP肯定在国外,会被转到旁路由从而引起循环)

Reference