开始之前
前文:
超详尽教程!在Windows 10内置Ubuntu子系统上搭建私有云
(续):超详尽教程!在Windows 10内置Ubuntu子系统上搭建私有云,讲解了怎样在Windows 10上开辟WSL子系统并搭建私有云盘,大家反响还不错,点击已经过千。这一篇继续给这个小系统添加功能,今天的主题是:安装SSH服务,实现远程终端连接。
给Ubuntu安装SSH服务
第一步,打开Ubuntu命令行窗口,切换到root用户,安装tasksel程序并执行:
# apt install tasksel -y
# tasksel
出现下面这个紫色的小窗口:
在列表底部空格键选择OpenSSH server(注意先用空格取消默认的几个选择),Tab键把光标切到OK按钮上,回车,等待自动安装结束,重新回到命令行,SSH服务器就装好了。
看着很简单,试着启动一下就出错了(囧)。
# /etc/init.d/ssh start
* Starting OpenBSD Secure Shell server sshd
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key
不过这个难不倒人,简书上就有大神给出了解决方案,这是因为新版的opensshd 中添加了ed25519 做签名验证,而之前系统里没这个算法的证书。生成一下再次启动,这次就OK了。
# ssh-keygen -A
ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519
# /etc/init.d/ssh start
* Starting OpenBSD Secure Shell server sshd [ OK ]
Windows 10安装PuTTy客户端工具
PuTTy 是最有名的 SSH 和 telnet 客户端,最初由 Simon Tatham 为 Windows 平台开发。非常易于安装和使用,通常大部分的配置选项你都不需要修改。只需要输入少量基本的参数,就可以开始很简单地建立连接会话。
另找一台局域网内的电脑(下称电脑B),作为客户端远程连接装有Ubuntu的电脑(下称电脑A),在电脑B上点此下载 PuTTy最新版(0.71)。根据你的操作系统选择64位或32位版本安装即可,我选64位版本。安装之后,电脑B的开始菜单里多了这么几个东东:
点击Putty图标,打开PuTTy Configuration窗口,在Hostname里输入电脑A的IP地址,点击Open按钮进行试连接:
结果被踢回来了:
这才想起电脑A的22端口没打开,当然拒绝访问了。在(续):超详尽教程!在Windows 10内置Ubuntu子系统上搭建私有云一文中,我详细写了Windows 10的端口开放方法,只不过上次是开放8080端口,这次是22端口,方法完全一样,这里不再详述,只需进入电脑A的控制面板->系统和安全->Windows Defender防火墙->高级设置,点击“入站规则->新建规则”,开放22端口,重启电脑A。
再次从电脑B用PuTTy连接电脑A,这次还是被踢回来,只不过错误原因变了:
配置SSH连接秘钥
Linux就是这样,软件安装没什么难度,但配置起来头疼事一堆。对我这样的小白非常不友好。之所以出现publickey错误,是因为新版的SSH-2默认使用秘钥认证登陆,也就是说,需要钥匙才行,密码已经落后了。
回到电脑A的Ubuntu命令行窗口,用vi打开SSH服务的配置文件:
# vi /etc/ssh/sshd_config
里面有这么一句:
# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
意思是,缺省设置禁止明文密码登陆。将这句改成:
# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication yes
保存文件,重启ssh服务:
# /etc/init.d/ssh restart
* Restarting OpenBSD Secure Shell server sshd [ OK ]
再次用PuTTy连接,这次成功了:
login as: niuyoucai
niuyoucai@localhost's password:
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.4.0-17134-Microsoft x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
1 package can be updated.
0 updates are security updates.
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
不过,明文密码太low了吧,怎么也得试试秘钥登陆是不是?再次编辑ssh配置文件,做下面几个改动:
# vi /etc/ssh/sshd_config
PasswordAuthentication yes -> PasswordAuthentication no
#PubkeyAuthentication yes -> PubkeyAuthentication yes
#AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2 -> AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
保存退出,用ssh-keygen生成rsa秘钥,并设置passphrase也就是秘钥的密码,成功后出现下面信息:
# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:LfobOqio9U0yxq/Y8z9BBAh7XuiUD6VyveTGlOc4Ggs root@MATEBOOK-D
The key's randomart image is:
+---[RSA 2048]----+
| .. .o. |
| ..* .. |
| o O *.. |
| B O =.. |
| E + O.S . |
| o = o.. |
| . B.o .. |
| o =o*.o.. |
|+ o.++=o+o |
+----[SHA256]-----+
这样就生成了一个/root/.ssh目录,下面有两个秘钥文件:
#ls ~/.ssh
id_rsa id_rsa.pub
id_rsa是私钥,id_rsa.pub是公钥,这俩总是成对出现。照我的粗浅理解,公钥和私钥就像钥匙和锁的关系,公钥是锁,私钥则是钥匙。下面把私钥文件拷贝到Windows目录里:
# cp ~/.ssh/id_rsa /mnt/c/temp/
重启ssh服务:
# /etc/init.d/ssh restart
* Restarting OpenBSD Secure Shell server sshd [ OK ]
然后去电脑A的C:\temp目录里找到这个文件,拷贝到电脑B(客户端)的任意目录里备用。
回到电脑B,打开PuTTYgen,点击Load,选择刚刚拷贝过来的id_rsa文件,提示输入passphrase,也就是刚才生成秘钥时设定的秘钥的密码:
成功之后是这样:
点击Save private key按钮,保存一个id_rsa.ppk文件,名字可以任取,但扩展必须是ppk,这个操作的目的,是将ssh server生成的私钥加工成PuTTy自己的私钥格式文件,如果原封不动地用服务器生成那个,死活登陆不上去,我在这里卡壳儿了很久,差点放弃。这个文件就是今后客户端免密登陆ssh服务器的钥匙了,一定要保存好,随身携带吧。
再次回到电脑A,在Ubuntu命令行窗口做最后的ssh服务器配置:
# cd ~/.ssh
# cp id_rsa.pub authorized_keys
# chmod 600 authorized_keys
# /etc/init.d/ssh restart
这样做的目的是将公钥文件内容放到authorized_keys文件里,因为私钥验证只认这个名字的公钥文件,最后重启ssh服务。
回到客户端电脑B,打开PuTTy,进行连接,先输入电脑A的IP:
再点击Data设置默认登陆用户:
然后点击SSH->Auth,点击Browse选择刚才用PuTTy生成的id_rsa.ppk私钥文件:
最后别忘了回到Session,给这一套配置起个名字,点击Save保存一下,我保存成wsl,以后登陆直接双击wsl即可。
然后点击Open,终端窗口出现了,敲入Passphrase(秘钥的密码)之后,成功以root用户身份远程登陆Ubuntu!
看到那个绿色的小光标,有种相当开心的感觉。
后记
至此,我的Ubuntu子系统增加了远程客户端登陆功能。用秘钥方式访问SSH非常安全,即使别人知道你的root密码,没有钥匙,也无法登陆你的linux,这就是SSH-2抛弃密码登陆方式的原因。如果想从外网登陆电脑A的Ubuntu,只需要在路由器设置一个22端口的映射即可,详细方法在(续):超详尽教程!在Windows 10内置Ubuntu子系统上搭建私有云一文中有讲解,不再赘述。这样你在外面的时候,可以通过路由器的Wan IP登陆电脑A上的这个小小linux系统,是不是很酷呢?天气越来越热了,我也开启宅男模式,躲在家里各种折腾,越研究越有意思,生活在于折腾,文章写的辛苦,望各位多多点赞,谢了!