DockerTLS加密/不加密传输
前言:
在Docker容器的网络通信中,安全性是至关重要的。DockerTLS作为一种加密传输协议,通过为Docker守护进程与客户端之间的通信提供加密层,有效防止数据在传输过程中被窃取或篡改。然而,在某些特定场景下,如内网环境或性能优先的应用中,不加密传输也有其应用场景。本文将深入探讨DockerTLS加密与不加密传输的利弊,帮助读者根据实际需求做出明智选择。
实验内容:
1、前期准备:
准备两台Linux机器:一台为服务端rocky,ip:10.1.1.8
一台为客户端centos,IP:10.1.1.9(注意:可以使用其他)
两台都安装docker,验证命令:docker –version
服务端关闭防火墙(省的麻烦):systemctl stop firewalld
2、添加加速器
vim /etc/docker/daemon.json
文件内容:
{
"registry-mirrors": [
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"
]
再执行以下命令:
systemctl daemon-reload 更新源
systemctl restart docker
修改默认存储位置
使用命令查看docker镜像及容器的存储路径
docker info | grep Docker
但是该路径默认使用的是系统盘的存储,如果挂载了数据盘,需要把docker的默认存储路径修改至数据盘的挂载目录,则需要修改docker的相关配置。
3、修改 Docker 守护进程配置文件
1. 编辑 /etc/docker/daemon.json
添加hosts参数以启用 TCP 监听,同时保留本地 UNIX 套接字:
tcp://0.0.0.0:2375 :表示监听所有 IP 的 2375 端口(非加密,仅限内网使用)。
2. 处理 systemd 冲突
若系统使用systemd(如 Rocky Linux/CentOS),需创建覆盖文件:
mkdir -p /etc/systemd/system/docker.service.d
vim /etc/systemd/system/docker.service.d/override.conf
文件内容:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd
重启服务:
systemctl daemon-reload && systemctl restart docker
客户端验证
docker -H tcp://10.0.0.20:2375 info
#info 就是在对方docker 执行的指令,此处ip为linux本机ip
4、启用 TLS 加密(公网必备)
生成 TLS 证书
在/etc/docker目录下创建一个certs目录并进入次目录:
mkdir -p /etc/docker/certs && cd /etc/docker/certs
生成CA根证书
# 生成加密的 CA 私钥(4096位,AES-256加密)
openssl genrsa -aes256 -out ca-key.pem 4096
#注意需要输入至少4个字符,不然报错
# 生成 CA 根证书(有效期10年)
openssl req -new -x509 -days 3650 -key ca-key.pem -sha256 -out ca.pem
# 填写信息示例:
生成服务端证书
# 生成服务端私钥(不加密,便于自动加载)
openssl genrsa -out server-key.pem 4096
# 创建证书签名请求(CSR)
openssl req -subj "/CN=<服务器IP或域名>" -sha256 -new -key server-key.pem -out server.csr
例如:
openssl req -subj "/CN=IP:10.1.1.128" -sha256 -new -key server-key.pem -out server.csr
# 设置扩展属性(仅用于服务端认证)
echo extendedKeyUsage = serverAuth > extfile.cnf
例如:
echo subjectAltName=10.1.1.128 > extfile.cnf
上面只是一个例子,文件内容需要这么多
# 签发服务端证书
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem
\
-CAcreateserial -out server-cert.pem -extfile extfile.cnf
使用ai发现命令格式有问题:
修改后命令:
openssl x509 -req -days 365 \
-sha256 \
-in server.csr \
-CA ca.pem \
-CAkey ca-key.pem \
-CAcreateserial \
-out server-cert.pem \
-extfile extfile.cnf \
-extensions server_ext
验证生成的证书:
openssl x509 -in server-cert.pem -noout -text | grep -A 1 "Subject Alternative Name"
生成客户端证书
# 生成客户端私钥
openssl genrsa -out client-key.pem 4096
# 创建客户端 CSR(证书签名请求)
openssl req -subj "/CN=<客户端标识>" -sha256 -new -key client-key.pem -out client.csr
例如:
openssl req -subj "/CN=client" -new -key client-key.pem -out client.csr
#创建客户端扩展文件
echo -e "[ext]\nextendedKeyUsage = clientAuth" > extfile-client.cnf
签发客户端证书
openssl x509 -req -days 365 -sha256 \
-in client.csr \
-CA ca.pem \
-CAkey ca-key.pem \
-CAcreateserial \
-out client-cert.pem \
-extfile extfile-client.cnf \
-extensions ext # 必须与 extfile-client.cnf 中的节名一致
设置证书的权限
chmod 0400 ca-key.pem server-key.pem client-key.pem
chmod 0444 ca.pem server-cert.pem client-cert.pem
注:默认也是上面的权限
5、docker服务端配置 TLS 监听
1.修改 daemon.json :
{
"tlsverify": true,
"tlscacert": "/etc/docker/certs/ca.pem",
"tlscert": "/etc/docker/certs/server-cert.pem",
"tlskey": "/etc/docker/certs/server-key.pem",
"hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"]
}
配置 Systemd 覆盖
设置证书权限
sudo chmod 600 /etc/docker/certs/*.pem
sudo chown root:docker /etc/docker/certs/*.pem
重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker
验证端口监听
netstat -tulnp | grep 2376
防火墙放行(若启用)
sudo firewall-cmd --permanent --add-port=2376/tcp
sudo firewall-cmd --reload
6、服务重启与验证
重启 Docker 服务
systemctl restart docker
journalctl -u docker.service -f # 检查日志
远程客户端测试连接
传输证书到客户端
将 ca.pem 、client-cert.pem 、client-key.pem 复制到客户端 ~/.docker/ 目录
测试连接TLS 加密连接
例如:
docker -H tcp://10.0.0.20:2376 --tlsverify ps
修改文件名
mv ~/.docker/client-cert.pem ~/.docker/cert.pem
mv ~/.docker/client-key.pem ~/.docker/key.pem
设置严格的文件权限
权限要求:
chmod 600 ~/.docker/key.pem # 私钥仅用户可读写
chmod 644 ~/.docker/ca.pem ~/.docker/cert.pem
再次使用命令
docker -H tcp://10.0.0.20:2376 --tlsverify ps
docker -H tcp://10.0.0.20:2376 --tlsverify run hello-world
docker -H tcp://10.0.0.20:2376 --tlsverify run -d -p 80:80 nignx
需要在服务端的/etc/docker/daemon.json文件加一个源:
"https://hub-mirror.c.163.com"
此次实验成功!