Simple Policy Routing on OpenWrt

Notice

This is an old article and only available in Chinese. If you need a translation, please leave a comment and I will do my best to provide it as soon as possible.

上学期期末移动宽带质量不断劣化,我们宿舍被迫转向电信宽带。为了解决那个该死的防共享机制,我自费购买了一个坑爹的破解路由器,本质就是一个替换了 PPP 的 OpenWrt 路由器。选择购买而不是自己动手破解的主要原因是不想在这上面消耗太多精力,既然有现成的解决方案,那就掏钱解决了(

那个破解的路由器很渣,是个看起来就不像那种能拖宿舍里所有电子产品的破路由,所以我只将其作为拨号路由,而主要的 NAT 工作和 Access Point 仍然交给 WNDR4300 来完成。电信的路由器 LAN IP: 192.168.43.1 并开启 DHCP,然后 WNDR 4300 直接将 WAN 接至任意一个 LAN 口,完成后顺手关掉了破解路由器的 WiFi

当然大家都知道电信的国际出口有多惨,上个 Google 查东西都让人想砸电脑(不),同时宿舍移动的接口不用白不用。于是决定尝试一下组两个网关,让部分海(fan)外(qiang)流量走江苏移动,其余的走江苏电信,来提升整体的网络体验

首先是要修改 WNDR4300 上的交换机配置,让他将一个 LAN 口以 WAN 的形式工作:在 OpenWrt 的交换机配置界面,添加一个 VLAN,ID 任意,将 CPU 和准备当作 WAN 的那个口分别设置为 tagged 和 untagged,剩下的其他端口设置成关就好了。

image

然后去网络 -> 接口,添加一个类型为 PPPoE 的接口,物理设置接口为刚刚创建的 VLAN 接口。因为路由器的主要接口仍然是之前的 DHCP 客户端,所以我们要去掉高级设置中的使用默认网关。填写好 PAP/CHAP 用户名/密码后,提交变更。不出意外就成功的拨号完毕,下面需要的就是如何策略路由了。

image

使用 SSH 连接到路由器,更新软件包并安装 iproute2。完成后输入 ip route,可以看到类似这样的一行结果:

1
10.49.196.1 dev pppoe-cmcc  proto kernel  scope link  src 10.49.199.127

很容易想到 10.49.196.1 就是移动 PPPoE 的网关了,我们只要将部分网段的默认路由修改到这个网关上,就可以实现高速访问国际互联网了(

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/sh

INT=pppoe-cmcc
TABLE=cmcc

DEST=`ip route show dev $INT | head -n 1 | awk '{print $1}'`

# ConoHa JP
ip route add 133.130.96.0/19 via $DEST
ip route add 133.130.88.0/21 via $DEST
ip route add 133.130.126.0/24 via $DEST

# Linode JP
ip route add 106.185.24.0/21 via $DEST
ip route add 106.186.16.0/20 via $DEST

# CCZU CERNET
ip route add 219.230.144.0/20 via $DEST

# JS Cernet
ip route add 211.65.74.0/24 via $DEST

# CCZU Spoc
ip route add 202.195.100.0/24 via $DEST

嗯,最基本的目的已经达到了。无压力播放 1080P 清晰度的油管视频最棒了(

不过不久又有新的问题了,江苏电信的校园宽带采用的是动态密码,PPPoE 断开后因为密码失效,无法自动恢复接口。这对于寝室一个玩梦幻西游的同学来说是非常恐怖的——每次掉线都要花大量的时间重新登陆所有的账号。

于是,经过讨论决定,将 192.168.1.240/28 这个网段献祭出来,做纯移动的接口,以用来挂机下载或者是长时间不掉线的网络。首先我们需要在 /etc/iproute2/rt_tables 里增加一行 250 cmcc 来增加一个路由表,之后使用 ip rule 将相关网段的查找规则设置成这个新表即可。

经过编辑的新脚本如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/sh

INT=pppoe-cmcc
TABLE=cmcc

DEST=`ip route show dev $INT | head -n 1 | awk '{print $1}'`
SRC=`ip route show dev $INT | head -n 1 | awk '{print $7}'`

if [ "$1" == "pppoe-cmcc" ]; then # Remove all old rules # while ip rule delete from 0/0 to 0/0 table cmcc 2>/dev/null; do true; done

    # Add rules to let 192.168.1.240/28's traffic to CMCC gateway.
    ip rule add from 192.168.1.240/28 table cmcc priority 32765
    ip route add default via $SRC dev $INT table cmcc

    # ConoHa JP
    ip route add 133.130.96.0/19 via $DEST
    ip route add 133.130.88.0/21 via $DEST
    ip route add 133.130.126.0/24 via $DEST

    # Linode JP
    ip route add 106.185.24.0/21 via $DEST
    ip route add 106.186.16.0/20 via $DEST

    # CCZU CERNET
    ip route add 219.230.144.0/20 via $DEST

    # JS Cernet
    ip route add 211.65.74.0/24 via $DEST

    # CCZU Spoc
    ip route add 202.195.100.0/24 via $DEST
fi

将这个脚本放置到 /etc/ppp/ip-up.d/cmcc 中,并添加可执行权限,我们的简单的策略路由脚本就能在移动拨号成功后自动应用到系统路由表上。

comments powered by Disqus
Except where otherwise noted, content on this blog is licensed under CC-BY 2.0.
Built with Hugo
Theme Stack designed by Jimmy