ssh远程连接服务

TOC

什么是SSH?

SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程 复制等功能
SSH协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令
SSH为建立在应用层和传输层基础上的安全协议。对数据进行压缩,加快传输速度

SSH服务结构:
服务名称:sshd
服务端主程序:/usr/sbin/sshd
服务端配置文件:/etc/ssh/sshd_config
客户端配置文件:/etc/ssh/ssh_config

安装启动sshd服务

CentOS:

yum install -y openssh-*
systemctl start sshd

Ubuntu:

apt-get install openssh-*
systemctl start ssh

服务端配置文件详解

sshd服务端配置文件:/etc/ssh/sshd_config

# ================================
# SSH 服务配置文件 (sshd_config)
# ================================
# 修改配置后需要执行 systemctl restart sshd 才能生效
# 建议:先开一个备用终端测试新的 SSH 登录,确认无误后再关闭旧会话

# ----------------
# 基本设置
# ----------------
Port 2222                 # SSH 服务监听端口,默认是 22,改为其他端口能减少暴力破解
ListenAddress 0.0.0.0     # 监听地址,0.0.0.0 表示所有网卡,若仅限本机可设为 127.0.0.1
Protocol 2                # SSH 协议版本,只允许 SSH-2(更安全)

# ----------------
# 用户认证
# ----------------
PermitRootLogin no        # 是否允许 root 用户直接登录,建议 no(安全风险高)
PasswordAuthentication no # 是否允许密码登录,建议 no,只用密钥认证
PubkeyAuthentication yes  # 是否启用公钥认证(必须开启,配合上面禁用密码登录)
AuthorizedKeysFile .ssh/authorized_keys  # 公钥文件路径(用户家目录下)

PermitEmptyPasswords no   # 是否允许空密码,必须 no
ChallengeResponseAuthentication no # 禁止质询应答认证(老旧方式,建议禁用)

# ----------------
# 用户/组限制
# ----------------
AllowUsers admin devops   # 仅允许 admin 和 devops 用户登录
#DenyUsers guest test     # 拒绝 guest 和 test 用户登录(可选)
#AllowGroups sshusers     # 仅允许 sshusers 组登录(可选)
#DenyGroups nogroup       # 拒绝 nogroup 组登录(可选)

# ----------------
# 安全限制
# ----------------
MaxAuthTries 3            # 最大认证失败次数,超过断开
MaxSessions 10            # 每个连接允许的并发会话数(如多路复用)
LoginGraceTime 60         # 登录超时时间(秒),超过则断开
ClientAliveInterval 60    # 服务端每隔多少秒发送一次心跳包(检测客户端是否存活)
ClientAliveCountMax 3     # 若客户端连续 3 次无响应,则断开(这里就是 3*60=3分钟无响应断开)


# ----------------
# 性能优化
# ----------------
UseDNS no             # 登录时是否做反向 DNS 解析,建议 no,加快登录速度
X11Forwarding no      # 是否允许X11转发;服务器一般禁用,桌面用途可设为yes

# ----------------
# SFTP 服务
# ----------------
Subsystem sftp /usr/lib/openssh/sftp-server  # 定义 SFTP 子系统路径,不要随便改

# --- 横幅/合规 ---
Banner /etc/issue.net      # 登录前提示(安全/合规告知);如无需求可注释

# 如果你的发行版仍使用外部sftp-server,请改为(路径因发行版不同):
# Subsystem sftp /usr/lib/openssh/sftp-server
# Subsystem sftp /usr/libexec/openssh/sftp-server   # RHEL系可能是这个路径

ssh命令

命令格式:ssh【选项】【用户名】@【地址】
-1:强制使用ssh协议版本1
-2:强制使用ssh协议版本2
-4:强制使用IPv4地址
-6:强制使用IPv6地址
-A:开启认证代理连接转发功能
-a:关闭认证代理连接转发功能
-b:使用本机指定地址作为对应连接的源ip地址
-C:请求压缩所有数据
-F:指定ssh指令的配置文件
-f:后台执行ssh指令
-g:允许远程主机连接主机的转发端口
-i:指定身份文件
-l:指定连接远程服务器登录用户名
-N:不执行远程指令
-o:指定配置选项
-p:指定远程服务器上的端口
-q:静默模式
-X:开启X11转发功能
-x:关闭X11转发功能
-y:开启信任X11转发功能
实例例子:
1.远程登录192.168.31.101的root用户,端口为22

ssh root@192.168.31.101

2.远程登录192.168.31.101的test用户,端口为88

ssh -p 88 test@192.168.31.101

3.使用test.pem密钥远程登录192.168.31.101的test用户,端口为88

ssh -i test.pem -p 88 test@192.168.31.101

scp命令

命令格式:
远程传送:scp 【选项】【要传送的文件】【用户名】@【地址:目的路径】
远程拉取:scp 【选项】【用户名】@【地址:拉取文件路径】【本地存放路径】
-1:强制scp命令使用协议ssh1
-2:强制scp命令使用协议ssh2
-4:强制scp命令只使用IPv4寻址
-6:强制scp命令只使用IPv6寻址
-B:使用批处理模式(传输过程中不询问传输口令或短语)
-C:允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
-p:留原文件的修改时间,访问时间和访问权限
-q:不显示传输进度条
-r:递归复制整个目录
-v:详细方式显示输出scp和ssh(1)会显示出整个过程的调试信息
-c:cipher 以cipher将数据传输进行加密,这个选项将直接传递给ssh
-F:ssh_config 指定一个替代的ssh配置文件,此参数直接传递给ssh
-i:identity_file 从指定文件中读取传输时使用的密钥文件
-l:limit 限定用户所能使用的带宽,以Kbit/s为单位
-o:ssh_option 如果习惯于使用ssh_config(5)中的参数传递方式
-P:port 注意是大写的P, port是指定数据传输用到的端口号
-S:program 指定加密传输时所使用的程序。此程序必须理解ssh(1)的
实例例子:
1.登录192.168.31.101的root账号传送test.txt文件到192.168.31.101的/test目录

scp test.txt root@192.168.31.101:/test

2.使用test.pem密钥登录192.168.31.101的root账号传送test.txt文件到192.168.31.101的/test目录

scp -i test.pem test.txt root@192.168.31.101:/test

3.使用test.pem密钥登录192.168.31.101的88端口使用root账号递归传送/test目录到192.168.31.101的/data目录下

scp -P 88 -i test.pem -r /test root@192.168.31.101:/data

4.使用test.pem密钥登录192.168.31.101的88端口使用ubuntu账号递归传送/test目录到192.168.31.101的ubuntu账号home目录下

scp -P 88 -i test.pem -r /test ubuntu@192.168.31.101:~

也就是将/test目录传送到/home/ubuntu目录下
注意:~符号表示登录的账号的home目录
5.使用test.pem密钥登录192.168.31.101的88端口使用ubuntu账号拉取192.168.31.101的/test目录到本地的/data目录下

scp -P 88 -i test.pem -r ubuntu@192.168.31.101:/test /data

配置SSH免密登录

比如:有两台服务器192.168.31.101和192.168.31.102,想要可以从192.168.31.101免密登录192.168.31.102
ssh-keygen命令格式:ssh-keygen【选项】
-t:指定密钥类型,默认是 rsa
-C:设置注释文字信息
-f:设置密钥文件存储文件名字
1.创建密钥和密钥文件(一直空格使用默认就好)

ssh-keygen -t rsa -P ''

2.把本地生成的.pub文件发送到需要免密登录的服务器,然后将公钥追加到用户的home目录下的.ssh目录下的authorized_keys文件中
比如:root用户就是/root/.ssh目录下,ubuntu用户就是/home/ubuntu/.ssh目录下
可以使用ssh-copy-id命令
免密登录流程:

ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa root@192.168.31.102