docker网络中iptables的一些设置
- docker通过filter表的FORWARD链进行子网隔离,通过自定义链DOCKER-ISOLATION-STAGE-1和DOCKER-ISOLATION-STAGE-2控制;
- docker的filter表中FORWARD链有自定义链DOCKER-USER,用于用户自定义一些规则,这条链放在了FORWARD链的最开始处;
- docker子网间通信默认会进行NAT转换,动作方式为MASQUERADE,因此如果在子网间通信时不想进行NAT转换,可在nat表的POSTROUTING中添加一些规则;
操作步骤
1. 找出docker两个子网的桥接网卡名,假设为:
- br-29f67fd4ba13: 172.24.2.1 172.24.2.0/24
- br-e300b06d776e: 172.16.2.1 172.16.2.0/24
2. 在filter的自定义链DOCKER-USER中添加如下规则,可实现两个子网通信
# 转发从网卡br-29f67fd4ba13进入本机,并从网卡br-e300b06d776e出去的数据包
iptables -I DOCKER-USER -i br-29f67fd4ba13 -o br-e300b06d776e -j ACCEPT
# 转发从网卡br-e300b06d776e进入本机,并从网卡br-29f67fd4ba13出去的数据包
iptables -I DOCKER-USER -i br-e300b06d776e -o br-29f67fd4ba13 -j ACCEPT
3. 子网间通信禁止NAT转换,在nat表的POSTROUTING链中添加如下规则 => 注: 此规则必须在原来docker创建的与此子网相关的MASQUERADE之前
# 源IP为子网172.16.2.0/24,出口为br-29f67fd4ba13的数据包不做处理
iptables -t nat -I POSTROUTING -o br-29f67fd4ba13 -s 172.16.2.0/24 -j RETURN
# 源IP为子网172.16.2.0/24,出口为br-29f67fd4ba13的数据包不做处理
iptables -t nat -I POSTROUTING -o br-e300b06d776e -s 172.24.2.0/24 -j RETURN