Docker容器端口映射访问控制详解
创作时间:
作者:
@小白创作中心
Docker容器端口映射访问控制详解
引用
1
来源
1.
https://www.cnblogs.com/sonui/p/18582454
本文介绍如何通过iptables规则来限制特定IP或网段访问Docker容器端口,包括基本原理、具体配置方法、多端口配置、规则持久化和注意事项等。
在使用Docker容器时,我们经常需要将容器端口映射到宿主机上。最基本的端口映射可以通过"PORT:PORT"来设置,比如"6379:6379"就是将容器的6379端口映射到宿主机的6379端口上。然而,这种基本的端口映射存在一个主要问题:默认情况下,任何能访问到宿主机的客户端都可以访问这个端口。在生产环境中,我们通常需要限制只允许特定的IP地址或网段访问容器端口。
Docker网络工作原理
当我们映射容器端口时,Docker会在iptables中添加相关规则。数据包的流向如下:
flowchart TD
A[客户端] --eth0--> B[宿主机] --iptables NAT--> C[docker0 网桥] --转发--> D[容器]
为了限制访问,我们需要在DOCKER-USER链中添加规则来控制流量。DOCKER-USER链中的规则会在DOCKER链中的规则之前执行,具体文档可以查看Packet filtering and firewalls。
配置示例
首先创建一个测试用的Redis容器:
services:
redis:
image: redis:latest
restart: unless-stopped
ports:
- 6379:6379
volumes:
- /etc/localtime:/etc/localtime:ro
测试下可访问性:
机器1 (IP: 192.168.1.10):
机器2 (IP: 192.168.2.10):
添加访问控制规则
以下规则将只允许来自机器1网段访问6379端口:
# 允许已建立的连接
sudo iptables -I DOCKER-USER -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许指定网段访问指定端口
sudo iptables -I DOCKER-USER -i eth0 -p tcp -s 192.168.1.0/24 --dport 6379 -j ACCEPT
# 允许docker0网桥转发到指定端口的流量
sudo iptables -I DOCKER-USER -i docker0 -p tcp --dport 6379 -j ACCEPT
sudo iptables -I DOCKER-USER -o docker0 -p tcp --dport 6379 -j ACCEPT
# 拒绝其他所有访问该端口的请求
sudo iptables -A DOCKER-USER -p tcp --dport 6379 -j DROP
# 允许其他端口的流量(可选)
sudo iptables -A DOCKER-USER -j RETURN
多端口配置示例
如果需要限制多个端口,可以使用多端口匹配:
# 允许访问多个端口
sudo iptables -I DOCKER-USER -i eth0 -p tcp -s 192.168.1.0/24 -m multiport --dports 6379,8080,3306 -j ACCEPT
# 允许docker0网桥转发多个端口
sudo iptables -I DOCKER-USER -i docker0 -p tcp -m multiport --dports 6379,8080,3306 -j ACCEPT
sudo iptables -I DOCKER-USER -o docker0 -p tcp -m multiport --dports 6379,8080,3306 -j ACCEPT
# 拒绝其他所有访问这些端口的请求
sudo iptables -A DOCKER-USER -p tcp -m multiport --dports 6379,8080,3306 -j DROP
验证规则
检查规则是否正确配置:
# 查看规则列表
➜ sudo iptables -L DOCKER-USER -n -v --line-numbers
Chain DOCKER-USER (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT tcp -- * docker0 0.0.0.0/0 0.0.0.0/0 tcp dpt:6379
2 0 0 ACCEPT tcp -- docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:6379
3 28 1478 ACCEPT tcp -- eth0 * 192.168.1.0/24 0.0.0.0/0 tcp dpt:6379
4 9 540 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:6379
5 21 1107 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
机器1 (IP: 192.168.1.10):
机器2 (IP: 192.168.2.10):
持久化规则
为了重启后规则不会丢失,需要保存下设置好的iptables规则:
# Ubuntu/Debian系统
sudo netfilter-persistent save
# CentOS/RHEL系统
sudo service iptables save
清理规则
如果需要删除规则,可以使用以下命令:
# 清除DOCKER-USER链中的所有规则
sudo iptables -F DOCKER-USER
# 恢复默认规则(允许所有流量)
sudo iptables -A DOCKER-USER -j RETURN
注意事项
- 确保规则顺序正确,ACCEPT规则必须在DROP规则之前
- 添加规则时要考虑到容器间的通信需求
- 如果使用自定义Docker网络,需要相应调整网桥接口名称
- 建议在生产环境部署前充分测试规则的有效性
热门推荐
黄帝蚩尤涿鹿之战爆发的背景及原因介绍
如何衡量黄金投资的风险与回报?这种衡量方式有哪些注意事项?
F35战机的发动机,到底有多强呢
如何在紧急情况下快速有效沟通
“个转企”:涉税事项咋办理?
救赎与屠杀的变奏曲,一部撕裂人性底色的战争史诗
婴儿流口水氾滥成灾,收涎了为什么还是一直流口水?
海水淡化RO膜的工作原理,你了解多少?
悬疑舞台剧《清明上河图密码》:烧脑同时再现宋代美学
驻车制动踏板的正确使用方法是什么?如何检查驻车制动踏板的性能?
C语言如何产生真随机数
路由器的Wi-Fi性能是否限制了你的网速?这里有你想要的答案
女人☕是什麼意思?探討女性與咖啡文化的深層意義
如何初步筛选因子数据库
工信部发布《生成式人工智能全栈技术专利分析报告》:中国AI技术创新进入新阶段
運動吃素也能增肌?植物性蛋白這樣吃,健康又有效!
中国经济样本观察·企业样本篇|一棵草到万顷绿——蒙草以中国草种丰茂中国草原
16种糖类来源大盘点,看看它们的作用与区别
黄冰糖和白冰糖差别不止一点,炖冰糖雪梨别再乱买了
延胡索酸泰妙菌素与阿莫西林配伍的功效
狐臭的治疗与预防方法
幼儿园设计规范要求及8大注意事项详解
20年后才懂张国荣:他悲剧人生的关键,不是挚爱唐生也不是抑郁症
酷睿i9-14900K与锐龙7 7800X3D游戏性能概览
实用方法帮你摆脱秃顶困扰,拥有浓密秀发
AI Agent设计模式 | Planning(规划模式):实现任务自主分解
Golang队列基础及实现
孩子学舞蹈的最佳时机与年龄要求,建议收藏!
孩子学舞蹈的最佳时机与年龄要求,建议收藏!
第一次DIY组装台式机需要注意哪些事项