如何让Debian服务器的MongoDB容器仅通过vSwitch被Windows服务器访问
方法一:默认Docker Bridge + iptables访问限制(最简方案)
无需修改Docker网络模式,通过绑定容器到内网IP+iptables规则实现仅内网访问:
启动MongoDB容器时仅绑定Debian服务器的内网IP
假设Debian服务器的内网IP为192.168.100.2,替换为你实际的内网IP:docker run -d --name mongodb \ -p 192.168.100.2:27017:27017 \ -v mongodb-data:/data/db \ mongo:latest此命令会让MongoDB仅监听Debian的内网IP,而非默认的
0.0.0.0(公网+内网都监听)。添加iptables规则限制仅Windows服务器IP访问
执行以下命令,拒绝所有非192.168.100.1的IP访问27017端口:iptables -A INPUT -p tcp --dport 27017 -s ! 192.168.100.1 -j DROP持久化iptables规则(防止重启失效)
安装iptables持久化工具并保存规则:apt update && apt install -y iptables-persistent iptables-save > /etc/iptables/rules.v4
方法二:自定义Docker Bridge网络(隔离性更强)
创建专属内网服务的自定义Bridge网络,避免和默认Bridge的公网服务混同:
创建自定义内网Bridge网络
选择一个和vSwitch不冲突的网段(比如192.168.101.0/24):docker network create --subnet=192.168.101.0/24 --gateway=192.168.101.1 internal-bridge启动MongoDB容器到自定义网络
不映射端口到主机,通过Docker内部网络通信,再通过Debian做转发:docker run -d --name mongodb \ --network internal-bridge \ --ip 192.168.101.10 \ -v mongodb-data:/data/db \ mongo:latest配置Debian的端口转发+iptables限制
开启IP转发:echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p添加转发规则,将Debian内网IP的27017端口转发到容器IP:
iptables -t nat -A PREROUTING -d 192.168.100.2 -p tcp --dport 27017 -j DNAT --to-destination 192.168.101.10:27017 iptables -A FORWARD -d 192.168.101.10 -p tcp --dport 27017 -s 192.168.100.1 -j ACCEPT iptables -A FORWARD -d 192.168.101.10 -p tcp --dport 27017 -j DROP执行
iptables-save > /etc/iptables/rules.v4持久化规则。
方法三:修复IPvlan网络配置(原生内网直连)
如果坚持使用IPvlan,检查以下配置步骤是否正确:
确定内网物理网卡名称
执行ip addr查看,比如内网网卡为ens3(替换为你实际的网卡名)。创建IPvlan网络
确保子网和vSwitch的192.168.100.0/24一致:docker network create -d ipvlan \ --subnet=192.168.100.0/24 \ --gateway=192.168.100.1 \ -o parent=ens3 \ ipvlan-internal启动MongoDB容器到IPvlan网络
分配一个vSwitch网段内的未使用IP(比如192.168.100.3):docker run -d --name mongodb \ --network ipvlan-internal \ --ip 192.168.100.3 \ -v mongodb-data:/data/db \ mongo:latest验证连通性
在Windows服务器上执行Test-NetConnection 192.168.100.3 -Port 27017测试连接。
额外安全建议
- 修改MongoDB默认端口,避免被扫描:将27017改为自定义端口(比如27018),同步修改上述命令中的端口号。
- 启用MongoDB身份验证:启动容器时添加
--auth参数,创建管理员账号,防止未授权访问。
内容的提问来源于stack exchange,提问作者RuleSan

