当前位置: 首页 > news >正文

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"

此次实验成功!

相关文章:

  • GitLab CI/CD学习教程(第二章Runner)
  • vpc网络之间的关系
  • 游戏引擎 Unity - Unity 顶部菜单栏(文件、编辑、资源、游戏对象、组件、服务、窗口、帮助)
  • 区块链技术的应用场景和优势
  • 【汽车开发工具选型指南】Jama Connect® for Automotive解决方案解析
  • Powershell WSL Windows系统复制数据到ubuntu子系统系统
  • element 样式记录
  • Unity音频混合器如何暴露参数
  • vue/H5图片压缩/压缩后上传
  • Java集合框架深度剖析:从数据结构到实战应用
  • 【计算机网络】网络简介
  • AI 生成 PPT 网站介绍与优缺点分析
  • 天地图InfoWindow插入React自定义组件
  • OpenHarmony子系统开发 - 电源管理(一)
  • 可视化图解算法:链表相加( 两数相加)
  • LabVIEW软件长时间运行导致蓝屏问题排查与优化
  • SpringCache小记
  • CentOS 7 设置 Nginx 开机自启(使用 Systemd)
  • 【Hbase】列族版本问题
  • sqli-labs学习记录6
  • 百利天恒董事长向复旦捐赠三千万元,用于支持创新药物靶点发现等师资建设需要
  • 郑州通报“夜市摊贩收取香烟交给城管”:涉事人员停职调查
  • 普京提议重启俄乌直接谈判后,特朗普表态了
  • 新城市志|上海再攻坚,营商环境没有最好只有更好
  • 匈牙利外长称匈方已驱逐两名乌克兰外交官
  • 金地集团:今年前4个月实现销售额109.3亿元,同比下降52.44%