最近又折腾了一把路由,通过OpenWRT,OpenVPN和ChnRoutes实现的智能路由可以让你所有设备联网即自由,无需在各个设备上进行各种设置。

所需设备清单:

  • 一台自由的主机
  • 一台已经刷了OpenWRT的路由器
  • 一根网线
  • 一个2G的U盘

在此之前请确保你已经有了一台刷过OpenWRT的路由器,然后给路由器上电,通过网线直连,连接路由器:

telnet 192.168.1.1

设置密码:

passwd

而后退出即可用SSH进行登录了:

接着修改路由的无线配置,从而可以开启Wifi:

vim /etc/config/wireless

注释掉option disabled 1一行,并设置Wifi的加密方式和密码:

config wifi-device  radio0
	option type     mac80211
	option channel  11
	option hwmode	11ng
	option path	'platform/ar933x_wmac'
	option htmode	HT20
	list ht_capab	SHORT-GI-20
	list ht_capab	SHORT-GI-40
	list ht_capab	RX-STBC1
	list ht_capab	DSSS_CCK-40
	# REMOVE THIS LINE TO ENABLE WIFI:
	# option disabled 1

config wifi-iface
	option device   radio0
	option network  lan
	option mode     ap
	option ssid     OpenWrt
	option encryption psk2
	option key	'password'

然后修改网络配置:

vim /etc/config/network

注释掉option ifname 'eth0'并增加WAN口设置,

config interface 'loopback'
	option ifname 'lo'
	option proto 'static'
	option ipaddr '127.0.0.1'
	option netmask '255.0.0.0'

config globals 'globals'
	option ula_prefix 'fd48:f746:e8a5::/48'

config interface 'lan'
	# option ifname 'eth0'
	option type 'bridge'
	option proto 'static'
	option ipaddr '192.168.1.1'
	option netmask '255.255.255.0'
	option ip6assign '60'

config interface 'wan'
	option ifname 'eth0'
	option proto 'dhcp'

而后重启路由,即可通过Wifi连接到路由器,此时将路由通过网线接入网络或者上级路由即可作为一个普通的路由器使用了。

reboot

安全模式

如果期间由于IP地址配置错误等原因导致无法连接到路由器,可以进入路由器的安全模式进行恢复:

1、拔掉路由器电源 2、链接电源后使用牙签不断抽插路由器的reset按钮,当路由器的指示灯开始快速闪烁就说明已经进入了安全模式 3、安全模式不会加载任何配置,因此还需要通过最初提到的方式,直连并通过telnet 192.168.1.1连接路由器 4、挂载root分区:mount_root 5、擦除先前的配置:firstboot 6、设置密码:passwd root 7、重启:reboot -f

而后就可以重新开始进行配置了,如果其中通过firstboot擦除配置的过程中遇到错误,可以通过在OpenWRT中重新刷机的方式解决。

准备U盘

我所用的路由只有2MB存储空间,安装OpenWRT之后,空间已所剩无几,如果要安装后续提到的OpenVPN等软件,很明显空间是不够用的,但是我们可以通过路由器的USB接口使用U盘来做扩展。

我这里给2G的U盘分了3个区,1G(primary, bootable, ext4)/500MB(primary, swap)/500MB(primary, ext4),分区完后对其进行格式化,就完成了U盘的准备工作,我是通过Mac中的Ubuntu虚拟机进行下述操作的:

cfdisk /dev/sdb
mkfs.ext4 /dev/sdb1
mkswap /dev/sdb2
mkfs.ext4 /dev/sdb3

U盘准备完毕后就可以在路由上安装所需的软件了:

opkg update
opkg install kmod-usb2 kmod-fs-ext4
opkg install kmod-usb-storage
opkg install block-mount
reboot

接着重启路由器,而后配置fstab实现U盘分区的自动挂载:

reboot
vim /etc/config/fstab

修改如下配置:

config 'mount'
	option	target	/mnt/usb
	option	device	/dev/sda1
	option	fstype	ext4
	option	enabled 1

config 'swap'
	option	device	/dev/sda2
	option	enabled 1

config 'mount'
	option	target	/mnt/home
	option	device	/dev/sda3
	option	fstype	ext4
	option	enabled	1

而后重启路由器后:

reboot

这时候你就可以通过df -h看到分区已经自动挂载了:

df -h
Filesystem                Size      Used Available Use% Mounted on
rootfs                    1.1M    632.0K    456.0K  58% /
/dev/root                 1.8M      1.8M         0 100% /rom
tmpfs                    14.1M     72.0K     14.1M   0% /tmp
/dev/mtdblock3            1.1M    632.0K    456.0K  58% /overlay
overlayfs:/overlay        1.1M    632.0K    456.0K  58% /
tmpfs                   512.0K         0    512.0K   0% /dev
/dev/sda1               945.2M     11.0M    869.4M   1% /mnt/usb
/dev/sda3               451.5M      2.3M    421.5M   1% /mnt/home

接着执行如下操作:

mkdir /tmp/root
mount -o bind / /tmp/root
cp /tmp/root/* /mnt/usb -a
umount /tmp/root
rm -r /tmp/root

接着在opkg.conf配置中增加dest usb /mnt/usb,之后就可以将我们需要的OpenVPN安装到USB中了:

vim /etc/opkg.conf
opkg update
opkg --dest usb install openvpn-openssl
ln -s /mnt/usb/usr/lib/libssl.so.1.0.0 /usr/lib/
ln -s /mnt/usb/usr/lib/libcrypto.so.1.0.0 /usr/lib/
ln -s /mnt/usb/usr/lib/liblzo2.so.2 /usr/lib/
ln -s /mnt/usb/usr/sbin/openvpn /usr/sbin/

到此已经可以运行OpenVPN了:

openvpn --version

由于OpenVPN安装在USB中,所以后续启动OpenVPN会遇到找不到tun模块的状况,接下来配置tun模块:

ln -s /mnt/usb/lib/modules/3.10.4/tun.ko /lib/modules/3.10.4/
ln -s /mnt/usb/etc/modules.d/30-tun /etc/modules
ln -s /mnt/usb/etc/modules.d/30-tun /etc/modules.d/
modinfo tun

接着我们关闭防火墙并看一下默认的一些转发和NAT规则:

/etc/init.d/firewall stop
/etc/init.d/firewall disable
iptables -L -n --line-number
iptables -t nat -vnL POSTROUTING --line-number

可以看到此时默认是没有任何转发规则的,因此此时连接到路由器的设备是无法上网的,配置路由每次上电重启时候自动加载tun模块并加入转发规则:

vim /etc/rc.local

修改如下配置:

insmod tun
iptables -I FORWARD -o tun0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
iptables-save

exit 0

到此为止你的路由器已经可以再次正常接入互联网了,下面我们需要配置OpenVPN并进行流量的智能分发,即配置哪些流量走VPN。

首先我们先来配置OpenVPN,这包含两方面的配置,服务端和客户端。

服务端

wget http://ipxcore.com/openvpn-debian-install.sh
chmod +x openvpn-debian-install.sh
./openvpn-debian-install.sh

iptables -I INPUT -p udp --dport 1194 -j ACCEPT
iptables -I INPUT -p tcp --dport 1194 -j ACCEPT
iptables -I INPUT -p udp --dport 443 -j ACCEPT
iptables -I INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A FORWARD -o tun0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
iptables-save

客户端

客户端需要配置在服务端生成的证书路径,首先从服务器下载打包的证书文件:

scp [email protected]:/root/keys.tgz ./
tar -zxvf keys.tgz
vim 703n.ovpn

703n.ovpn配置如下:

client
remote 100.100.100.100 1194
dev tun
comp-lzo
ca /root/etc/openvpn/easy-rsa/2.0/keys/ca.crt
cert /root/etc/openvpn/easy-rsa/2.0/keys/client1.crt
key /root/etc/openvpn/easy-rsa/2.0/keys/client1.key
route-delay 2
route-method exe
max-routes 3888
redirect-gateway def1
verb 3

到此为止,通过当前的配置文件已经可以启动OpenVPN并实现所有流量经过VPN转发了:

openvpn --config ./703n.ovpn

为了实现流量的智能分发,同时也是为了节省VPN的流量,可以通过ChnRoutes实现,在Mac上下载ChnRoutes并执行:

python chnroutes.py -p android

会生成两个文件vpnup.shvpndown.sh,将这两个文件头部的alias删除,并下载到路由器中之后,在配置文件底部增加如下设置:

script-security 2
up vpnup.sh
down vpndown.sh

好了,这时候再次启动OpenVPN,在Mac上分别traceroute下Baidu和Twitter就会发现,流量已经自动分发了。

Reference:

  • http://www.imtxc.com/blog/2013/02/24/install-and-configure-openwrt-on-wr703n/
  • http://blog.zhen9ao.me/blog/2012/04/10/how-to-config-openwrt-with-openvpn-on-tp-link-wr703n/
  • http://www.dd-wrt.com/phpBB2/viewtopic.php?t=65650
  • https://blog.ipredator.se/howto/openwrt/configuring-openvpn-on-openwrt.html
  • http://ipxkb.info/auto-install-openvpn-on-debian/

EOF