Docker 远程安全访问

直接设置任意远程访问存在的问题

因为 docker 默认是 root 权限,允许所有人访问,直接把 2375 端口暴露在外网相当于直接把服务器的 root 权限拱手送人,因此我们需要构建一个加密的 TCP 链接,以 Https 的方式连接到远程的 docker 服务器

创建一个 ca 的文件夹

1
2
mkdir -p /usr/local/ca
cd /usr/local/ca

创建一个 key

1
openssl genrsa -aes256 -out ca-key.pem 4096

提示你需要输入密码和确认密码,请记住这个密码

填写一些基本的信息,国家啊,地区什么的

1
2
# 执行这一句需要输入之前设置的密码
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

我填写的内容如下

1
2
3
4
5
6
7
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Beijing
Locality Name (eg, city) []:Beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:wenzuo
Organizational Unit Name (eg, section) []:wenzuo
Common Name (e.g. server FQDN or YOUR name) []:wenzuo
Email Address []:zhanghao@wenzuo.net

生成 server-key.pem

1
openssl genrsa -out server-key.pem 4096

绑定 IP 或者域名

$HOST 这个值,填写你的服务器外网 IP 或者服务器外网域名

1
openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr

配置白名单

$HOST 就是你第六步设置的那个 $HOST, 注意如果你用的 IP, 则需要把 DNS 改为 IP

你如果希望只有指定的 IP 能够访问的话,请把 0.0.0.0 改为指定 IP,不过一般情况下,个人的网络是没有固定的公网 IP 的,所以建议设置成 0.0.0.0,但是需要证书才能访问

1
2
3
4
echo subjectAltName = DNS:$HOST,IP:0.0.0.0 >> extfile.cnf
echo subjectAltName = IP:$HOST,IP:0.0.0.0 >> extfile.cnf
# 下面是我的
echo subjectAltName = IP:1.1.1.10,IP:0.0.0.0 >> extfile.cnf

生成 ca-key

1
2
3
4
5
6
7
8
9
10
echo extendedKeyUsage = serverAuth >> 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

openssl genrsa -out key.pem 4096

openssl req -subj '/CN=client' -new -key key.pem -out client.csr

echo extendedKeyUsage = clientAuth >> extfile.cnf

生成 cert.pem

1
2
# 需要输入之前设置的密码
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out cert.pem -extfile extfile.cnf

修改权限

1
2
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem

把证书复制过去

1
2
cp server-*.pem  /etc/docker/
cp ca.pem /etc/docker/

修改 docker 的配置

1
vim /lib/systemd/system/docker.service

/usr/bin/dockerd后面添加--tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock

1
2
3
4
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# 替换为下面

ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock -H fd:// --containerd=/run/containerd/containerd.sock

重启 docker

1
2
systemctl daemon-reload
systemctl restart docker

下载连接所需的证书文件

把这几个文件下载到你的电脑上,新建一个文件夹供着

通过 IDEA 的 docker 插件进行连接

默认是 tcp 的,你要改成 https,端口你之前设置的什么端口就是什么端口, 然后选择你放证书的那个文件夹

连接到远程 docker

成功连接,连接不上的,查找如下原因

1、tcp 连接没换
2、端口不对
3、服务器防火墙没放端口
4、云服务器防火墙没放端口
5、证书没弄好