寒假的时候入了一台Linksys WRT54G,并将其刷成了OpenWRT系统,开学之后考虑到蛋疼的校园网认证系统,打算在路由器上搭建基于IPv6的SSH Tunnel,用来给移动设备提供网络接入以及外网代理服务。

准备工作

需要

  • 原生IPv6网络
  • 一台刷了OpenWRT系统的路由器
  • 一台米国的服务器,需要IPv6支持以及SSH帐号

给OpenWRT增加IPv6支持

关于OpenWRT上的IPv6配置,可以参考OpenWRT的官方wiki http://wiki.openwrt.org/doc/howto/ipv6.essentials
简而言之,通过SSH登录到OpenWRT,然后使用opkg安装IPv6模块
root@OpenWrt:/# opkg install kmod-ipv6
然后重启network服务
root@OpenWrt:/# /etc/init.d/network restart
这时,使用ifconfig命令应该能够看到成功获取IPv6地址了

配置SSH的免密码登录

有了IPv6,应该能通过SSH直接连接到服务器而不用经过校园网的认证,然而,为了让路由器实现自动登录,SSH的免密码登录当然是必须的了。
而OpenWRT上默认的SSH是Dropbear,配置方法和通常使用的OpenSSH有所不同。

使用Dropbear生成Public Key

dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key > id_rsa.pub
然后使用vi编辑一下生成的id_rsa.pub,删除掉第一行和第三行,只留下以ssh-rsa开头的第二行,这才是我们需要的Public Key

Public Key上传到服务器

scp id_rsa.pub root@server:id_rsa.pub

Public Key导入到authorized_keys

登录到服务器,然后执行
cat id_rsa.pub >> ~/.ssh/authorized_keys

测试一下免密码登录

ssh -i /etc/dropbear/dropbear_rsa_host_key root@server
如果能够直接登录成功,就说明已经配置成功

OpenWRT端的端口转发配置

既然要使用SSH Tunnel作为socks代理,端口转发是必须的了,而Dropbear不支持动态端口转发(Dynamic Port Forwarding),所以使用静态端口转发替代
/etc/init.d里新建一个服务,命名为sockstunnel(/etc/init.d/sockstunnel),其作用是在192.168.1.1:70070进行监听,然后将这个端口的所有数据通过SSH Tunnel静态转发到服务器的7070端口

#!/bin/sh /etc/rc.common
START=85
STOP=5
DAEMON=/usr/bin/ssh
PIDFILE=/var/run/sockstunnel.pid
start() {
echo -n "Start Socks Tunnel Daemon: "
start-stop-daemon -S -b -q -m -p $PIDFILE -x $DAEMON
-- -i /etc/dropbear/dropbear_rsa_host_key -g -N -L 192.168.1.1:7070:localhost:7070 root@server
echo -n "Socks Tunnel Daemon Started."
}
stop() {
if [ -f $PIDFILE ]; then
PID=$(cat $PIDFILE)
kill $PID
while [ -d /proc/$PID ];
do
sleep 1
done
fi
rm -rf $PIDFILE
echo -n "Socks Tunnel Daemon Stoped."
}

服务器端的端口转发配置

sockstunnel的作用仅仅是将数据通过我们建立的SSH Tunnel静态转发到服务器的7070端口,而网络应用却可能使用到各种端口,显然不可能为每一个应用单独配置端口转发,因此,就要使用到服务器端的动态端口转发。
登录到服务器,执行命令
ssh -qTfnN -D 7070 root@localhost
效果是在7070端口进行监听,将OpenWRT路由器通过SSH Tunnel静态转发的数据再动态转发出去。
这其实是一种迂回的方案,因为OpenWRT上的Dropbear不支持动态端口转发,就先将数据通过SSH Tunnel静态转发到服务器,然后再在服务器进行动态端口转发。
下图应该可以很好地解释其中的原理:

如果你的OpenWRT路由器Flash存储器容量足够大,则完全可以在OpenWRT上安装OpenSSH直接使用动态转发,而没必要像我这么做了。

启动/停止SSH Tunnel

在OpenWRT上可以很容易地启动SSH Tunnel,只需要执行
/etc/init.d/sockstunnel start
如果需要停止的话,只需要执行
/etc/init.d/sockstunnel stop

在终端设备上使用Socks代理

如果需要使用Socks代理,仅仅连接到OpenWRT路由器是不够的,还需要在设备上配置socks代理。
如果使用的是电脑,只需要将浏览器的socks代理修改为:192.168.1.1:7070,但是需要注意的是,这里只能使用Socks4,如果使用Socks5将会出现拒绝连接的状况。
如果使用的是手机,比如Android,推荐使用ProxyDroid软件(手机需要取得root权限),可以很方便地设置socks4代理,并且可以根据当前连接的网络自动开启/关闭代理,实现一连接到路由器便自动开启代理的效果。