OpenWrt实现科学上网折腾记

来源:互联网 发布:wings禁赛 知乎 编辑:程序博客网 时间:2024/04/28 15:20


最近墙越来越高,上网查资料什么的都很不方便,尤其是谷歌彻底被墙之后;编译代码有时候需要用到google code,都被墙了。

但如果全用VPN,国内网站又有问题。其实最简单的解决方法是买现成的服务,比如qy,qj之类的,不想折腾的直接用就好。但毕竟有的时候有些特殊用途,比如在linux下编译代码,需要下载源码,这些方案有的不支持,或者设置有些麻烦。科学上网做到路由器上的好处是路由器可以全天开机,而且功率不大。(在PC上功耗太大,在NAS上有考虑可能影响硬盘休眠。)


需求是:
1、内外分流,国内的走本地,谷歌等其他的走vpn;

2、不想每台客户端都设置,在路由器上设置好,只要连接此路由器上网就可以。

3、路由器最好有VPN Server,这样从别处上网时,VPN到这个路由器上,就可以搞定


DD,TT都没用过,OpenWRT用过一阵。决定还是用OpenWRT来搞定。手里的路由器只有TPLINK 720n和WR841,也都支持OpenWRT。路由器自动分流科学上网原理和实现方式研究。折腾的过程参考的是 基于OpenWRT的自动番茄路由器,因为写的比较详细,有很完整的调试方法。


下面主要是的方案部署在我的720n上的曲折过程(唉)

1、 vpn连接,试用了几种的vpn。


2、静态路由添加8.8.8.8 (可选)


3、调试dnsmasq和ipset,这个真曲折

3.1 OpenWrt缺省安装dnsmasq不带ipset,需要改成dnsmasq-full才有。文章中说需要重新编译OpenWrt,修改配置。也有其他文章说不用重新编译,只要卸载dnsmasq,安装dnsmasq-full就好。我就直接卸载了,安装后会有错误信息,说是有文件已经存在。我没管它。直接按文中所说的设置了。结果...无效。


3.2 按照文中的方法调试了很久,要不然ipset根本就是空的,要不然就是路由设置根本没用。而且文中只有增加ipset和设置防火墙mangle表的语句,没有删除ipset和删除iptables规则的方法,每次调试都要重新启动...一晚上我重启了n次,还是搞不定。现在想想当时的设置应该没问题,只不过我的理解有误,我觉得在ipset -N的时候,ipset一建立,会自动解析所有设置的ipset=/xxxx/8.8.8.8的内容,把ip地址添加到ipset中;但其实不是这样,而是在访问这些网站的时候才会去往ipset里添加ip地址。也就是ipset的建立是渐进的过程,而不是一次性的。当时我一查ipset是空的,就觉得有问题。还有就是如果DNS污染没有搞定,那么会把无效的IP加入到ipset中,每次都去访问这些无效IP当然也不行。


3.3调试不通,第二天我想想,觉得可能是dnsmasq的版本问题,可能不能直接卸载和安装。开始折腾OpenWrt编译,又是一部血泪史。在另外一篇中说明吧。


4、编译OpenWrt

其实本节整个都在做无用功,因为后来发现不是dnsmasq的安装问题。可能以后还要再编译,留下过程记录。


5、在VMWare上安装OpenWrt


6、以上全部搞定,又开始重新折腾dnsmasq和ipset,iptables的设置问题。

6.1)怀疑openwrt版本问题,又刷了trunc版

6.2)找调试方法和取消命令的方法。最终搞定。所以说还是要理解了才能实行。

核心步骤:

0) 防止dns污染。有不用vpn也可以防止污染的方法,简单的办法还是VPN吧。

# 只用vpn连接8.8.8.8

ip route add 8.8.8.8 dev pptp-VPN

#禁止wan口访问8.8.8.8,防止污染(其中pppoe-wan和eth1要修改成本地wan口)

iptables -I zone_wan_output 1 -o pppoe-wan -j REJECT -d 8.8.8.8 

(好像OpenWrt开发人员不建议使用Dynamic chains,internal chain,建议改用_rule。我发现网口断线重连时,zone_wan_output不会重新建立,还是改用output_wan_rule吧。)

iptables -I output_wan_rule 1 -o pppoe-wan -j REJECT -d 8.8.8.8
iptables -I output_wan_rule 1 -o eth1 -j REJECT -d 8.8.8.8


(调试用:

# 删除8.8.8.8的静态路由

ip route del 8.8.8.8 dev pptp-VPN

# 删除防止污染的规则

iptables -D output_wan_rule 1

iptables -D output_wan_rule 1

)


a)新增一个ipset ,这个ipset中包含需要科学上网的ip,由dnsmasq从设置的域名中解析出来(vpn是这个ipset的名字,可以设成别的,但要和dnsmasq的配置文件和maggle表过滤规则中的保持一致)

ipset -N vpn iphash

(调试用:

ipset中包含的ip地址可以通过 ipset list vpn 查看。(如果是空的,可能是还没访问这些网站,试着访问一下,再看看有没有增加进去)。

删除ipset:ipset -X vpn)


b) 新增一个mangle表的过滤器,对目的地址是名为vpn的ipset中的ip的包打上标记

iptables -t mangle -A PREROUTING -m set --match-set vpn dst -j MARK --set-mark 1

(调试用:

查看是否成功

iptables -t mangle -L PREROUTING

可以查看防火墙日志,就知道是否有包被打上标签了。

删除一个mangle表的过滤器

iptables -t mangle -D PREROUTING -m set --match-set vpn dst -j MARK --set-mark 1)


c) 对ipset启动路由表table 1

ip rule add fwmark 1 table 1

(调试用:

查看 ip rule list

删除 ip rule del table 1

验证的方法:

traceroute twitter.com

通过vpn出口,说明对了,通过lan口出去说明有问题。

(按说是这样,为什么720n上每次显示星号超时?))


d) 建立路由表table 1

ip route add default via $(ip route show dev pptp-VPN | tail -n 1 | cut -d ' ' -f 1) table 1

(调试用:


删除路由表ip route del table 1)



以上所有脚本写到哪里?

方案一:

(0)的脚本越早越好(防止污染),可以放到启动脚本/etc/rc.local,也可以放到防火墙启动脚本中

原文中(a)(b)都写到路由器启动脚本中(/etc/rc.local)中,有文章指出防火墙重启后表和链路上的规则(iptables)会被清空。(事实上pptp连接上后防火墙确实会重启,所以我常发现mangle规则莫名奇妙消失,答案应该在这)放在启动脚本中不太合适。最好写在防火墙的启动脚本中。

vpn断线后应该恢复原路由,所以(c)应该放到ppp启动和停止脚本中(/etc/ppp/ip-down/ 和 /etc/ppp/ip-up/)中。

(d)中的路由表ip地址可能会发生变化,所以应该放在ppp启动和停止脚本中(/etc/ppp/ip-down/ 和 /etc/ppp/ip-up/)中。

方案二:

干脆所有的脚本都放到ppp启动和停止脚本中,这样更新了vpn.conf文件,重新连接vpn就可以了?


7、DEBUG问题

--重启后无法本地解析域名,在windows上上网正常。

因为如果启动过程出问题,dnsmasq会启动失败(配置文件中有ipset=XXXXXX和server=XXXXX,因无法解析域名,dnsmasq罢工了)



--traceroute(windows上是tracert)工具没法显示路由器出口的(未解决)

(显示星号*超时,这个目前还不知道原因,看http://www.geekfan.net/10492/文中和http://xiaoding.org/?p=391文中都能正常traceroute,很奇怪。


-- 脚本无效

要注意给脚本赋予执行权限!包括/etc/ppp/ip-down, /etc/ppp/ip-up和/etc/rc.local,etc/firewall.user


自动更新vpn_list?

总觉得太复杂,(也没有权威的list可用?)不容易维护,还是手工更新算了。


VPN服务器的域名被墙?

连接VPN服务器需要干净的dns,干净的dns又需要VPN,这是一个鸡生蛋蛋生鸡的问题。表现就是VPN连不上,报域名无法解析。解决方法

一是直接用IP地址,但地址可能会发生变化,需要经常维护。

二就是用防火墙屏蔽污染的ip地址,只接受正确的IP,这种方案不需要VPN也可以保护DNS。但污染的IP地址也有可能变化。也需要维护。


总的感觉是:

  • 路由器实现这个似乎还是有点勉强,毕竟CPU什么的只有400M,感觉速度明显不如在电脑上。高主频的路由器不是没有,一来都太贵,二来功率大了发热,能耗什么的也大,失去了在路由上实现的初衷。如果只是为了网页和移动设备使用,用现成的方案就行了,便宜又稳定。
  • 一定要折腾,VPN要选个稳定的。看见很多问题都是由于VPN不稳定引起的。路由器不比电脑,连不上或者经常断线也不好查哪里的问题。还有就是尽量不要米国和J国的,似乎墙对这两个国家有重点照顾,经常断可能是这个引起的。
  • OpenWrt的活力似乎有些不足,对新路由器的支持似乎都不好,想找个支持的千兆+双频+中档配置(最好有AC)的路由器似乎不容易。难怪水星那款都算“神器”。
  • 觉得还是要从原理理解,直接拿来别人的多半是不行的



1 0
原创粉丝点击