项目十八--便携式网络隐私保护器(内部全局VPN)/公司内网硬件访问控制机

来自Microduino Wikipedia
Shengkai_81@163.com讨论 | 贡献2015年12月27日 (日) 08:18的版本 (Created page with "网络隐私/内网穿透本质上使用VPN即可实现,但真实应用中,绝大部分VPN软件(OpenVPN除外)不支持路由推送,抑或路由本身难以维护。使...")
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

网络隐私/内网穿透本质上使用VPN即可实现,但真实应用中,绝大部分VPN软件(OpenVPN除外)不支持路由推送,抑或路由本身难以维护。使用全局VPN会严重影响本地浏览反应速度(例如在线视频)。

背景介绍

这里以某国内著名IT企业应用背景为例,公司能够访问国内各视频网站,但是限制京东、淘宝等购物网站。我们希望通过特定路由器突破限制的同时不影响其它访问。

具体实现时,有如下几点需要考虑:

  • 国内各大云服务器商均按流量收费,因此希望有且仅有必要的访问才走服务器中转;
  • 京东、淘宝的IP列表不可能搜集齐全,而且可能旗下某些非购物型网站可以访问;
  • 使用第三方CDN加速,第三方CDN同时为其它厂商服务,其它厂商服务不受影响,此部分希望不通过VPN。


便携式网络隐私保护器/公司内网硬件访问控制机与其原理相同,不再详述。

技术实现

整理上述需求,我们希望实现按域名路由。dnsmasq 在 2.66 版之后加入了对 ipset 的支持,可将指定域名的 IP 解析后自动加入某一 ipset 中。 再配置路由规则,使该 ipset 中的 IP 走 VPN 即可。使用关键字dnsmasq ipset即可搜索出一堆相关文章。


不过官方版本的dnsmasq不能满足第三种需求,以facebook为例,其使用了akamai的CDN服务,但是微软也使用akamai为其提供windows更新服务。 facebook使用akamai的域名有fbcdn-profile-a.akamaihd.net、fbcdn-sphotos-a-a.akamaihd.net、fbcdn-sphotos-f-a.akamaihd.net、fbcdn-sphotos-g-a.akamaihd.net等, 对于众多的域名我们可以一一列下,但是难免会有遗漏,不难发现所有域名均以fbcdn开头,如果dnsmasq支持正则表达式,则可以通过^fbcdn-[a-z\-]+\.akamaihd\.net$一条 匹配上述4条。可惜dnsmasq官方并没有支持正则表达式,不过有网友已经提供并开源https://github.com/cuckoohello/dnsmasq-regex,在microwrt官方repo中也提供支持 正则表达式的dnsmasq包方便广大玩家使用。


VPN方面选择比较常用的openvpn,其它VPN与此配置类似。OpenVPN服务器端的安装配置请自行Google。

安装配置

首先安装支持正则表达式版本的dnsmasq,microwrt玩家可从microwrt官方repo中获取。 各位首先在/etc/opkg.conf文件末尾加入如下一行:

   src/gz microwrt http://repo.microduino.cn/microwrt/

并且移除option check_signature 1,然后运行

   opkg update && opkg install dnsmasq-full

这里使用OpenVPN因此还需安装openvpn软件

   opkg install openvpn-openssl

配置dnsmasq,这里以taobao为例,在/etc/dnsmasq.conf末尾添加如下几行,其中最后一行添加了正则表达式的示例

   ipset=/taobao.com/vpn
   ipset=/tmall.com/vpn
   ipset=/:^fbcdn-[a-z\-]+\.akamaihd\.net$:/vpn

修改完毕后,重启dnsmasq。然后在/etc/firewall.user文件末尾添加iptables配置,使得dnsmasq解析后加入ipset vpn的ip列表走特定路由表

   ipset create vpn iphash -exist
   iptables -t mangle -I PREROUTING -m set --match-set vpn dst -j MARK --set-mark 1

最后进行openvpn的配置,在一般的openvpn配置文件末尾添加下列几行

   script-security 2
   route-noexec
   up /etc/openvpn/updown.d/up.sh
   down /etc/openvpn/updown.d/down.sh

这几行的目的是不使用openvpn服务器端推送的路由配置,执行up.sh脚本中的程序,up.sh脚本内容如下:

   #!/bin/sh
   ip route add default via $route_vpn_gateway dev $dev table 100
   ip rule add fwmark 1 priority 1984 table 100

这里可以看出我们添加了新的路由表100,该路由表中添加VPN服务器的默认路由,第二行使得通过iptables标记的目的地址位于ipset vpn列表中访问均走 路由表100。

至此我们即实现有且仅有taobao、tmall的访问经过VPN绕行,其它访问均从本地。


关于文中具体的技术细节,请自行度娘dnsmasq ipset。