通过ssh进行远程访问

Posted ChenLing10032

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过ssh进行远程访问相关的知识,希望对你有一定的参考价值。

文章目录

前言

        在学 ssh,学了通过 ssh 远程连接服务器,免密登录。自己额外尝试的时候,顺便再往外拓展了一点点。之后就可以实现在服务器上配置环境,其他电脑就不需要配置环境,远程连接到服务器上就可以开始办公。而不需要每台电脑都需要配置环境,而且需要一样的环境,从而尽可能减轻配置环境对工作的影响。也可以实现在家远程访问公司的服务器,远程办公。
预期结果:

  • 局域网内的两个终端的远程连接
  • 不同网段的两个终端的远程连接

1. 前期准备

计算机若干,云服务器适量(樱花穿刺也行,在研究),装上一个虚拟机。
需要充当服务器也就是需要让别人访问的机器,需要装上 OpenSSH 服务器的服务。

1.1 Windows 安装 OpenSSH 服务器

这东西用来让别人可以连接到这台电脑上

  • Win + S 打开搜索框,输入 添加可选功能,打开
  • 添加 ssh 服务器,客户端应该默认已经安装了
  • 打开计算机管理,将 OpenSSH 相关的两个服务启动,并将启动项改成自动。
  • 打开 powershell 终端,检查两个服务是否有工作。 注意是 \\huge\\colororange注意是 注意是 p o w e r s h e l l \\huge\\colorredpowershell powershell 不是 c m d 终端 \\huge\\colororange不是 cmd 终端 不是cmd终端
ssh -V
netstat -an | findstr :22


注意: \\huge\\colorred注意: 注意:这里有的人在运行第二个命令的时候会出错,那是相应的工具没有装上,自己百度搜一下 netstat 相应的工具。

1.2 Linux 安装 openssh-server

效果是可以充当一个服务器让其他终端访问

  • 执行安装命令
sudo apt-get install openssh-server
  • 查看 ssh 是否在工作
sudo ps -e | grep ssh

  • 开放 22 号端口:修改 /etc/ssh/ssh_config 文件里第 40 行左右,将 Port 22 这句取消注释
sudo vim /etc/ssh/ssh_config

  • 重新启动 SSH 服务
sudo service ssh restart

一般来说,打开之后都是没有行号的,所以可以在一般命令模式下 :set nu 以显示行号,或者在一般命令模式下输入 40G 直接跳到第 40 行。

2. 局域网内的两个终端远程连接

由于我没有两台电脑,所以使用虚拟机来模拟。虚拟机的网络适配器选择 nat,那么实机就和虚拟机都处在同一个局域网内。虚拟机的系统是 Ubuntu20

2.1 获取两台机器的ip地址

  • 使用 ifconfig 查看虚拟机的ip地址
  • 查看虚拟机所用的网络适配器对应的虚拟网卡


  • Windows 下使用 ipconfig 命令查看对应虚拟网卡的 ip 地址。

2.2 测试两台机器网络连接是否可达


2.3 Windows 远程连接 Linux

虚拟机作为服务器需要先开启22端口且开启了SSH服务器的服务。详细看第 1 点。

  • 远程连接命令格式: 远程连接命令格式: 远程连接命令格式:
# user:用户名称, address:服务器ip地址
ssh user@address

  • 远程连接记录会保存在服务器中,Linux下的路径是 ~/.ssh/known_hosts

2.4 Linux 连接到 Windows

准备工作同样,需要先开启Windows下的SSH服务器。

  • 远程连接命令: 远程连接命令: 远程连接命令:
# 登录账号:自己登录的账号名称,如果是微软账号登录,为了防止@出错,账号记得用""括起来。
ssh 登录账号@ip地址
  • 微软账号登录:密码就是账号密码
  • 本地登录:密码是密码,不是 PIN


  • 远程访问信息保存在 C:\\Users\\hasee\\.ssh

3. 不同网段的两个终端远程连接

3.1 浅述一下

        通常来说,使用到远程访问的两台机器,一般都不会在同一个局域网下。由于IPV4地址资源的问题,我们的机器所在的网络位置都是某一个公网 ip 下的内网中,而我们访问互联网都是需要拥有公网 ip,所以访问互联网都是需要经过我们上一级那一个拥有公网 ip 的路由器。但是反过来的话,也就是公网上的一台机器想要访问到内网中的一台机器,是不能实现的,因为内网的机器所拥有的 ip 地址是通过上一级路由器管理的,也就是对外隐藏。
        我们不妨称我们可以操作的机器为 本机,需要远程连接到的机器为 内网服务器。远程连接其实就是本机访问内网服务器,媒介就是互联网。而本机是可是通过路由访问到公网,但是我们是无法得知内网服务器的地址,因为内网服务器同样通过路由才能访问公网,内网服务器是没有公网 ip 的,所以本机无法直接访问到内网服务器。
        既然内网服务器没有公网 ip 导致无法直接访问,那我们专为内网服务器安排一台有公网 ip 的服务器,本机访问这台 中转服务器 的时候,中转服务器就将这个请求转发给内网服务器。那么就有另一个问题,内网服务器没有公网 ip,中转服务器同样不可达。所以我们还需要借助一个工具 frp,在内网服务器和中转服务器之间架一座桥。

3.2 下载 frp 工具

frp 工具下载到本地,配置好后再上传到对应的机器。

  • 下载地址
    github下载地址
  • 下载对应版本的 frp 工具
    • 这是我的垃圾服务器,安装的镜像是 Centos,那么我们就下载 Linux x64 版本的 frp 工具
    • 内网服务器是 Windows 系统,下载对应的 windows_amd64 版本

3.3 中转服务器的配置

  • 解压 Linux 对应的 frp 压缩包
tar -zxvf ./frp*.tar.gz


在 内网服务器 和 中转服务器 这个网络中,中转服务器 相当与服务器端,所以只需要用到 frps* 这3个文件。

  • 配置 frps.ini 文件
  • 开放自己设置的端口号
  • frps 这个启动器赋予 执行权限
chmod +x frps

  • 启动服务

3.4 内网服务器的配置

  • 解压 Windows 对应的 frp 压缩包

  • 配置 frpc.ini 文件

  • 中转服务器打开 转发端口

  • 启动 frpc


    注意:一定要先把服务器端打开,然后打开客户端 \\colorred注意:一定要先把服务器端打开,然后打开客户端 注意:一定要先把服务器端打开,然后打开客户端

3.5 本机远程连接内网服务器

ssh user@中转服务器公网ip -p 指定端口


4. frp 工具自启动

经过上面的步骤,虽说可以实现了远程登录,但是每次登录都需要我们手动开启,也就是手动运行两个 frp 工具,很不方便,所以给配一个自启动。

4.1 中转服务器的 frp 自启动

  • 创建 /lib/systemd/system/frps.service,将以下内容添加进去
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
User=root       #只有root用户可以启动
Restart=on-failure
RestartSec=5s
ExecStart=/root/frps/frps -c /root/frps/frps.ini #frps启动命令,记得要>把文件夹放到对应的路径,还有改名字
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
  • 使用 systemctl 命令,使 frps 服务后台运行
systemctl daemon-reload		#重新加载服务配置
systemctl enable frps		#设置下次开机时,自启后面的服务,相对的,disable 为取消自启
systemctl start frps		#立即启动后面的服务,相对的,stop为立即停止
systemctl status frps		#列出 后面 服务的状态,会列出很多信息

  • 常用命令
# 启动frp
systemctl start frps
# 停止frp
systemctl stop frps
# 重启frp
systemctl restart frps
# 查看frp状态
systemctl status frps
  • 如果没有 systemctl,执行以下命令安装:
yum install systemd		#我是CentOS,命令是yum

4.2 内网服务器

  • frpc 目录中新建 autostart.bat 脚本文件
@echo off
if not defined TAG (
set TAG=1
start wt -p "cmd" %0
exit
)
:home
frpc -c frpc.ini
goto home

上半部分是为了让运行 bat 文件时能在 Windows Terminal 而不是命令提示符中打开;下半部分其实只是手动开启 frpc 的代码,goto home 是为了让出现异常崩溃后能重新启动 frpc。如果崩溃后只需要退出,那么可以将最后三行改为:

frpc -i frpc.ini
exit

  • 创建 autostart.bat 的快捷方式。
  • 打开 C:\\Users\\UserName\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\,将快捷⽅式粘贴到进去
  • 这个方法在每次 PC 开机时,就会弹出 Windows Terminal 的窗口,可能有点碍事,但你可以直接看到 frpc 的运行状态
  • 如果你暂时不需要启动 frpc,直接 Ctrl + C 终止即可,然后需要运行的时候再去手动运行 autostart.bat 即可。
  • 如果提示 Windows 找不到文件 'wt'。这是 Windows 下没有 Terminal 终端,去微软商店搜索下载。

5. ip映射

这样做的结果是,在任何地方,后面的别名都会被翻译成前面的ip地址

5.1 Windows 下设置 ip 映射

  • C:\\Windows\\System32\\drivers\\etc\\hosts 下添加内容:
120.xxx.xxx.xxx CentOS

5.2 Linux 下设置 ip 映射

  • 切换到 root 账户,然后在 /etc/hosts 下添加同样的内容
sudo su
vim /etc/hosts

5.3 对 SSH 客户端进行配置

这个操作给予 SSH 客户端的一个参数配置方案,在文件内指定好 ip、用户、端口,再将这些东西绑定到一个别名上,所以远程连接的命令变为 ssh 别名

推荐使用这种方法 \\huge\\colorred推荐使用这种方法 推荐使用这种方法

  • ~/.ssh/ 文件夹中新建一个文件 config
  • 将以下内容写入
Host mywindows
	HostName 120.xxx.xxx.xx
	User hasee
	Port 3434


6. 免密登录

ip 映射之后,我们登录的时候依然需要输入密码,那我们再来配置一下免密登录。大致的原理是利用 SSH 生成的公钥,传到 内网服务器,相当于在 内网服务器 添加了一个白名单。

  • 首先打开 内网服务器 下的 C:\\ProgramData\\ssh\\sshd_config,确保以下三行没有被注释:
PubkeyAuthentication yes					#允许远程使用公钥登录
AuthorizedKeysFile .ssh/authorized_keys		#公钥的文件
PasswordAuthentication no					#允许远程使用密码登录
  • 确保以下两行已被注释,位置在最后
Match Group administrators
	AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
  • 重启 SSH 服务:Restart-Service sshd,如果失败在手动在 “计算机管理” > “服务” 中重启 OpenSSH SSHServer
  • 本机生成密钥
ssh-keygen


如上,框内的就是免密登录所用到的 公钥,隔壁那个是私钥,不要给其他人看。

  • 本机 将公钥上传到 内网服务器
ssh-copy-id myserver1		#myserver1 是前面 SSH 配置好的参数

上传不成功

别急,上网查了一下,这是 Windows 的 bug,手动将公钥复制到 内网服务器 就可以了。

  • 本机 上复制公钥
vim ~/.ssh/id_rsa.pub
  • 将内容复制到 C:\\Users\\hasee\\.ssh 目录下的 authorized_keys 文件里,没有这个文件就新建一个。

7. 结尾

参考资料1
参考资料2
参考资料3

通过公钥进行 ssh 访问失败“权限被拒绝(公钥)”

【中文标题】通过公钥进行 ssh 访问失败“权限被拒绝(公钥)”【英文标题】:ssh access by public key failed "Permission denied (publickey)" 【发布时间】:2016-09-24 04:27:27 【问题描述】:

我想设置 crontab 来从远程服务器获取资源到本地服务器。

使用的步骤如下

在本地服务器中 1. 没有密码的 ssh-keygen 2. 使用 SCP 将公钥复制到服务器

在远程服务器中

    cat id_rsa.pub >> ~/.ssh/authorized_keys 编辑 .ssh 配置文件 sudo nano /etc/ssh/sshd_config 如下 RSA 认证是 PubkeyAuthentication 是 ChallengeResponseAuthentication 是 没有密码验证 UsePam 没有 通过 sudo /etc/init.d/ssh reload 重新加载 ssh sudo chmod 700 .ssh cd .ssh sudo chmod 600 授权密钥

完成所有这些配置后,我无法通过公钥或正常登录凭据访问远程服务器。

如果我尝试通过 PuTTy 登录,则在输入后要求我登录。它说“断开连接:没有支持的身份验证方法可用(服务器发送:公钥)”

如果我尝试通过 SSH 从本地服务器 ssh sana@127.168.1.1 登录,它会显示“权限被拒绝(公钥)”

服务器详情: Ubuntu 14.04 我用另一个用户而不是 root 用户设置了公钥。

提前感谢大家的支持。

【问题讨论】:

@fedorqui 你能帮我解决这个问题吗? 检查远程 ssh 服务器上的日志以获取来自 sshd 的消息。这些消息很可能位于 /var/log 目录中的某个文件中。 【参考方案1】:

试试

chmod 444 ~/.ssh/authorized_keys

该文件应该只能读取,并且您的用户应该可以读取。 并确保 authorized_keys 文件在 sana 用户主目录中

【讨论】:

以上是关于通过ssh进行远程访问的主要内容,如果未能解决你的问题,请参考以下文章

Linux网络服务——远程访问及控制(ssh远程访问实验)

Ubuntu允许root远程登录配置

linux----SSH远程访问及控制!

Linux远程访问及控制

JSCH通过密钥文件进行远程访问

Linux远程访问及控制