Docker内部网络下容器仅与主机SQL Server通信的配置问询
关于Docker内部网络与主机SQL Server通信的解决方案
问题1:internal=true时,能否仅允许容器与主机SQL Server双向通信?
可以实现,核心是通过自定义iptables规则突破internal=true网络的外部访问限制,仅开放主机1433端口的通信:
先获取自定义网络
testproject_haproxynet的子网CIDR:docker network inspect testproject_haproxynet | grep Subnet输出类似
"Subnet": "172.20.0.0/16"在主机上添加以下iptables规则(替换
<子网CIDR>和<主机IP>为实际值):# 允许容器访问主机SQL Server的1433端口 iptables -A DOCKER-USER -s <子网CIDR> -d <主机IP> -p tcp --dport 1433 -j ACCEPT # 允许主机向容器返回SQL通信的数据包 iptables -A DOCKER-USER -d <子网CIDR> -s <主机IP> -p tcp --sport 1433 -j ACCEPT(Linux环境)为了让规则在主机重启后保留,保存iptables配置:
iptables-save > /etc/iptables/rules.v4
问题2:非内部网络(internal=false)中,能否仅放行与主机1433端口的通信,阻断其他流量?
可以实现,通过iptables规则限制自定义网络的容器仅能访问主机1433端口和容器间通信,阻断其他外部流量:
建议在Compose中固定子网,避免每次重启网络变更CIDR:
修改Compose的networks部分:networks: default: name: testproject_default haproxynet: name: testproject_haproxynet driver: bridge internal: false ipam: config: - subnet: 172.20.0.0/16 # 自定义固定子网添加iptables规则(替换
<子网CIDR>和<主机IP>):# 允许同一网络内的容器互相通信 iptables -A DOCKER-USER -s <子网CIDR> -d <子网CIDR> -j ACCEPT # 允许容器访问主机1433端口 iptables -A DOCKER-USER -s <子网CIDR> -d <主机IP> -p tcp --dport 1433 -j ACCEPT # 允许主机回包 iptables -A DOCKER-USER -d <子网CIDR> -s <主机IP> -p tcp --sport 1433 -j ACCEPT # 阻断该网络容器的其他外部流量 iptables -A DOCKER-USER -s <子网CIDR> -j DROP保留Compose中
authapi服务的extra_hosts配置,确保容器能正确解析主机SQL Server的名称到IP:extra_hosts: - <SERVER_NAME>:<HOST_IP>
内容的提问来源于stack exchange,提问作者Stefano Cosenza
相关产品推荐
相关产品推荐

