基于OpenWRT路由器的IPv6 SSH Tunnel解决方案

2013年9月27日3580

寒假的时候入了一台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模块

[email protected]:/# opkg install kmod-ipv6

然后重启network服务

[email protected]:/# /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 [email protected]:id_rsa.pub

Public Key导入到authorized_keys

登录到服务器,然后执行

cat id_rsa.pub >> ~/.ssh/authorized_keys

测试一下免密码登录

ssh -i /etc/dropbear/dropbear_rsa_host_key [email protected]

如果能够直接登录成功,就说明已经配置成功

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 [email protected]
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 [email protected]

效果是在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代理,并且可以根据当前连接的网络自动开启/关闭代理,实现一连接到路由器便自动开启代理的效果。

0 0