虚拟 openwrt

update-2017-07-13: 用 electron 封装了虚拟机: vrouter

"有哪些东西你用了之后就回不去了?"

kcptun 是我的答案之一.

广州电信 50M 光纤 , 纯粹用 shadowsocks 的话 , 看看资本主义的网页速度勉勉强强 , 视频什么就别想了. 但是搭配上 kcptun , 上网高峰期放 1080P 都没问题. 唯一的问题是 kcptun 性能消耗有点大, 在网件 WNDR4300 上部署, 一看视频路由器的 CPU 占用率就会飙到 100% , 而且速度比桌面端的 kcptun 差几倍.

解决方法挺多, 土豪出门右转上狗东买个旗舰路由, Geek 在路由下再挂个树莓派跑 kcptun , 实用者在桌面端用 cow 做智能代理.

智能代理其实也不错, 但是透明代理更佳, 谁用谁知道. 在透明代理下, 终端是完全感觉不到墙得存在的, 墙是什么? 能吃吗? 不连家里 openwrt 的 Wi-Fi 时, 我就用智能代理, 但是有些终端软件它不走系统代理, 有些软件只走 http 代理, 在这些情况下, 只能一个个去明确代理. 以前用 shadowsocksX 时, 系统自带的邮件应用就没法连接 Google, npm/docker/brew也需要指定代理.

不(mei)想(qian) 买 surge 之类的软件, 于是鼓捣了这么一个东西: virualbox 里的 openwrt, 用这个虚拟路由器接管宿主的所有流量, 在虚拟路由里做透明代理. 这样就相当绑了一个 openwrt 路由在电脑上, 无论接入什么网络, 都可以访问资本主义网站. 而且自由度比 surge 之类的要高, 毕竟直接扔了一个 linux 给你啊喂. 想用什么工具链在 openwrt 里搞就行了, 还不用担心这个路由器的性能不够. 当然比起土豪的实体路由还是逊色一点, 毕竟虚拟路由只能自己使用(或者在笔记本上再接一个实体路由, 供其他设备连接?).

让 virtualbox 里的 openwrt 接管宿主的流量, 需要给虚拟机配两张网卡:

  1. 一张网卡设置为桥接. 虚拟机通过这张网卡从上级路由获取 IP , 摇身变为和宿主同等的网络设备.
  2. 另一张设为 Host-only, 宿主的网络数据从这张网卡流向虚拟路由.

设好网络后, 用 route 命令把宿主的默认网关改为虚拟路由器, 在把 DNS 也设置为虚拟路由器的地址. That's all.

本来想试试 docker , 但是 osx 的 docker 引擎是虚拟机, container 是跑在这个虚拟机里, 貌似比较麻烦或者说不可能实现. 所以用了 virtualbox , 仅提供个思路, 抛砖引玉, 有大神出个 docker 的思路就最吼了!

安装

根据 wiki 的说明 , 先把 openwrt 安装到虚拟机里 :

配置虚拟机网络

透明代理

在 openwrt 上设置透明代理的方法有很多 , 个人认为最优雅的组合是 :

利用以上这个组合 , 就可以根据域名区分数据走向 . 以下仅仅是记录过程 , 了解更多原理请点 : 那些从墙上学会的知识

准备相关软件

配置 shadowsocks

配置kcptun

配置 iptables

配置 dnsmasq

全部配置后之后就可以上资本主义网站了 . 但是当宿主的外部网络发生变化 , 比如连接另一个 Wi-Fi 时 , 我们自定义的 iptables 规则会被系统重写而丢失 , kcptun 在没有网络的情况下也会崩溃退出 , 因此可以加一个脚本监控这些状态 , 随时恢复到可以正常使用的状态:

自动化

随宿主开机启动 openwrt

宿主开机时/网络变化时 , 自动更改网关和 DNS

log --verbose