友情提示:如果您不知道您家路由器管理页面的密码,请您忽略此文。
问题背景:
家中有台笔记本电脑,它是通过家中的路由器与外界联网的,这时,我想通过ssh服务让公司的电脑能连上我家中的笔记本。
可以画个图更直观地解释一下,如下图
家中路由器的IP地址是外网,也就是说外部的电脑可以访问它。路由器会给家里的每个设备各分配一个独特的IP地址,这个IP地址是只适用于路由器控制的局部范围,而每个设备的外部IP都是相同的,也就是路由器的IP地址:201.23.4.57。这时候,问题来了,我想在A上通过ssh连接B,按照命令,应该在A的命令行输入
ssh guanyuzuike@ip_address
其中,guanyuzuike是我在电脑B上的用户名,那么这个ip_address应该怎样填呢?
如果填192.168.1.103, 那显然是不行的,因为它只是一个局部的IP,外网并不能访问它。如果填201.23.4.57,那么这个时候路由器就有点不爽了,他会问:你到底是要我连哪个设备??
我们的目标:
今天的博客,就是解决帮路由器解决连哪个设备的问题。 具体来说,今天的博客内容将让你实现以下功能:
可以在A命令行输入以下任意一条指令,都可以连上家中的电脑B
# command 1
ssh guanyuzuike@201.23.4.57
# then input password of guanyuzuike
# command 2
ssh guanyuzuike@xxxxxx
# then input password of guanyuzuike
# command 3
ssh home
# then input password of guanyuzuike
# command 4
ssh home
# no need to input anything
从以上四条指令来看,我们的终极目标是实现第四条指令,然后也不需要输入用户密码,直接连上B。
适用环境及准备:
A安装ssh客户端,B安装ssh服务端并开启ssh服务。
安装客户端请自行上网查询。对于Linux系统,安装ssh服务端和开启的指令为(仅供参考)
sudo apt-get install openssh-server
sudo service ssh start
具体操作:
1. 实现command 1
要连接B,肯定是要通过路由器的外网IP,即201.23.4.57。但是,要引导路由器连上B,必须要借助路由器的接口转发功能。
第一步:登录路由器管理界面
对于大多数路由器,在浏览器输入192.168.1.1即可进入界面(但有的路由器是别的网址,这个时候就需要机智的你研究一下你家路由器了),输入密码登录,进入如图所示的页面(界面风格因路由器各种型号和版本而异,但功能差不多)
第二步:找到接口转发设置窗口
接口转发,也称port forwarding,也称虚拟服务器,比如我的就在高级设置>>高级用户>>虚拟服务器 里面,一般长得差不多,如下
点击添加添加虚拟服务器;
常用服务器不用填,内部端口填22(ssh御用端口),外部端口可与内部端口一样,也可以填个大点的数以防止与现有的端口重复,比如我填2237,IP地址填B的局部IP:192.168.1.103(忽略我图上填的);协议类型选all(有的路由是选both,反正就是支持所有协议的意思)。最后保存。此操作的意思就是让外网通过端口2237给路由器传输命令,让路由器知道我要转发局部IP为192.168.1.103的ssh服务(为什么是ssh服务?因为内部端口22代表ssh服务)。
如果外部端口填的是22,那么此时就可以在A上调用command 1对B进行访问。
如果外部端口填的是别的数,如2237,那么,有两种方式对B进行访问:
方式1, 在A上调用指令:ssh -p 2237 guanyuzuike@201.23.4.57 也就是说在command 1的基础上加上 -p 2237,代表外部端口是2237(默认是22)
方式2, 待会讲。
2. 实现command 2
command 2里面的xxxxxx其实是路由器外网IP的一个域名。为什么要搞一个域名,因为路由器的外网IP不会保证一直不变,也就是说,可能几个月后,它从现在的201.23.4.57会变成201.23.4.44(瞎编的,反正就是一个不同的地址)。这时候,就需要调用ssh -p 2237 guanyuzuike@201.23.4.44。一个字,麻烦。而有一个域名的时候,比如:guanyuzuike.net,那么我可以从始至终,从盘古开天到天荒地老,我一直调用ssh -p 2237 guanyuzuike@guanyuzuike.net,都可以成功连上B。怎么搞?如上图,找到路由管理页面的DDNS,会有一个花生壳的服务,如下
注册一个花生壳账号,需要花点RMB(域名大概8块一个),可以得到一个你设置的个性域名。
3. 实现command 3
上面的命令,看起来总有点麻烦。所以,如何省去 -p 2237,甚至直接调用ssh home ?
好的,请在A打开文件~/.ssh/config(它是一个文本文件,没有的话请直接创建一个这样的文件),输入以下
Host home
User guanyuzuike
Port 2237
HostName guanyuzuike.net
# if you do not have an alias for ip
# HostName 201.23.4.57 #it is your ip address
这里顺便也变上面提到的“方式2”也讲了
4. 实现command 4
以上还是麻烦,因为每次ssh的时候,需要输密码。下面,就可以通过创建ssh key,来解决这个问题。
第一步:在A中,命令行输入
ssh-keygen
Enter file in which to save the key (/home/xx/.ssh/id_rsa): 这里你可以取一个别的名字,比如/home/xx/.ssh/id_home_rsa,xx为你在A上的用户名
这样,在/home/xx/.ssh/下会生成两个文件:id_home_rsa和id_home_rsa.pub。
第二步:在~/.ssh/config(其实也就是/home/xx/.ssh/config)里添加一项:
Host home
User guanyuzuike
Port 2237
HostName guanyuzuike.net
IdentityFile /home/xx/.ssh/id_home_rsa
第三步,打开B中的文件/home/guanyuzuike/.ssh/authorized_keys(同样是一个文本文件,如果没有请创建一个),将刚刚id_home_rsa.pub里面的内容(其实也就是一行内容)复制作为authorized_keys里面的一行。
这样,你就可以在A上简单调用ssh home,连上B,连密码都不用输。
当然,上面说的所有,都是基于以下条件:
你没有遇到其他问题
当你不满足以上条件时,可以采取以下办法:
机智如你,上网查询
祝您愉快。