通过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 版本
- 这是我的垃圾服务器,安装的镜像是 Centos,那么我们就下载
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. 结尾
通过公钥进行 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进行远程访问的主要内容,如果未能解决你的问题,请参考以下文章