4、SSH免密登录与网络配置:SSH原理、生成密钥对、配置免密登录、集群网络规划
好,咱们进入第四章节。说实话,这一章的内容,是搭建集群的「地基」。你想想看,如果每次在机器之间传文件、执行命令都要输密码,那集群管理基本就是个噩梦。我当年第一次搭三台机器的集群,光输密码就输到怀疑人生。后来才明白,SSH免密登录,是每个大数据工程师的必修课。
4.1 SSH原理:它到底在干什么?
SSH,全称Secure Shell,说白了就是一种加密的远程登录协议。它不像Telnet那样明文传输密码,而是用了一套加密机制来保证安全。
它的核心逻辑是这样的:
- 客户端发起连接请求
- 服务端把自己的公钥发给客户端
- 客户端用这个公钥加密一个随机数,发回服务端
- 服务端用私钥解密,验证身份
嗯,这里要注意,第一次连接时,你会看到一个提示:
The authenticity of host '192.168.1.10 (192.168.1.10)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)?
这是SSH在问:「你确定要连接这台机器吗?」输入yes后,它会把这台机器的公钥存到~/.ssh/known_hosts文件里。下次再连,就不会再问了。
4.2 生成密钥对:你的数字身份证
要实现免密登录,我们需要生成一对密钥:公钥和私钥。公钥可以公开,放在你要登录的机器上。私钥必须保密,留在你本机。
生成命令很简单:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
参数说明:
-t rsa:指定加密算法为RSA-b 4096:密钥长度4096位,越长越安全-C:注释,一般写邮箱,方便识别
执行后,系统会问你:
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
第一个问题,直接回车,用默认路径。第二个问题,如果你想要「完全免密」,就留空直接回车。我个人习惯是不设passphrase,因为集群里频繁操作,每次还要输密码就失去意义了。
生成成功后,你会看到两个文件:
~/.ssh/id_rsa:私钥,绝对不能泄露~/.ssh/id_rsa.pub:公钥,可以公开
4.3 配置免密登录:三步搞定
配置免密登录,说白了就是把你的公钥放到目标机器的~/.ssh/authorized_keys文件里。我一般用ssh-copy-id这个工具,一步到位。
假设我要从机器A免密登录到机器B:
# 在机器A上执行
ssh-copy-id user@192.168.1.20
它会提示你输入一次密码。输入正确后,公钥就自动追加到机器B的authorized_keys文件里了。之后你再SSH,就不用密码了。
如果你没有ssh-copy-id,也可以手动操作:
# 在机器A上
cat ~/.ssh/id_rsa.pub
# 复制输出的内容,然后登录到机器B
ssh user@192.168.1.20
echo "粘贴的内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
这里有个坑,我曾经踩过:authorized_keys文件的权限必须是600,.ssh目录的权限必须是700。否则SSH会认为不安全,拒绝使用这个文件。
.ssh目录的权限是777。改成700后,问题解决。记住:chmod 700 ~/.sshchmod 600 ~/.ssh/authorized_keys
4.4 集群网络规划:别让IP打架
集群搭建前,网络规划是必须的。你想想看,如果每台机器的IP都是动态分配的,那配置文件里写什么?写主机名?那也得保证主机名能解析到正确的IP。
我一般建议用静态IP,配合/etc/hosts文件做主机名解析。这样最稳定,也最直观。
假设我们要搭建一个3节点的集群,规划如下:
| 主机名 | IP地址 | 角色 |
|---|---|---|
| node1 | 192.168.1.10 | Master |
| node2 | 192.168.1.20 | Worker |
| node3 | 192.168.1.30 | Worker |
然后,在每台机器的/etc/hosts文件里,添加以下内容:
192.168.1.10 node1
192.168.1.20 node2
192.168.1.30 node3
这样做的好处是:以后在配置文件中,直接写主机名就行,不用记IP。而且如果IP变了,只需要改/etc/hosts一个文件。
/etc/hosts后,可以用ping node2测试一下,看能不能解析到正确的IP。能ping通,说明网络规划没问题。
4.5 验证免密登录:确认一切正常
配置完成后,一定要验证。从node1上执行:
ssh node2 "hostname"
如果返回了node2,说明免密登录配置成功。如果还是提示输密码,那就检查一下前面说的权限问题。
我习惯在每台机器之间都做双向免密。比如node1能免密登录node2和node3,node2也能免密登录node1和node3。这样以后在集群里执行分布式命令时,就不会被密码卡住。
嗯,这一章的内容就这些。说白了,SSH免密登录就是集群管理的「入场券」。搞定了它,后面的Hadoop、Spark安装才会顺畅。下一章,我们开始装JDK和Hadoop,那才是真正的重头戏。