在容器化环境下,通信安全始终是重中之重。特别是当 Overlay 网络跨越多个节点时,隧道中传输的数据若不加密,无异于将秘密公开。那么,如何为 CentOS 上的 Overlay 网络中的容器间通信启用 TLS 加密?流程并不复杂,按以下步骤操作即可。
1. 生成 TLS 证书与密钥
加密的第一步是创建一套身份凭证——即证书和私钥。使用 OpenSSL 即可完成:先搭建 CA(证书颁发机构)作为信任根,再通过 CA 签发服务器与客户端的证书。
# 创建CA目录
mkdir -p /etc/docker/certs.d/tls-ca
# 生成CA私钥
openssl genrsa -out /etc/docker/certs.d/tls-ca/ca-key.pem 4096
# 生成CA证书
openssl req -new -x509 -days 365 -key /etc/docker/certs.d/tls-ca/ca-key.pem -out /etc/docker/certs.d/tls-ca/ca-cert.pem -subj "/CN=tls-ca"
# 生成服务器私钥
openssl genrsa -out /etc/docker/certs.d/tls-ca/server-key.pem 4096
# 生成服务器证书签名请求(CSR)
openssl req -new -key /etc/docker/certs.d/tls-ca/server-key.pem -out /etc/docker/certs.d/tls-ca/server-csr.pem -subj "/CN=server"
# 使用CA证书签名服务器CSR
openssl x509 -req -in /etc/docker/certs.d/tls-ca/server-csr.pem -CA /etc/docker/certs.d/tls-ca/ca-cert.pem -CAkey /etc/docker/certs.d/tls-ca/ca-key.pem -CAcreateserial -out /etc/docker/certs.d/tls-ca/server-cert.pem -days 365
# 生成客户端私钥
openssl genrsa -out /etc/docker/certs.d/tls-ca/client-key.pem 4096
# 生成客户端证书签名请求(CSR)
openssl req -new -key /etc/docker/certs.d/tls-ca/client-key.pem -out /etc/docker/certs.d/tls-ca/client-csr.pem -subj "/CN=client"
# 使用CA证书签名客户端CSR
openssl x509 -req -in /etc/docker/certs.d/tls-ca/client-csr.pem -CA /etc/docker/certs.d/tls-ca/ca-cert.pem -CAkey /etc/docker/certs.d/tls-ca/ca-key.pem -CAcreateserial -out /etc/docker/certs.d/tls-ca/client-cert.pem -days 365
证书生成后,所有 .pem 文件都存储在 /etc/docker/certs.d/tls-ca/ 目录下。请务必妥善保管 CA 证书和私钥,它们是整个信任链的基础。
2. 配置 Docker 守护进程
证书就绪后,需要告知 Docker 守护进程使用这些文件。编辑配置文件 /etc/docker/daemon.json,添加以下 TLS 相关配置:
{
"tls": true,
"tlscacert": "/etc/docker/certs.d/tls-ca/ca-cert.pem",
"tlscert": "/etc/docker/certs.d/tls-ca/server-cert.pem",
"tlskey": "/etc/docker/certs.d/tls-ca/server-key.pem",
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"]
}
配置完毕后,重启 Docker 服务使其生效:
sudo systemctl restart docker
至此,服务端配置完成——Docker 守护进程将仅接受经过 TLS 加密的连接。
3. 配置 Docker 客户端
服务端已就绪,客户端同样需要配置身份凭证。将生成的客户端证书和私钥复制到客户端机器的 ~/.docker/ 目录:
mkdir -p ~/.docker
cp /etc/docker/certs.d/tls-ca/client-cert.pem ~/.docker/
cp /etc/docker/certs.d/tls-ca/client-key.pem ~/.docker/
接着,创建或修改客户端配置文件 ~/.docker/config.json,指定连接时需进行验证:
{
"tls": true,
"tlsverify": true,
"tlscacert": "/etc/docker/certs.d/tls-ca/ca-cert.pem",
"tlscert": "/etc/docker/certs.d/tls-ca/client-cert.pem",
"tlskey": "/etc/docker/certs.d/tls-ca/client-key.pem"
}
这样,客户端每次发起连接时都会携带自身证书,并验证服务端身份。
4. 测试 TLS 连接
配置完成后,先别急着进行下一步,务必验证 TLS 连接是否正常。执行以下命令测试:
docker info
如果一切正常,你将看到 Docker 守护进程的详细信息,且连接已通过 TLS 加密。若出现错误,常见原因包括证书路径错误或权限不足,请仔细检查。
5. 创建安全 Overlay 网络
TLS 基础配置就绪后,接下来创建安全的 Overlay 网络。使用 docker network create 命令并添加 TLS 相关参数:
docker network create \
--driver overlay \
--opt encrypted=true \
--opt tlsverify=true \
--opt tlscacert=/etc/docker/certs.d/tls-ca/ca-cert.pem \
--opt tlscert=/etc/docker/certs.d/tls-ca/client-cert.pem \
--opt tlskey=/etc/docker/certs.d/tls-ca/client-key.pem \
my-secure-overlay-network
请注意,除了设置 encrypted=true 启用数据加密外,还增加了 TLS 校验选项。这意味着网络中的每个节点都必须持有有效的客户端证书才能接入。
6. 将容器接入加密 Overlay 网络
网络创建完成后,后续操作就很简单了:只需在启动容器时指定该网络即可。
docker run -d --network my-secure-overlay-network --name my-container my-image
容器一旦加入该网络,与其他同网络容器进行通信时,数据将自动经过 TLS 加密。整个过程对应用透明,安全性由底层网络基础设施保障。
经过以上一系列配置,CentOS 上的 Overlay 网络便获得了 TLS 加密的保护。无论是集群内部的服务调用,还是跨主机的容器通信,都无需再担忧数据被截获或篡改。安全防护,提前配置远比事后补救更为有效。
