寒假的时候入了一台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代理,并且可以根据当前连接的网络自动开启/关闭代理,实现一连接到路由器便自动开启代理的效果。
Leave a Comment