【Linux】SSH:远程连接
基础配置与连接
修改配置
SSH的配置文件通常位于/etc/ssh/sshd_config
。可以通过以下命令编辑:
sudo vi /etc/ssh/sshd_config
常见配置选项:
- 端口:默认是22,可以通过修改
Port
选项更改SSH服务的监听端口,增强安全性。 - 允许的用户:使用
AllowUsers
选项可以指定哪些用户有权限通过SSH登录,从而限制访问。 - 禁用root登录:通过设置
PermitRootLogin no
来防止直接以root用户身份登录,减少被攻击的风险。 - 密码认证:可以通过
PasswordAuthentication no
禁用密码登录,只允许使用密钥认证,从而提高安全性。
修改完配置后,重启SSH服务以使更改生效:
sudo systemctl restart ssh
生成SSH密钥对
为了使用密钥认证,可以生成SSH密钥对。执行以下命令:
ssh-keygen -t rsa -b 4096
根据提示选择文件保存位置(默认是~/.ssh/id_rsa
),并设置一个密码以增强密钥的安全性(可选)。
将公钥复制到远程主机
使用ssh-copy-id
命令将公钥复制到远程主机,确保无密码登录:
ssh-copy-id user@remote_host
这将把公钥添加到远程主机的~/.ssh/authorized_keys
文件中,使得以后可以通过密钥登录。
远程连接
使用以下命令连接到远程主机:
ssh user@remote_host
如果你更改了SSH端口,可以使用以下格式指定端口:
ssh -p port user@remote_host
SSH端口转发是一种通过SSH协议将网络流量从一个端口安全地转发到另一个端口的方式。它主要有三种类型:本地端口转发、远程端口转发和动态端口转发。下面是详细介绍每种类型的用法及示例。
端口转发
本地端口转发
本地端口转发允许你将本地计算机的某个端口流量转发到远程主机的指定端口。
语法:
ssh -L [本地端口]:[目标主机]:[目标端口] user@remote_host
示例:
假设你希望访问远程数据库服务器(远程主机)上的MySQL服务(默认端口为3306),可以使用如下命令:
ssh -L 3306:localhost:3306 user@remote_host
此时,在本地计算机上访问localhost:3306
就相当于直接访问远程主机的MySQL服务。
远程端口转发
远程端口转发允许你将远程主机的某个端口流量转发到本地计算机的指定端口。
语法:
ssh -R [远程端口]:[目标主机]:[目标端口] user@remote_host
示例:
假设你希望让远程主机的某个服务(如HTTP)访问你本地的Web服务器(运行在本地的80端口),可以使用如下命令:
ssh -R 8080:localhost:80 user@remote_host
这样,在远程主机上访问localhost:8080
将会被转发到你的本地Web服务器。
动态端口转发
动态端口转发允许你通过SSH创建一个SOCKS代理,能够转发任意流量。这对于需要通过SSH隧道访问多个目的地时非常有用。
语法:
ssh -D [本地端口] user@remote_host
示例:
你可以运行以下命令来创建一个SOCKS代理:
ssh -D 1080 user@remote_host
然后在本地计算机上配置你的应用程序(如浏览器)使用SOCKS代理localhost:1080
。所有通过这个代理的流量都会通过SSH隧道安全地转发到远程主机。
SSH配置文件
SSH配置文件:可以在~/.ssh/config
中配置端口转发的简写,减少输入的复杂性。
Host remote
# 定义一个主机别名为 "remote",可以用来简化 SSH 命令。
# 这个别名可以在后续的 SSH 命令中使用,如 `ssh remote`。
HostName remote_host
# 指定实际的远程主机名或IP地址。
# 在使用这个别名(remote)时,SSH 将连接到这个指定的主机。
User user
# 指定用于SSH连接的用户名。
# 当连接到远程主机时,将以这个用户的身份进行登录。
LocalForward 8080 localhost:80
# 设置本地端口转发。
# 将本地计算机的8080端口的流量转发到远程主机的localhost上的80端口。
# 例如,当你在本地浏览器中访问 `http://localhost:8080` 时,实际访问的是远程主机的Web服务(HTTP服务)。
RemoteForward 9090 localhost:3000
# 设置远程端口转发。
# 将远程主机的9090端口的流量转发到本地计算机的3000端口。
# 当远程主机访问 `http://localhost:9090` 时,实际上会访问本地计算机的服务。
DynamicForward 1080
# 设置动态端口转发,创建一个SOCKS代理。
# 本地计算机的1080端口会作为SOCKS代理使用,所有流量都会通过SSH隧道转发。
# 这样可以将应用程序(如浏览器)配置为使用这个SOCKS代理,实现通过SSH的安全访问。
通过这种方式,可以用 ssh remote
来启动所有配置的端口转发。
注意事项
- 确保SSH服务器配置文件(
/etc/ssh/sshd_config
)中允许端口转发(AllowTcpForwarding yes
)。 - 在使用端口转发时,注意防火墙设置,确保相关端口开放,以免影响访问。
- 使用动态端口转发时,确保你的应用程序支持SOCKS代理功能。
SSH文件传输主要通过两种工具实现:SCP
(Secure Copy Protocol)和SFTP
(Secure File Transfer Protocol)。这两种工具都利用SSH协议提供安全的文件传输功能。以下是它们的详细介绍及用法。
文件传输
使用SCP进行文件传输
SCP
是一种简单的文件传输工具,主要用于快速安全地复制文件和目录。其基本命令格式如下:
scp [选项] [源文件] [目标]
- -r:递归复制整个目录,适合传输文件夹及其内容。
- -P [端口号]:指定SSH连接使用的端口(注意大写P),用于访问非默认端口的SSH服务。
- -i [私钥文件]:指定使用的SSH私钥文件,适合密钥认证的场景。
- -v:详细模式,显示传输过程的信息,便于调试和确认传输状态。
示例:
-
从本地复制文件到远程主机:
scp /path/to/local/file user@remote_host:/path/to/remote/directory
这个命令将指定的本地文件上传到远程主机的指定目录。
-
从远程主机复制文件到本地:
scp user@remote_host:/path/to/remote/file /path/to/local/directory
通过这个命令,你可以将远程主机上的文件下载到本地。
-
递归复制目录:
scp -r /path/to/local/directory user@remote_host:/path/to/remote/directory
这将整个本地目录及其内容上传到远程主机。
-
指定端口:
scp -P 2222 /path/to/local/file user@remote_host:/path/to/remote/directory
这个命令允许你通过指定端口连接SSH服务,进行文件传输。
使用SFTP进行文件传输
SFTP
是一种交互式文件传输协议,提供比SCP更丰富的功能,如文件管理、目录浏览等。其基本命令格式如下:
sftp [选项] [user@remote_host]
在SFTP交互模式下,可以使用以下命令:
- ls:列出远程目录中的文件,方便查看可用文件。
- cd [目录名]:切换到远程目录,帮助在不同目录之间导航。
- lcd [目录名]:切换到本地目录,便于选择上传或下载的目标。
- put [本地文件]:上传本地文件到远程主机,快速分享数据。
- get [远程文件]:下载远程文件到本地,轻松获取所需资料。
- mput [本地文件1] [本地文件2]:批量上传多个文件,节省时间和精力。
- mget [远程文件1] [远程文件2]:批量下载多个文件,便于大规模数据传输。
- exit:退出SFTP会话,结束当前操作。
示例:
-
启动SFTP会话:
sftp user@remote_host
这将建立与远程主机的SFTP连接。
-
上传文件:
put /path/to/local/file
上传指定的本地文件到当前远程目录。
-
下载文件:
get /path/to/remote/file
下载指定的远程文件到当前本地目录。
-
切换目录:
cd /path/to/remote/directory lcd /path/to/local/directory
通过这些命令,可以轻松在远程和本地目录之间切换。
-
列出文件:
ls
查看当前远程目录中的文件,确认文件的存在与状态。
常用SSH命令参数
参数 | 功能描述 | 示例 |
---|---|---|
-L [本地端口]:[目标主机]:[目标端口] | 设置本地端口转发。 | ssh -L 8080:localhost:80 user@remote_host |
-R [远程端口]:[目标主机]:[目标端口] | 设置远程端口转发。 | ssh -R 9090:localhost:3000 user@remote_host |
-D [本地端口] | 设置动态端口转发,创建SOCKS代理。 | ssh -D 1080 user@remote_host |
-p [端口号] | 指定SSH连接的端口(默认为22)。 | ssh -p 2222 user@remote_host |
-v | 启用详细模式,显示调试信息,便于排查连接问题。 | ssh -v user@remote_host |
-C | 启用压缩,适用于慢速连接,可能会提高性能。 | ssh -C user@remote_host |
-i [私钥文件] | 指定使用的SSH私钥文件。 | ssh -i ~/.ssh/id_rsa user@remote_host |
-N | 不执行远程命令,仅用于端口转发。 | ssh -L 8080:localhost:80 -N user@remote_host |
-f | 在后台运行SSH会话,通常与-N结合使用。 | ssh -f -L 8080:localhost:80 -N user@remote_host |
-o [选项] | 可以传递特定的SSH配置选项。 | ssh -o StrictHostKeyChecking=no user@remote_host |