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文件里。下次再连,就不会再问了。

小提示: 我第一次看到这个提示时,还以为是出错了。其实这是正常流程,放心输入yes就好。

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,因为集群里频繁操作,每次还要输密码就失去意义了。

注意: 如果你在生成时设置了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 ~/.ssh
chmod 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,那才是真正的重头戏。