Chapter 11 ssh & scp

11.1 简介

Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。

SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接。

任何网络服务都可以使用这个协议来加密,我们通常利用SSH来远程登录和执行命令。

SSH的软件架构是服务器-客户端(Server-Client)模式。OpenSSH是SSH的一种实现,客户端为ssh,服务端为sshd。

Linux一般会自带ssh。ssh -V 查看版本号。

11.2 密码登陆

  • ssh [选项] user@hostname

    -p port:指定端口号,默认为22

    -l usernamessh -l user hostname等同于ssh user@hostname

    -4, -6:指定使用IPv4或IPv6协议

11.3 密钥登陆

11.3.1 制作密钥对

  • ssh-keygen

    -t:指定加密算法,常用dsa和rsa(默认)

    -C:指定公钥最后的注释,格式为user@hostname,默认为当前用户和主机名

    -f:指定生成的私钥文件,默认保存在~/.ssh/

    -N:指定私钥的密码短语(passphrase)

11.3.2 将公钥上传到服务器

服务端安装sshd:apt install openssh-server

systemctl enable sshd

  • ssh-copy-id -i 公钥文件 user@hostname

    这条命令将公钥文件追加到到远程主机的~/.ssh/authorized_keys文件中


也可以自行编辑远程主机的~/.ssh/authorized_keys文件,注意不要设置过于开放的权限

chmod 600 authorized_keys
chmod 700 ~/.ssh

注意:authorized_keys文件有多个key时,之间要有换行符,不能写在同一行

  • 配置sshd:vim /etc/ssh/sshd_config

允许或禁止root用户直接登陆:

PermitRootLogin yesPermitRootLogin no

使用RSA算法进行安全验证:

RSAAuthentication yes

允许使用Publickey:

PubkeyAuthentication yes

当确定可以通过密钥登陆后,禁用密码登陆:

PasswordAuthentication no

重启sshd生效

systemctl restart sshd

11.4 服务器配置

配置文件:/etc/ssh/sshd_config

配置项大小写不敏感

  • Banner file

    指定ssh远程登录后展示的信息,默认不展示任何内容

  • PrintMotd yes|no

    用户登录后是否展示motd(Message od the day)信息(/etc/motd),含有系统维护、安全信息等

  • PrintLastLog yes|no

    显示上一次用户登录时间,默认yes

  • ClientAliveInterval 180

    允许客户端发呆的时间,单位为秒,超时后ssh连接将关闭

  • Compression yes|no

    是否压缩数据

  • MaxStartups 10:50:20

    最大并发连接数,0表示无限制,也可以使用10:50:20,表示连接数超过10以后,后面的连接有50%的概率被拒绝,连接数达到20则完全禁止连接

  • PasswordAuthentication yes|no

    是否允许密码登录

  • PubKeyAuthentication yes

    是否允许公钥登录,默认值为yes

  • RSAAuthentication yes

    是否使用 RSA 算法认证,默认值为yes

  • PermitRootLogin yes|no|prohibit-password

    是否允许Root用户直接登录,prohibit-password表示不能用密码登录但是能用密钥登录

  • StrictModes yes

    检查ssh配置文件、密钥文件及其目录的权限,默认yes其他人的写权限必须关闭

  • Port 22

    用于自定义ssh端口,默认22,可以有多行,监听多个端口

  • UserPrivilegeSeparation yes

    用户认证通过后,使用另一个子线程处理用户权限相关的操作,有利于提高安全性。默认值为yes

  • X11Forwarding no

    是否转发X window,默认no

测试配置文件:

sshd -t

重启sshd使配置文件生效:

systemctl restart sshd

11.5 ssh跳板

有时候我们没法直接登录目标主机。例如我要登录一台仅IPv6的服务器,而我的网络只有IPv4,可以利用一台既支持IPv4又支持IPv6的服务器做跳板。

ssh -J [跳板机] user@目标主机

要注意的是,命令行中的参数都是作用于目标主机的。那么,怎么指定跳板机的配置呢? 可以通过配置文件:

vim ~/.ssh/config

例如:

Host jumphost
    HostName    123.45.67.89
    IdentityFile    ~/.ssh/jumphost
    user        root

这样,使用ssh -J jumphost user@目标主机时,就会使用密钥~/.ssh/jumphost连接[email protected]作为跳板,然后连接user@目标主机

目标主机则无需写配置文件,例如如果要使用密钥,在命令里加上-i 密钥文件即可

11.6 ssh隧道

ssh隧道(tunnel) 即 端口转发(port forwarding)。任何网络服务都可以使用ssh协议加密,除了登录服务器,ssh还可以用来加密传输、绕过防火墙等

11.6.1 本地转发

ssh -L local_port:target_host:target_port tunnel_host

本地转发指定了一个本地端口,对这个本地端口的请求,会通过隧道主机转发到目标主机的目标端口

举例:加密访问邮件获取协议 POP3:

ssh -L 1100:mail.example.com:110 mail.example.com

这里mail.example.com即是隧道主机又是目标主机。隧道建立以后,POP3邮件客户端只需访问本机的1100端口,请求就会通过ssh加密后转发到mail.example.com的110端口

配置文件(~/.ssh/config)写法:

Host test.example.com
LocalForward client-IP:client-port server-IP:server-port

11.6.2 远程转发

远程转发与本地转发的方向正好相反,对远程主机的访问将通过本地主机转发。

ssh -R remote_port:target_host:target_port -N remote_host

ssh远程转发的一个实例是 内网穿透

ssh -R 8080:localhost:80 -N my.public.server

这样有人访问my.public.server:8080时,就访问到了本地主机的80端口上的服务

11.6.3 动态转发

动态转发指定一个本地端口,针对这个端口的通信,都经由隧道主机代理。

动态转发将本地端口绑定到 SSH 服务器。至于 SSH 服务器要去访问哪一个网站,完全是动态的,取决于原始通信,所以叫做动态转发。

ssh -D local_port tunnel_host -N

动态转发的一个用途是防火墙绕过。

ssh -D 1089 tunnel_host -N

这种转发使用了SOCKS5协议,开启动态转发之后在软件中配置代理为socks5://localhost:1089,那么这个软件现在就可以通过tunnel_host绕过防火墙访问网站

在curl中使用:curl -x socks5://localhost:1089 http://www.example.com

在proxychains中配置:参见proxychains章节

11.7 scp

scp 命令用于 Linux 之间复制文件和目录。

scpsecure copy 的缩写, scp 是基于 ssh 登陆进行的远程安全拷贝命令

语法:

scp [选项] source target

其中,sourcetarget 的形式是host:file,如果不写主机名称,则代表是本地主机

source可以有多个

举例:

  • 从本地复制到远程

    scp /home/jack/1.txt user@hostname:/home/ 复制 1.txt/home目录下

    scp /home/jack/1.txt user@hostname:/home/file1.txt 复制并修改文件名

    scp -r /data/test user@hostname:/data/ 将整个test目录复制到/data

    scp -r /data/test/* user@hostname:/data/test目录里的所有文件复制到/data

  • 从远程复制到本地

    scp user@hostname:/home/file1.txt /home/jack/

  • 两个远程系统之间复制

    scp user1@host1:/data/file.txt user2@host2:/data

选项:

  • -C:传输时压缩文件

    -P:指定ssh端口

    -i:指定密钥

    -r:递归复制目录

    -v:显示详细输出

    -l [数字]:限制速度,单位Kbit/s

    -p:保留原文件的mtime, atime 和 modes