EdwardWong
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 系统
-
下载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

-
开启mac的sshd(ssh daemon)server服务,mac电脑自带开启server服务, 具体操作如下:
system preference --> sharing
文件夹下:

-
进行ssh远程控制的配置
-
客服端和服务端在同一个局域网
如果在同一个局域网内, 操作非常简单,只需要使用ssh username@ip
输入密码即可。
-
客服端和服务端不再同一个局域网
这种情况有两种解决办法, 一种是通过vpn从而客户端和服务端处于同一个局域网,另一种方法是通过内网穿透将本地ip地址映射到公网上,推荐一个软件ngrok
,具体的安装及配置见ngrok官网
由于对windows的cmd命令操作不是很熟悉, 在使用ngrok config add-authtoken 2CYX7myugNa4F98Qs4LCSjc4kvg_5jn2aAc1FsiBX7rx34b22
添加token的时候需要在安装ngrok
的地方运行cmd
命令。
配置好ngrok
后, 使用ngrok tcp 22
就可以进行内网穿透了。
-
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系统
-
下载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
-
下载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
.
-
如何查看端口号?
使用以下命令grep Port /etc/ssh/sshd_config
,会出现#Port 22
,如果需要修改端口, 只需要把前面的#
注释掉然后改端口号即可。
其他操作与mac都一样。
windows系统
-
下载安装客户端和服务端
管理员运行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
则说明安装成功。
-
运行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_key
和public_key
免密登录
使用ssh-keygen
在客户端生成public key
和private 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 agent
: eval "$(ssh-agent)"
将密钥加入cache
,命令如下: ssh-add ~/.ssh/id_rsa(~/.ssh/acme_id_ed25519)
这样就可以直接使用ssh usrname@id
进行登录了。
客户端和服务端的配置
-
客户端配置
在~/.ssh
文件夹中touch config
生成config
文件, 并按以下规则编写config
文件:
Host myserver
Hostname ip
Port 22
User root
通过以下操作就可以简化ssh username@ip
成ssh myserver
, 免去了输入ip的麻烦。
-
服务端配置
在/etc/ssh
文件夹下有一个sshd.config
文件,使用vim
编辑器打开, 可以在这个文件中配置端口号及PasswordAuthentication
及PermitRootLogin
关于PasswordAuthentication
,是允许客服端的用户能通过密码登录,只有当使用公钥密钥成功配对后,可以将PasswordAuthentication
设为no
, 这样黑客连暴力破解密码的机会都没有。
下图总结了/etc/ssh/sshd_config
的配置文件说明:



SSH命令及使用
在上文中已经介绍了部分ssh命令,下面将总结出这些命令以备查询:
1.使用主机连接远程主机,
ssh user@hostname
主机名可以是ip地址或者域名
-
ssh连接到其他端口
ssh -p 10022 user@hostname
ssh默认连接到目标主机的22端口上,可以使用-p
选项指定端口号
-
使用ssh在远程主机执行一条命令并显示在本地,然后继续在本地工作
ssh pi@10.42.0.47 ls -l
-
在远程主机运行一个图形界面的程序
ssh -x user@ip address
-
构建ssh密钥对
ssh-keygen -t 算法
现在大多数使用rsa
,ed25519
及dsa
算法
-
查看是否已经添加了对应主机的密钥 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
-
打开调试模式
因为某些原因,想要追踪调试建立的ssh连接情况,可以使用-v
选项,其可以看出哪个环节出了问题。
ssh -v user@ip
作者介绍