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 username:
ssh -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 yes
或 PermitRootLogin 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 之间复制文件和目录。
scp
是 secure copy
的缩写, scp
是基于 ssh 登陆进行的远程安全拷贝命令
语法:
scp [选项] source target
其中,source
和 target
的形式是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