V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
saeba1030
V2EX  ›  宽带症候群

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

  •  
  •   saeba1030 · 2015-08-17 13:41:50 +08:00 · 9544 次点击
    这是一个创建于 3379 天前的主题,其中的信息可能已经有所发展或是发生改变。
    鉴于魔都电信实在没节操,拉了 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 )了还是没效果。
    求助,这里面的问题到底在哪里?
    第 1 条附言  ·  2015-08-17 14:41:36 +08:00
    我感觉发错区了。。。求版主帮忙移动到 Linux 区
    第 2 条附言  ·  2015-08-18 13:54:30 +08:00
    感谢大家的热心回复,特别是 @neroanelli ,这里我说下我的解决方案
    首先, R7000 原厂只有 1 个 wan 口,要刷 Merlin 固件后,把任意一个 Lan 划分成 wan2 。并开启 SSH 和 custom user script ,如何开启见官方 wiki : https://github.com/RMerl/asuswrt-merlin/wiki/User-scripts

    方案的目的是实现国内 IP 走电信,国外 IP 走联通,思路很简单:
    1. 区别国内 IP 和国外 IP
    2. 配置路由表,指定国内 IP 走电信,国外走联通

    实现方法:
    针对思路 1 :
    从 ipdeny 站点下载中国 ip 列表,把这些 IP 用 ipset 设置到一个组里。代码可以从官方 wiki : https://github.com/RMerl/asuswrt-merlin/wiki/Using-ipset 第一段示例中找到。当然你也可以用自己的方式,我比较懒。。。

    针对思路 2 :
    原本想自己配置路由表,顺便熟悉下如何配置和路由表的作用。但遇到了主贴中描述的问题,理论上这个方案在一般的多 wan 路由器上是可用的,但由于 Merlin 的 wan2 是 vlan 划出来的,可能在具体实现上有所区别。

    Anyway ,最后我决定曲线救国了,是一开始我就想这么干但是作为一个技术宅又不甘心的方式
    a ) 在 R7000 的 web ui 中把双 wan 设置为 Load Balance (负载均衡)
    b ) 在上述模式下,会生成 2 个默认路由表,分别对应 2 个 wan , table 100 , table 200
    c ) SSH 连上 R7000 ,用 iptables 把列表内的国内 IP 打 mark 1 ,国外标签打 mark 2
    iptables -t mangle -A PREROUTING -m set --match-set CHN -j MARK --set-mark 1 #国内 IP
    iptables -t mangle -A PREROUTING -m set ! --match-set CHN -j MARK --set-mark 2 #国外 IP
    d ) 添加路由规则,国内走 table 100 ,国外走 table 200
    ip rule add fwmark 1 table 100
    ip rule add fwmark 2 table 200

    就是这样,不需要重新配置路由表,添加规则使用默认路由表。
    如有不明白的,可以在贴中提问。完整的脚本代码就不贴了,重要的部分都写上了。

    欢迎大家转载和分享,用魔都电信的应该有不少人想这么干,但请注明出处
    23 条回复    2015-08-18 22:40:27 +08:00
    neroanelli
        1
    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
        2
    saeba1030  
    OP
       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
        3
    freewarcraft  
       2015-08-17 17:32:14 +08:00
    mark 一下,我现在用的 R7000+上海电信, LZ 成功了的话我也去装联通。。。
    XiaoxiaoPu
        4
    XiaoxiaoPu  
       2015-08-17 18:31:29 +08:00 via Android
    直接目的路由就够了,不需要 ipset 和 mark 。
    saeba1030
        5
    saeba1030  
    OP
       2015-08-17 19:36:36 +08:00
    @XiaoxiaoPu 不是很明白,不 ipset 和 mark 的话,怎么区分国内和国外的 IP 呢?
    XiaoxiaoPu
        6
    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
        7
    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
        8
    neroanelli  
       2015-08-17 21:29:20 +08:00   ❤️ 1
    @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
        9
    saeba1030  
    OP
       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
        10
    coffeecat  
       2015-08-17 22:44:57 +08:00
    只要你有个海外 vps ,直接用 mwan3 ,简单设置,灰常好用, http://www.v2ex.com/t/201805
    neroanelli
        11
    neroanelli  
       2015-08-17 23:04:16 +08:00 via Android   ❤️ 1
    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
        12
    ooscrewyou  
       2015-08-18 09:42:12 +08:00
    网件 R7000?我看网上就一个 WAN 口啊
    lj0014
        13
    lj0014  
       2015-08-18 11:27:59 +08:00
    mark 下,家里也是 r7000 ,现在电信双拨
    saeba1030
        14
    saeba1030  
    OP
       2015-08-18 12:11:36 +08:00
    @coffeecat 谢谢,之前看过你这个帖子,但不想刷 openwrt :D
    saeba1030
        15
    saeba1030  
    OP
       2015-08-18 12:13:08 +08:00
    @neroanelli
    这两条昨晚都试了,但还是不通。应该跟 R7000 的 Merlin 固件实现方式有关。
    我已经曲线救国搞定了,下午贴解决方案,再次感谢!
    Dxy00
        16
    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
        17
    saeba1030  
    OP
       2015-08-18 13:29:35 +08:00
    @Dxy00 感谢你提供另外一种思路,我这种方式的原理其实和你一样,只是路由结构上不同。我的已经实现,你的应该也可以,我就不折腾了 :D
    saeba1030
        18
    saeba1030  
    OP
       2015-08-18 13:35:19 +08:00
    @ooscrewyou 刷了 Merlin ,可以把任意一个 Lan 用作 wan2
    saeba1030
        19
    saeba1030  
    OP
       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
        20
    saeba1030  
    OP
       2015-08-18 14:22:49 +08:00
    @XiaoxiaoPu
    抱歉晚回复了,你的方案其实就是添加静态路由。这会使得路由表无比庞大,对 R7000 这种家用路由器来说负担太大了
    ganxiao1986
        21
    ganxiao1986  
       2015-08-18 15:28:05 +08:00
    XiaoxiaoPu
        22
    XiaoxiaoPu  
       2015-08-18 18:31:44 +08:00 via Android
    @saeba1030 linux 路由效率很高,即使是路由器也可以高效转发,只是加载路由表比较慢而已
    neroanelli
        23
    neroanelli  
       2015-08-18 22:40:27 +08:00 via Android
    @saeba1030 恩,用的是 op 的固件,可能有些差异。我的实现方案和 @ganxiao1986 的差不多。我现在是 3 拨均衡以及一条 L2TP/IPsec 线路,很稳定。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2609 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:40 · PVG 13:40 · LAX 21:40 · JFK 00:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.