ssh实现办公室电脑连接家中的电脑

时间:2024-03-06 10:47:25

友情提示:如果您不知道您家路由器管理页面的密码,请您忽略此文。

 

问题背景:

家中有台笔记本电脑,它是通过家中的路由器与外界联网的,这时,我想通过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,连密码都不用输。

 

当然,上面说的所有,都是基于以下条件:

你没有遇到其他问题

当你不满足以上条件时,可以采取以下办法:

机智如你,上网查询

祝您愉快。