openwrt利用ssh隧道穿透,实现内网路由器远程管理
如果openwrt路由器在内网,分配的是私网地址,如何通过远程ssh或web来管理路由器
首先需要一台有公网地址的VPS,假设VPS的IP地址为11.22.33.44,系统为Ubuntu 14.04
1、在openwrt上启动ssh隧道
ssh -Nfg -R 11111:192.168.1.1:22 11.22.33.44 -p 6000 -l root
192.168.1.1为openwrt地址,ssh端口为22,远程VPS的地址为11.22.33.44,ssh端口为6000,11111为映射端口,连接时会要求输入VPS的SSH密码,连接成功查看网络连接
# netstat -nautp
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:11111 0.0.0.0:* LISTEN 19335/sshd: root
tcp 0 0 11.22.33.44:6000 22.33.44.55:45222 ESTABLISHED 19335/sshd: root
tcp6 0 0 ::1:11111 :::* LISTEN 19335/sshd: root
22.33.44.55为路由器经nat转换后的公网IP地址,可以看出openwrt的22端口映射成了vps本地的11111端口
此时在vps上可以通过如下命令来连接openwrt
ssh root@127.0.0.1 -p 11111
如果要映射web页面,在openwrt上执行:
ssh -Nfg -R 11111:192.168.1.1:80 11.22.33.44 -p 6000 -l root
将80端口映射到VPS上的11111端口,在vps上可以通过http://127.0.0.1:11111来访问路由器的WEB管理页面
2、openwrt的免密码登录
上述过程在openwrt执行隧道连接时需输入vps的连接密码,下面介绍如何省略此步骤
在VPS上执行
ssh-keygen -b 1024 -t rsa
在目录/root/.ssh中生成id_rsa(私钥)和id_rsa.pub(公钥)
将id_rsa.pub拷贝到openwrt的/etc/dropbear目录,并改名为authorized_keys,从VPS登录openwrt不再需要密码
在openwrt上执行
~# dropbearkey -t rsa -f ~/.ssh/id_dropbear
Generating key, this may take a while...
Public key portion is:
ssh-rsa AAAAB3NzaC1yc2EAA6666666666666666666666666666666666wjA+k739HnuMCbjVnZ8i/h
K4A1sm0As2Xywa866662NSL6u2Hxf6bwLmAteJRfk92oypw8VhDZnJ8O0O1fc3+vAgWrYerbQ5GJ3DScQsIIvfsqhlqU4Rq14/05/LIONc/pkHuQ2iJ6CPkDPV5bBCKzHn
2+jE55cjXg1jcUbI6iLpRRbUOj2Os97OzJP1s4x6rCMz6PWnD3SdZYQJOjzAGaSjosg+K9nVC+AKGTCbGIfe8oIOBWM0w50BjRYZQCiUVi0nUMsh3iMb root@OpenWrt
Fingerprint: md5 d4:dc:29:6b:ce:ad:af:fa:d5:27:01:74:bb:ae:39:07
将上面的粗体部分拷贝到VPS的~/.ssh/authorized_keys中,注意这个是单行数据,要删除所有回车键
这样从openwrt上ssh VPS不再需要密码
3、在其他设备上登录VPS来访问路由器
修改vps上的/etc/ssh/sshd_config文件,修改或增加
GatewayPorts yes
openwrt上映射ssh命令改为:
ssh -Nfg -R *:11111:192.168.1.1:22 11.22.33.44 -p 6000 -l root
连接后VPS网络连接状况变为:
# netstat -nautp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:11111 0.0.0.0:* LISTEN 21295/sshd: root
tcp 0 0 11.22.33.44:6000 22.33.44.55:41473 ESTABLISHED 21148/sshd: root@no
可以看到监听地址由127.0.0.1变为0.0.0.0
openwrt上映射web命令改为:
ssh -Nfg -R *:11112:192.168.1.1:80 11.22.33.44 -p 6000 -l root
此时可以通过任何设备执行如下命令访问路由器的ssh
ssh root@11.22.33.44 -p 11111
通过http://11.22.33.44:11112访问路由器WEB页面
为了避免ssh异常退出,可以写一个脚本,加入定时任务检查,如果ssh隧道断开,则重新连接:
#!/bin/sh
icount=`ps -w | grep "ssh -Nfg" |grep -v grep| wc -l`
if [ $icount = 0 ] ;then
logger -t "ssh_remote" "ssh remote restart!"
ssh -Nfg -K 120 -R *:11111:192.168.1.1:22 11.22.33.44 -p 6000 -l root
ssh -Nfg -K 120 -R *:11112:192.168.1.1:80 11.22.33.44 -p 6000 -l root
fi
将上述代码保存为/root/monitor.sh并设置可执行权限
crontab -e编辑定时任务,加入
*/10 * * * * /root/monitor.sh
10分钟检查一次
发表评论