电信 200M,联通 20M, R7000 刷了 Merlin,国内外分流脚本求助

2015-08-17 13:41:50 +08:00
 saeba1030
鉴于魔都电信实在没节操,拉了 20M 的联通,感觉果然是很爽,打开没被墙的国外网站几乎和国内的没区别。
本想把刚拉没多久的电信拆掉,无奈有合约,必须用满一年。。。物尽其用,就把手头的 R7000 刷了 Merlin ,双 wan 一切正常。但在做国内外 IP 分流的脚本时老是走不通联通线。

线路是这样:
vlan2 ,电信 200M , PPPoE , R7000 的 wan1 拨号连接到光猫,有公网 IP
vlan3 ,联通 20M ,光猫拨号,光猫 Lan 连 R7000 的 wan2 ,作二级路由器使用,网关(光猫) IP : 192.168.1.1

分流脚本原理很简单:
1. 从 ipdeny 下载中国区 IP 的列表
2. 用 ipset 设置中国区 IP 表
3. iptables 规则,对非中国区 IP 设置 mark 1
4. ip rule 和 ip route 配置联通线路由表 250 ,所有 mark 1 的包都走表 250
脚本是从 Merlin 的官方 Wiki 得到的启发,链接: https://github.com/RMerl/asuswrt-merlin/wiki/Using-ipset

现在 1-3 没有问题, 4 成功配置 ip rule ,但 ip route 配置后国内 IP 确实走了电信,而国外 IP 无法从联通的网关出去
配置命令:
ip route add default via 192.168.1.1 dev vlan3 table 250

我一直怀疑是由于联通光猫和电信光猫 ip 一样,从而导致问题,但在 route 中指定走联通( vlan3 )了还是没效果。
求助,这里面的问题到底在哪里?
9592 次点击
所在节点    宽带症候群
23 条回复
neroanelli
2015-08-17 15:14:46 +08:00
提供一下以下命令的执行结果:
ip ro ls
ip ro ls table 250
ip ru ls
iptables-save -t mangle

我觉得你的第 4 条中的 192.168.1.1 网关应该修改为 wan2 的 ip 地址吧。
saeba1030
2015-08-17 16:26:04 +08:00
@neroanelli
在公司,暂时没办法直接给出截图,先手写:
ip ro ls :有关 vlan3 的是 192.168.1.1 dev vlan3 scope link ,你需要哪部分我可以凭记忆给出
ip ro ls table 250 :这个就是 250 的路由,很确定是: default 192.168.1.1 dev vlan3
ip ru ls :除了默认的,就是 from all fwmark 0x01 lookup 250

iptables 能看到规则,规则的写法是:
iptables -t mangle -A PREROUTING -m set ! --match-set CHN -j mark --set-mark 1

你说的把步骤 4 中的 ip 改为 wan2 的 ip 地址,试过了, traceroute 除了第一条是导路由器地址(192.168.8.1 ),第二条开始就是 timeout ;与此同时,电信线一切正常
freewarcraft
2015-08-17 17:32:14 +08:00
mark 一下,我现在用的 R7000+上海电信, LZ 成功了的话我也去装联通。。。
XiaoxiaoPu
2015-08-17 18:31:29 +08:00
直接目的路由就够了,不需要 ipset 和 mark 。
saeba1030
2015-08-17 19:36:36 +08:00
@XiaoxiaoPu 不是很明白,不 ipset 和 mark 的话,怎么区分国内和国外的 IP 呢?
XiaoxiaoPu
2015-08-17 21:21:20 +08:00
路由表不只有 default 一种条目,可以是任意 CIDR 表示的子网,例如 ip route replace 1.0.1.0/24 via 192.168.1.1 dev vlan3 表示目的地址为 1.0.1.0/24 的包走 vlan3
XiaoxiaoPu
2015-08-17 21:25:57 +08:00
@saeba1030
你应该这么设置你的路由表:
ip route replace 1.0.1.0/24 via xxx.xxx.xxx.xxx dev vlan2
ip route replace 1.0.2.0/23 via xxx.xxx.xxx.xxx dev vlan2
ip route replace 1.0.8.0/21 via xxx.xxx.xxx.xxx dev vlan2
...
ip route replace 223.255.252.0/23 via xxx.xxx.xxx.xxx dev vlan2
ip route replace default via 192.168.1.1 dev vlan3
neroanelli
2015-08-17 21:29:20 +08:00
@saeba1030
有详细的执行结果好分析一些。
根据你的情况,我只能猜测一下可能的原因:
1.你执行 traceroute 是在路由中还是在路由下的 PC 中?如果是在路由中,那需要添加 iptables -t mangle -A OUTPUT
2.table 250 中需要添加局域网的路由,否则路由下的 PC 找不到路由,比如 10.10.0.0/24 dev br0 proto kernel scope link src 10.10.0.1 (假设你的局域网段为 10.10.0.0/24 )
3.table 250 中应该还有一条 192.168.1.1 dev vlan3 proto kernel scope link src 192.168.1.x 路由
4.ip ru add from 192.168.1.x lookup table 250

你这个问题其实就是多 wan 策略路由的问题。
saeba1030
2015-08-17 22:29:41 +08:00
@neroanelli
没错,就是多 wan 策略路由
是在路由下的 PC 运行的 traceroute ,路由表等结果如下:(话说 V2EX 怎么传图。。。)
-----------------------------------------------------
table 250:

admin@NETGEAR-2FE8:/jffs/scripts# ip route show table 250
default via 192.168.1.1 dev vlan3
-----------------------------------------------------
ip route:

admin@NETGEAR-2FE8:/jffs/scripts# ip ro
192.168.1.1 dev vlan3 scope link #联通二级路由
116.227.88.1 dev ppp0 proto kernel scope link src 116.227.88.xxx #电信拨号公网 IP
192.168.1.0/24 dev vlan2 proto kernel scope link src 192.168.1.4 #电信 wan 口 IP
192.168.1.0/24 dev vlan3 proto kernel scope link src 192.168.1.5 #联通 wan 口 IP
192.168.8.0/24 dev br0 proto kernel scope link src 192.168.8.1 #路由器 IP
127.0.0.0/8 dev lo scope link
default via 116.227.88.1 dev ppp0
default via 192.168.1.1 dev vlan2 metric 1

-----------------------------------------------------
iptables:

admin@NETGEAR-2FE8:/jffs/scripts# iptables -L -t mangle
Chain PREROUTING (policy ACCEPT )
target prot opt source destination
MARK all -- anywhere 116.227.88.xxx MARK set 0xb400
MARK all -- anywhere anywhere ! match-set CHN dst MARK set 0x1

-----------------------------------------------------
ip rules:

admin@NETGEAR-2FE8:/jffs/scripts# ip rule
0: from all lookup local
32765: from all fwmark 0x1 lookup 250
32766: from all lookup main
32767: from all lookup default

-----------------------------------------------------
Traceroute - 163.com
C:\Users\xxx>tracert -d www.163.com

通过最多 30 个跃点跟踪
163.xdwscache.glb0.lxdns.com [114.80.143.158] 的路由:

1 <1 毫秒 <1 毫秒 <1 毫秒 192.168.8.1
2 96 ms 218 ms 194 ms 116.227.88.1
3 5 ms 6 ms 3 ms 124.74.227.129
4 7 ms 3 ms 3 ms 124.74.215.101
.....

-----------------------------------------------------
C:\Users\xxx>tracert -d www.microsoft.com

通过最多 30 个跃点跟踪
e10088.ca.s.tl88.net [23.53.200.154] 的路由:

1 <1 毫秒 <1 毫秒 <1 毫秒 192.168.8.1
2 * * * 请求超时。
3 * * * 请求超时。
4 * * * 请求超时。
......

-----------------------------------------------------
试了你建议的方案,结果还是一样 >_< 希望这个输出能有用。
coffeecat
2015-08-17 22:44:57 +08:00
只要你有个海外 vps ,直接用 mwan3 ,简单设置,灰常好用, http://www.v2ex.com/t/201805
neroanelli
2015-08-17 23:04:16 +08:00
ip ro add 192.168.1.0/24 dev vlan3 proto kernel scope link src 192.168.1.5 table 250

ip ro add 192.168.8.0/24 dev br0 proto kernel scope link src 192.168.8.1 table 250
ooscrewyou
2015-08-18 09:42:12 +08:00
网件 R7000?我看网上就一个 WAN 口啊
lj0014
2015-08-18 11:27:59 +08:00
mark 下,家里也是 r7000 ,现在电信双拨
saeba1030
2015-08-18 12:11:36 +08:00
@coffeecat 谢谢,之前看过你这个帖子,但不想刷 openwrt :D
saeba1030
2015-08-18 12:13:08 +08:00
@neroanelli
这两条昨晚都试了,但还是不通。应该跟 R7000 的 Merlin 固件实现方式有关。
我已经曲线救国搞定了,下午贴解决方案,再次感谢!
Dxy00
2015-08-18 13:00:21 +08:00
“ vlan3 ,联通 20M ,光猫拨号,光猫 Lan 连 R7000 的 wan2 ,作二级路由器使用,网关(光猫) IP : 192.168.1.1 ”这条有误吧。

个人觉得不需要划分多个 vlan ,关闭联通光猫的 DHCP ,开启 Upnp 和必要的转发,光猫 IP 设置为 192.168.1.2 ,和你路由器的 IP (192.168.1.1 )区分开,然后路由器 lan 口接联通光猫 lan 口,这样你就有两个网关可以用了, 192.168.1.1 和 192.168.1.2 ,然后路由器默认网关设置为 192.168.1.2 (联通网关), iptables 设置中国段的 IP 走 192.168.1.1 就行了。


其实有双 wan 口完全可以把两个光猫都改为桥接模式,两个 WAN 口拨号,得到双网关,之后的设置和上面一样。
如果联通线路一直用 vpn 的话,还可以联通光猫拨号,路由 WAN2 接光猫 LAN ,拨 vpn ,得到 vpn 网关,之后的设置和上面一样。

只要搞清楚哪个 IP 段走哪个网关,然后 iptables 配一下就很容易,原理就是这样
saeba1030
2015-08-18 13:29:35 +08:00
@Dxy00 感谢你提供另外一种思路,我这种方式的原理其实和你一样,只是路由结构上不同。我的已经实现,你的应该也可以,我就不折腾了 :D
saeba1030
2015-08-18 13:35:19 +08:00
@ooscrewyou 刷了 Merlin ,可以把任意一个 Lan 用作 wan2
saeba1030
2015-08-18 14:19:12 +08:00
@neroanelli
对比我们讨论的方案和附言里曲线救国中我提到的可以走通的默认联通路由表 table 200 ,区别就是多了一条:
116.227.88.1 dev ppp0 proto kernel scope link src 116.227.88.xxx #电信拨号公网 IP

百思不得其解为什么要有这句才会通,理论上这条电信线的路由不需要出现在这里。
所以我只能把黑锅扔给固件了 :D
saeba1030
2015-08-18 14:22:49 +08:00
@XiaoxiaoPu
抱歉晚回复了,你的方案其实就是添加静态路由。这会使得路由表无比庞大,对 R7000 这种家用路由器来说负担太大了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/213752

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX