E

EdwardWong

V1

2022/09/08阅读:218主题:兰青

SSH远程连接服务器及内网穿透

背景

由于身在国外,需要连接国内的服务器, 远程连接可以使用一些远程控制软件例如teamweaver, todesk, 在这里比较推荐todesk, 这款软件可以跨平台使用, 非常方便,但是本人比较喜欢使用ssh命令来远程连接并用scp远程传输文件。由于不在同一个局域网,需要使用内网穿透。

为什么使用ssh?

OpenSSH is a FREE version of the SSH protocol suite of network connectivity tools that increasing numbers of people on the Internet are coming to rely on. Many users of telnet, rlogin, ftp, and other such programs might not realize that their password is transmitted across the Internet unencrypted, but it is. OpenSSH encrypts all traffic (including passwords) to effectively eliminate eavesdropping, connection hijacking, and other network-level attacks. Additionally, OpenSSH provides a myriad of secure tunneling capabilities, as well as a variety of authentication methods

客户端ssh和服务端sshd的下载及启动

mac 系统

  1. 下载openssh-client并开启ssh服务,这个服务是开启client 服务 使用 sudo port install openssh 安装ssh。
  • 使用命令开启ssh的服务(开机自动启动) sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist

  • 使用命令关闭ssh的服务(开机不自动启动) sudo launchctl unload -w /System/Library/LaunchDaemons/ssh.plist

  • 使用命令启动ssh服务但不开机自动启动

sudo launchctl start /System/Library/LaunchDaemons/ssh.plist

  • 使用命令关闭ssh服务

sudo launchctl stop /System/Library/LaunchDaemons/ssh.plist

  • 使用命令重启ssh服务

sudo launchctl restart /System/Library/LaunchDaemons/ssh.plist

  • 查看ssh服务是否开启成功

sudo launchctl list | grep ssh

  1. 开启mac的sshd(ssh daemon)server服务,mac电脑自带开启server服务, 具体操作如下:

system preference --> sharing 文件夹下:

  1. 进行ssh远程控制的配置
  • 客服端和服务端在同一个局域网

如果在同一个局域网内, 操作非常简单,只需要使用ssh username@ip 输入密码即可。

  • 客服端和服务端不再同一个局域网

这种情况有两种解决办法, 一种是通过vpn从而客户端和服务端处于同一个局域网,另一种方法是通过内网穿透将本地ip地址映射到公网上,推荐一个软件ngrok,具体的安装及配置见ngrok官网

由于对windows的cmd命令操作不是很熟悉, 在使用ngrok config add-authtoken 2CYX7myugNa4F98Qs4LCSjc4kvg_5jn2aAc1FsiBX7rx34b22 添加token的时候需要在安装ngrok的地方运行cmd命令。

配置好ngrok后, 使用ngrok tcp 22 就可以进行内网穿透了。

  1. ssh 文件传输
  • 复制本地文件到远程服务器命令
scp local_file remote_username@remote_ip:remote_folder
scp local_file remote_username@remote_ip:remote_file
scp local_file remote_ip:remote_folder
scp local_file remote_ip:remote_file
  • 复制远程服务器文件到本地命令
scp root@www.runoob.com:/home/root/others/music /home/space/music/1.mp3
scp -r root@www.runoob.com:/home/root/others/ /home/space/music

如果远程服务器防火墙有为 scp 命令设置了指定的端口,需要使用-P命令来设置命令的端口号

需要注意的是使用scp命令的时候要确保使用的用户具有可读取远程服务器相应文件的权限,否则scp命令无法起作用。

linux系统

  1. 下载openssh-client并开启ssh服务,这个服务是开启client 服务 一般linux系统(ubuntu)自带安装了ssh client, 如果没有执行sudo apt-get install ssh 或者sudo apt-get install openssh-client

开启openssh服务 sudo /etc/init.d/ssh start或者service ssh start或者sudo systemctl start ssh.service

  1. 下载openssh-server服务器 使用sudo apt-get install openssh-server 开启sshd服务, service sshd start 或者sudo /etc/init.d/sshd start 或者sudo systemctl start sshd.service

在Debian和Ubuntu系统中, sshd.service 被重命名为ssh.service,在Centos/Fedora系统中,使用sshd.service.

  1. 如何查看端口号?

使用以下命令grep Port /etc/ssh/sshd_config,会出现#Port 22,如果需要修改端口, 只需要把前面的#注释掉然后改端口号即可。

其他操作与mac都一样。

windows系统

  1. 下载安装客户端和服务端

管理员运行PowerShell, 在PowerShell中输入:

# 安装OpenSSH客户端
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

# 安装OpenSSH服务端
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

PowerShell中输入:Get-WindowsCapability -Online | ? Name -like 'OpenSSH*' 查看是否安装成功

如果返回:

Name  : OpenSSH.Client~~~~0.0.1.0
State : Installed

Name : OpenSSH.Server~~~~0.0.1.0
State : Installed

则说明安装成功。

  1. 运行SSH服务器

依然是以管理员身份打开PowerShell,然后运行以下命令来启动 sshd service。

# 启动sshd服务
Start-Service sshd

# 将sshd服务设置为自动启动,若不设置需要在每次重启后重新开启sshd
Set-Service -Name sshd -StartupType 'Automatic'

# 确认防火墙规则,一般在安装时会配置好
Get-NetFirewallRule -Name *ssh*

# 若安装时未添加防火墙规则"OpenSSH-Server-In-TCP",则通过以下命令添加
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

使用private_keypublic_key 免密登录

使用ssh-keygen在客户端生成public keyprivate key,默认生产的密钥类型是rsa, 还有ed25519类型, ed25519会更加安全。

ssh-keygen -t ed25519 -C "注释", 其中-t指明了密钥类型。

有两种办法将公钥放到服务器:

  • 方法一:
ssh username@ip 
将存放在客户端的公钥内容copy到客户端中的`~/.ssh`文件夹中的`authorized_keys`中
如果不存在此文件夹,则手动创建
  • 方法二:
ssh-copy-id -i ~/.ssh/id_rsa.pub username@ip  // -i --> input file
这种方法即使在服务端没有`~/.ssh/authorized_keys`时,也会自动创建

在windows中存储公钥和密钥的位置不同,以下参考链接: Windows公钥及密钥的存储位置

以上配置完成后,就可以使用ssh -i ~/.ssh/id_rsa(~/.ssh/acme_id_ed25519) root@ip登录了,如果连-i ~/.ssh/id_rsa都不想输入,可以启动ssh agent

用命令启动ssh agenteval "$(ssh-agent)" 将密钥加入cache,命令如下: ssh-add ~/.ssh/id_rsa(~/.ssh/acme_id_ed25519) 这样就可以直接使用ssh usrname@id进行登录了。

客户端和服务端的配置

  1. 客户端配置

~/.ssh文件夹中touch config 生成config文件, 并按以下规则编写config文件:

Host myserver
Hostname ip
Port 22
User root

通过以下操作就可以简化ssh username@ipssh myserver, 免去了输入ip的麻烦。

  1. 服务端配置

/etc/ssh文件夹下有一个sshd.config文件,使用vim编辑器打开, 可以在这个文件中配置端口号及PasswordAuthenticationPermitRootLogin

关于PasswordAuthentication,是允许客服端的用户能通过密码登录,只有当使用公钥密钥成功配对后,可以将PasswordAuthentication设为no, 这样黑客连暴力破解密码的机会都没有。

下图总结了/etc/ssh/sshd_config的配置文件说明:

SSH命令及使用

在上文中已经介绍了部分ssh命令,下面将总结出这些命令以备查询:

1.使用主机连接远程主机,

ssh user@hostname

主机名可以是ip地址或者域名

  1. ssh连接到其他端口

ssh -p 10022 user@hostname

ssh默认连接到目标主机的22端口上,可以使用-p选项指定端口号

  1. 使用ssh在远程主机执行一条命令并显示在本地,然后继续在本地工作

ssh pi@10.42.0.47 ls -l

  1. 在远程主机运行一个图形界面的程序

ssh -x user@ip address

  1. 构建ssh密钥对

ssh-keygen -t 算法

现在大多数使用rsaed25519dsa算法

  1. 查看是否已经添加了对应主机的密钥 ssh-keygen -F 222.24.。52.147

7.删除主机密钥 可以在~/.ssh/known_hosts文件中手动删除,也可以使用-R选项 ssh-keygen -R 222.24.51.147

8.对所有的数据请求压缩

ssh -C user@ip address

  1. 打开调试模式

因为某些原因,想要追踪调试建立的ssh连接情况,可以使用-v选项,其可以看出哪个环节出了问题。

ssh -v user@ip

分类:

前端

标签:

计算机网络

作者介绍

E
EdwardWong
V1