某项目组采用容器化部署架构,通过docker-compose
对服务进行编排管理。为确保核心服务安全性,需对以下三个暴露的宿主机端口实施IP白名单访问控制:
服务名称 | 宿主机IP | 宿主机端口 | 容器内部端口 |
---|---|---|---|
apollo-configservice | 172.22.33.204 | 10002 | 8080 |
apollo-adminservice | 172.22.33.204 | 10003 | 8090 |
apollo-portal | 172.22.33.204 | 10004 | 8070 |
version: '3'
services:
apollo-configservice:
container_name: apollo-configservice
image: docker.cnb.cool/srebro/apollo:apollo-configservice-2.3.0
volumes:
- ./logs:/opt/logs
- /etc/localtime:/etc/localtime:ro
ports:
- "10002:8080"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://172.22.33.201:3306/ApolloConfigDB?characterEncoding=utf8
- SPRING_DATASOURCE_USERNAME=srebro
- SPRING_DATASOURCE_PASSWORD=srebro@2025
- EUREKA_INSTANCE_HOME_PAGE_URL=http://172.22.33.204:10002
- EUREKA_INSTANCE_IP_ADDRESS=172.22.33.204
- TZ=Asia/Shanghai
restart: always
networks:
- srebro
apollo-adminservice:
depends_on:
- apollo-configservice
container_name: apollo-adminservice
image: docker.cnb.cool/srebro/apollo:apollo-adminservice-2.3.0
volumes:
- ./logs:/opt/logs
- /etc/localtime:/etc/localtime:ro
ports:
- "10003:8090"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://172.22.33.201:3306/ApolloConfigDB?characterEncoding=utf8
- SPRING_DATASOURCE_USERNAME=srebro
- SPRING_DATASOURCE_PASSWORD=srebro@2025
- EUREKA_INSTANCE_HOME_PAGE_URL=http://172.22.33.204:10003
- EUREKA_INSTANCE_IP_ADDRESS=172.22.33.204
- TZ=Asia/Shanghai
restart: always
networks:
- srebro
apollo-portal:
depends_on:
- apollo-adminservice
container_name: apollo-portal
image: docker.cnb.cool/srebro/apollo:apollo-portal-2.3.0
volumes:
- ./logs:/opt/logs
- /etc/localtime:/etc/localtime:ro
ports:
- "10004:8070"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://172.22.33.201:3306/ApolloPortalDB?characterEncoding=utf8
- SPRING_DATASOURCE_USERNAME=srebro
- SPRING_DATASOURCE_PASSWORD=srebro@2025
- APOLLO_PORTAL_ENVS=baseline
- baseline_META=http://172.22.33.204:10002
- TZ=Asia/Shanghai
restart: always
networks:
- srebro
networks:
srebro:
external: true
iptables
规则的说明只允许17216.200.200 访问apollo 暴露在宿主机上的 10002,10003,10004 端口
--dport
的说明iptables -I 是插入到链的最前面,确保每个端口的 ACCEPT 规则在 DROP 规则之前。
# 先添加拒绝规则
iptables -I DOCKER-USER -p tcp --dport 8080 -j DROP
iptables -I DOCKER-USER -p tcp --dport 8090 -j DROP
iptables -I DOCKER-USER -p tcp --dport 8070 -j DROP
# 再添加允许规则(它们会被插入到链的顶部)
iptables -I DOCKER-USER -p tcp --dport 8080 -s 172.16.200.200 -j ACCEPT
iptables -I DOCKER-USER -p tcp --dport 8090 -s 172.16.200.200 -j ACCEPT
iptables -I DOCKER-USER -p tcp --dport 8070 -s 172.16.200.200 -j ACCEPT
multiport
模块合并规则(更高效)# 先添加拒绝规则
iptables -I DOCKER-USER -p tcp -m multiport --dports 8080,8090,8070 -j DROP
# 再添加允许规则(它会被插入到链的顶部)
iptables -I DOCKER-USER -p tcp -s 172.16.200.200 -m multiport --dports 8080,8090,8070 -j ACCEPT
执行以下命令检查规则顺序,确保 ACCEPT 规则在 DROP 规则之上:
[root@localhost apollo]# iptables -L DOCKER-USER -n --line-numbers
Chain DOCKER-USER (1 references)
num target prot opt source destination
1 ACCEPT tcp -- 172.16.200.200 0.0.0.0/0 tcp dpt:8080
2 ACCEPT tcp -- 172.16.200.200 0.0.0.0/0 tcp dpt:8090
3 ACCEPT tcp -- 172.16.200.200 0.0.0.0/0 tcp dpt:8070
4 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
5 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8090
6 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8070
7 RETURN all -- 0.0.0.0/0 0.0.0.0/0
[root@localhost apollo]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
上面的案例,阐述的是,docker 容器里的端口分别是不同的端口,如果我们容器内的端口都是8080,那应该怎么限制呢,典型的场景就是所有微服务的容器端口都是相同的,只是暴露的端口不同
服务名称 | 宿主机IP | 宿主机端口 | 容器内部端口 |
---|---|---|---|
apollo-configservice | 172.22.33.204 | 10002 | 8080 |
apollo-adminservice | 172.22.33.204 | 10003 | 8080 |
apollo-portal | 172.22.33.204 | 10004 | 8080 |
需要提前创建好docker 的网桥,指定容器的网络, ipv4_address: xx.xx.xx.xx
version: '3'
services:
apollo-configservice:
container_name: apollo-configservice
image: docker.cnb.cool/srebro/apollo:apollo-configservice-2.3.0
volumes:
- ./logs:/opt/logs
- /etc/localtime:/etc/localtime:ro
ports:
- "10002:8080"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://172.22.33.201:3306/ApolloConfigDB?characterEncoding=utf8
- SPRING_DATASOURCE_USERNAME=srebro
- SPRING_DATASOURCE_PASSWORD=srebro@2025
- EUREKA_INSTANCE_HOME_PAGE_URL=http://172.22.33.204:10002
- EUREKA_INSTANCE_IP_ADDRESS=172.22.33.204
- TZ=Asia/Shanghai
restart: always
networks:
srebro:
ipv4_address: 10.22.33.66
apollo-adminservice:
depends_on:
- apollo-configservice
container_name: apollo-adminservice
image: docker.cnb.cool/srebro/apollo:apollo-adminservice-2.3.0
volumes:
- ./logs:/opt/logs
- /etc/localtime:/etc/localtime:ro
ports:
- "10003:8080"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://172.22.33.201:3306/ApolloConfigDB?characterEncoding=utf8
- SPRING_DATASOURCE_USERNAME=srebro
- SPRING_DATASOURCE_PASSWORD=srebro@2025
- EUREKA_INSTANCE_HOME_PAGE_URL=http://172.22.33.204:10003
- EUREKA_INSTANCE_IP_ADDRESS=172.22.33.204
- TZ=Asia/Shanghai
restart: always
networks:
srebro:
ipv4_address: 10.22.33.67
apollo-portal:
depends_on:
- apollo-adminservice
container_name: apollo-portal
image: docker.cnb.cool/srebro/apollo:apollo-portal-2.3.0
volumes:
- ./logs:/opt/logs
- /etc/localtime:/etc/localtime:ro
ports:
- "10004:8080"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://172.22.33.201:3306/ApolloPortalDB?characterEncoding=utf8
- SPRING_DATASOURCE_USERNAME=srebro
- SPRING_DATASOURCE_PASSWORD=srebro@2025
- APOLLO_PORTAL_ENVS=baseline
- baseline_META=http://172.22.33.204:10002
- TZ=Asia/Shanghai
restart: always
networks:
srebro:
ipv4_address: 10.22.33.68
networks:
srebro:
external: true
172.16.200.200
可以访问apollo 的10002
和 10004
端口,也就是可以访问 apollo-configservice
和 apollo-portal
服务,其他都不允许访问。10.22.33.66
,10.22.33.67
,10.22.33.68
三个IP 是容器的IP地址, 8080
是容器的端口。三个IP 分别对应 apollo-configservice
, apollo-adminservice
和 apollo-portal
服务。#先添加拒绝规则
iptables -I DOCKER-USER -p tcp --dport 8080 -j DROP
# 再添加允许规则(它们会被插入到链的顶部)
iptables -I DOCKER-USER -p tcp -s 172.16.200.200 -d 10.22.33.66 --dport 8080 -j ACCEPT
iptables -I DOCKER-USER -p tcp -s 172.16.200.200 -d 10.22.33.68 --dport 8080 -j ACCEPT
执行以下命令检查规则顺序,确保 ACCEPT 规则在 DROP 规则之上:
[root@localhost apollo]# iptables -L DOCKER-USER -n --line-numbers
Chain DOCKER-USER (1 references)
num target prot opt source destination
1 ACCEPT tcp -- 172.16.200.200 10.22.33.68 tcp dpt:8080
2 ACCEPT tcp -- 172.16.200.200 10.22.33.66 tcp dpt:8080
3 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
4 RETURN all -- 0.0.0.0/0 0.0.0.0/0
[root@localhost apollo]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]