公司翻墙方案

413 views
Skip to first unread message

Zhang Cheng

unread,
Aug 26, 2013, 10:43:56 PM8/26/13
to USTC LUG
开个新主题说吧。

先看效果图:
Inline image 1

​涉及到的方案简述:
* 通过openvpn连接国外的若干个点,得到若干个interface gfw0, gfw1, gfw2, ...
* 网关dns递归服务器使用dnsmasq。从gfwlist.txt提取一些敏感域名​,以及一些手动添加的域名,这些域名使用8.8.8.8做上游解析。同时,静态的解析若干次,得到一个网段集合(对每个ip上取到/24)。
* 网关上配置若干个路由表,autogfw0, allgfw0, autogfw1, allgfw1, ...
  - ip route add 0/0 via $gfwX_gw dev gfwX table allgfwX
  - for each net; do ip route add $net via $gfwX_gw dev gfwX table autogfwX
  - ip route add table allgfw 0/0 nexthop via $gfw0_gw dev gfw0 weight 1 nexthop via $gfw1_gw dev gfw1 weight 1 nexthop ...
  - for each net: ip route add table autogfw $net nexthop ...
* 配置策略路由,根据用户的选择,为每个用户配置策略:
  - ip rule add from $lan_ip1 lookup autogfw0; lan_ip1访问预定网段时,走gfw0出口,其他走默认网关
  - ip rule add from $lan_ip2 lookup allgfw0; lan_ip2访问所有网段都走gfw0
  - ip rule add from $lan_ip3 lookup autogfw; lan_ip3访问预定网段时,流量在若干个出口之间均衡
  - ip rule add from $lan_ip4 lookup allgfw;  lan_ip4访问所有网段时,流量在若干个出口之间均衡

这算是一个比较典型的策略路由应用吧。原理跟科大网络通一样。(科大网络通的环境下,策略路由条数很多,所以james等人对内核做了优化,优化了策略路由插入、查询的效率。)

@boj,你前面邮件里提到想找机会给大家讲讲iproute2 & iptables,其中讲iproute2时,不妨以网络通为切入点,给大家讲讲策略路由的神奇之处。或者不妨找james给大家“深层揭秘网络通”。



--
Cheng,
Best Regards
gfw.png

Bojie Li

unread,
Aug 26, 2013, 11:11:01 PM8/26/13
to USTC_LUG
这个页面背景色是从 wlt.ustc.edu.cn 摘的?

关于策略路由,我的经验太少,如果有可能的话让 jameszhang 现身说法当然更好啦。


2013/8/27 Zhang Cheng <steph...@gmail.com>

--
-- 来自USTC LUG
请使用gmail订阅,不要灌水。
更多信息more info:http://groups.google.com/group/ustc_lug?hl=en?hl=en
 
---
You received this message because you are subscribed to the Google Groups "USTC_LUG" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ustc_lug+u...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

gfw.png

Zhang Cheng

unread,
Aug 26, 2013, 11:17:53 PM8/26/13
to USTC LUG

2013/8/27 Bojie Li <boj...@gmail.com>
这个页面背景色是从 wlt.ustc.edu.cn 摘的?

是的,因为跟网络通的原理一样,而且相信不少科大同学离校后都会怀念网络通,我就把网络通的配色拷过来了。
​​

关于策略路由,我的经验太少,如果有可能的话让 jameszhang 现身说法当然更好啦。

开学后看看james是否愿意来参加一次每周小聚。​



--
Cheng,
Best Regards

Bojie Li

unread,
Aug 27, 2013, 12:29:54 AM8/27/13
to USTC_LUG

james 对内核做了什么优化?10年 SFD 的 slides 里似乎没说清楚。

科大网络通如果单纯使用策略路由,每个网络通用户都要有一条 ip rule,线性查找下来,能吃得消吗?优化是不是指的这个?

另外感觉有点奇怪的是,内核有目的路由表,但为什么没有源路由表?难道根据目的IP来路由是天经地义?为什么不搞成 general 的 match-action(就像 iptables 那样),里面怎么优化对用户是透明的?

--
gfw.png

Zhang Cheng

unread,
Aug 27, 2013, 12:51:37 AM8/27/13
to USTC LUG

2013/8/27 Bojie Li <boj...@gmail.com>

james 对内核做了什么优化?10年 SFD 的 slides 里似乎没说清楚。

科大网络通如果单纯使用策略路由,每个网络通用户都要有一条 ip rule,线性查找下来,能吃得消吗?优化是不是指的这个?

​应该是这个,有一次跟james聊天时问过他,他说主要是优化了路由表的性能,用某树状结构来实现,没有问更具体的细节。
 

另外感觉有点奇怪的是,内核有目的路由表,但为什么没有源路由表?难道根据目的IP来路由是天经地义?为什么不搞成 general 的 match-action(就像 iptables 那样),里面怎么优化对用户是透明的?

注意route和rule。route最初的目的就是根据目标地址找到(最佳)下一跳,我估计也因此route table至根据目的IP。而根据源IP路由,可以通过rule来很方便的实现。

简单的说,Linux下有(可以创建)许多路由表,默认有三个(见/etc/iproute2/rt_tables),local, main, default​,可以通过ip route show table $table_name来查看。所有ip route相关的命令,如果不指定table_name,则默认对main进行操作。

默认的三个表:
  * local,这个表由内核自动维护,理论上不允许用户修改。这个表主要是定义本地通信,如local、broadcast类型的路由
  * main,一般日常使用都用这个表
  * default, 一般是空的
默认的三条rule:
  * 0: from all lookup local 
  * 32766: from all lookup main 
  * 32767: from all lookup default 
  - 第一列的数字是priority preference,越小优先级越高。一个包路由时,一定会经过第一条rule(from all,匹配所有的包),如果在这个表里没有被消化(没有找到nexthop),则一次看后面的规则。这里会匹配到第二条,一般在main里面会找到nexthop(一般main里有0/0 via $gw dev $dev)。
  - 比如前面翻墙的例子,添加一条规则:
  * 5000: from $lan_ip1 lookup autogfw
    来自$lan_ip1的包,如果在local中没有找到nexthop,则会进入该规则,该规则里没有0/0 via $gw,因此如果目标ip在该table中,则被消化,否则继续找后面的规则(进入main)。
  - ip rule可以根据源ip、目的ip甚至更复杂的规则来决定使用某个路由表(详见 man ip rule (是的,直接敲命令`man ip rule`))。
  - ip route可以认为是最原始和底层的路由机制,它不会有变化了。而ip rule则提供了丰富的功能,以满足大家各式各样的路由需求。

策略路由的概念其实特别简单。

网络通的实现原理,大致这样:
* 制作几个表,假设表名叫 type0, type1, type2, ...(分别对应各出口)
* 例如对于type2(电信出口,到教育网走教育网),添加规则:for each edunet: ip route add $edunet via $edugw dev $edudev; ip route add 0/0 via $telegw dev $teledev
* 每个typeN都有0/0 via $gw dev $dev规则(对应该出口的默认isp)
* 用户选择某个出口时,增加(或修改)该ip的规则:ip rule add from $userip lookup typeN




--
Cheng,
Best Regards

Bojie Li

unread,
Aug 27, 2013, 1:16:47 AM8/27/13
to USTC_LUG

记得你说学校网络通是到联通走联通,到电信走电信,出口只影响默认路由。我觉得你的多线网络通可以搞得智能一些。首先在每个AS找一个能 ping 通的 IP,然后挂上每个VPN,对上述每个AS ping 几次计时,找出最快的那个VPN,以后到这个AS都走这个VPN。这个方法假定同一个AS内部网络延迟忽略不计。另外,这里只考虑了延迟而忽略了带宽,如果能在每个AS找到一个实际的网站就好了,不过这可能不太容易。

在 2013-8-27 上午10:43,"Zhang Cheng" <steph...@gmail.com>写道:
--
gfw.png

Bojie Li

unread,
Aug 27, 2013, 1:30:29 AM8/27/13
to USTC_LUG

赞,这个解释得很清楚啊。我的上个帖子只是吐吐槽,IP网络本来就是目的路由,因为它在设计之初只是把数据尽可能高效送达就行,而不可能想到现实世界中运营商不互联互通之类的破事。我们现在搞这么多策略路由提高效率,本来是运营商该做的事。

--

Bojie Li

unread,
Aug 27, 2013, 1:51:23 AM8/27/13
to USTC_LUG

抱歉,刚才没想清楚,IP目的路由跟运营商互联互通没有关系。使用 ip rule 是为了实行更复杂的 policy,比如开了网络通才能上网。只是 Linux 的 ip rule 和 iptables 实现不够高效,要依次匹配规则。而解决互联互通问题恰恰是通过 ip route(目的路由)实现。

Bojie Li

unread,
Aug 27, 2013, 9:13:07 AM8/27/13
to USTC_LUG
OT一下,今天看到一篇 paper,即使域名 resolver 在国外,如果 resolver 到权威域名服务器之间的路径经过了天朝,也有可能被污染。看来 DNS 污染是会扩散的……


2013/8/27 Zhang Cheng <steph...@gmail.com>

--
gfw.png

Guo, Jiahua

unread,
Aug 27, 2013, 2:45:27 PM8/27/13
to ustc...@googlegroups.com

某些情况下 iptables 也可以快过线性查找的。

我记得有一个叫 ipset 的东西。这东西可以动态维护管理 ip 和端口的集合。
这个东西可以和 iptables 结合起来用,通过 iptables 来查询 ip 是否在集合中。
既然单独拉出来做集合,我觉得它应该会在数据结构上有优化。

http://ipset.netfilter.org/
http://ipset.netfilter.org/iptables-extensions.man.html set 模块

Bojie Li

unread,
Aug 27, 2013, 3:24:01 PM8/27/13
to USTC_LUG

ipset 是好东西啊,结合 iptables 的 fwmark,应该能完美解决网络通 ip rule 问题。只要DHCP出来的地址在一个B类地址范围内,就可以用 O(1) 的 ipmap(bitmap 实现)。即使IP不在一个B内,也可以用高效的 iphash。

我之前说的根据 IP、port、UDP/TCP 三元组来决定是否走VPN的想法,也可以用 ipset 中的 ipporthash 高效实现(只支持 IP、port 二元组,UDP/TCP 分别建一个 set 就行)。

Bojie Li

unread,
Sep 20, 2013, 6:06:42 PM9/20/13
to USTC_LUG

@Zhang Cheng 想问当时你是如何找出被墙的 IP 地址段的?我用 gfwlist 8.8.8.8 解析结果上取到 /24,还是会有漏网之鱼啊(检测方法是 google 敏感词,然后点击搜索结果)。如果不下载大文件的话,感觉 chnroutes 也挺快的。

另外还有个困扰我很久的问题,下载大文件的时候,OpenVPN 远比 nginx HTTP 代理慢,两级 OpenVPN(其中一级在校内,网络质量应该很好)远比一级慢。我调整了 MTU,也没有效果。有人发现过这个问题吗?

在 2013-8-27 上午10:43,"Zhang Cheng" <steph...@gmail.com>写道:
--
gfw.png

Zhang Cheng

unread,
Sep 21, 2013, 11:07:29 PM9/21/13
to USTC LUG

2013/9/21 Bojie Li <boj...@gmail.com>

@Zhang Cheng 想问当时你是如何找出被墙的 IP 地址段的?我用 gfwlist 8.8.8.8 解析结果上取到 /24,还是会有漏网之鱼啊(检测方法是 google 敏感词,然后点击搜索结果)。如果不下载大文件的话,感觉 chnroutes 也挺快的。

另外还有个困扰我很久的问题,下载大文件的时候,OpenVPN 远比 nginx HTTP 代理慢,两级 OpenVPN(其中一级在校内,网络质量应该很好)远比一级慢。我调整了 MTU,也没有效果。有人发现过这个问题吗?


​我用了三个来源:
* 从gfwlist中提取域名
* 手动添加域名
* 手动添加IP

前两个域名列表,分别在国外各服务器上都解析若干次,取所有解析出的IP的并集。所有的IP上取到/24。最后再并上手动添加的IP。
另外,上述方法涉及到的所有域名都上取到一级域名,在dnsmasq设置用8.8.8.8解析。

漏网之鱼肯定会有,不过给公司搭翻墙,宁可有漏网,不能错杀。尤其是gfw是一个traffice aware的东西,就是说一个vpn的流量很小的时候它不管,但是当流量大了它就可能封掉。自己一个人翻墙,即使所有流量都翻墙问题也不大,但是​人一多流量就大了,那这个vpn本身可能也会挂掉。



--
Cheng,
Best Regards
Reply all
Reply to author
Forward
0 new messages