解决使用容器部署NFS服务器无法限制客户端IP问题

部署Openpai后,我使用了nfs-server-alpine镜像为深度学习环境搭建数据存储服务。不使用Openpai的storage-manager的原因是,当需要升级Openpai时,storage-manager也会一并关闭升级,这就导致所有运行中的服务由于IO错误而被迫中断。另一方面,考虑到数据存储服务与Openpai耦合性也没那么高,完全可以自己部署。

但是这样部署存在的问题是,nfs-server-alpine直接将共享目录暴露于IP:/下。那么,只要黑客使用nfs挂载命令扫描到你的IP,那么你的所有数据均暴露无疑。

刚开始的时候直接使用nfs-server-alpine介绍里面的方法限制客户端IP,但是发现,除了使用'*'以外,使用其他配置,客户端都无法挂载。

思考:在保证nfs服务器没问题的情况下,客户端IP又在共享列表中,但是却无法挂载。那么可能的原因是,是否客户端到服务器的链路中存在NAT转换,导致实际到达服务器的IP已经不是客户端的IP了。

启发:我的所有节点都在同一个网段中,本身不存在NAT。那另一个存在NAT的地方也只有docker了。

问题:客户端到服务器的链路是正确的,但是服务器接收到客户端的请求后将请求提交给容器时使用NAT转换。

解决方案:nfs容器使用主机网络(host network)可去除NAT转换。

最后docker-compose.yml配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: "2.1"
services:
# https://hub.docker.com/r/itsthenetwork/nfs-server-alpine
nfs:
image: itsthenetwork/nfs-server-alpine:12
container_name: nfs
restart: unless-stopped
privileged: true
environment:
- SHARED_DIRECTORY=/data
- PERMITTED=192.168.1.0\/255.255.255.0
volumes:
- /local/data:/data
network_mode: host
0%