问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

注意事项

  1. 确保规则顺序正确,ACCEPT规则必须在DROP规则之前
  2. 添加规则时要考虑到容器间的通信需求
  3. 如果使用自定义Docker网络,需要相应调整网桥接口名称
  4. 建议在生产环境部署前充分测试规则的有效性
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号