Docker 火了!外部网络可直接访问映射到 127.0.0.1 的服务。。。
程序员的成长之路
共 2627字,需浏览 6分钟
·
2022-07-17 19:19
阅读本文大概需要 2.8 分钟。
来自:云原生实验室
原因其实很简单,Docker 添加了这样一条 Iptables 规则:
→ iptables -nvL DOCKER
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 tcp dpt:80
# 概念验证
在 A 机器上运行一个 PostgreSQL 容器,并将端口映射到 127.0.0.1。
# IP: 192.168.0.100
🐳 → docker run -e POSTGRES_PASSWORD=password -p 127.0.0.1:5432:5432 postgres
同一个局域网中的 B 机器添加路由表,将所有访问 172.16.0.0/12 的流量指向 A 机器。
# IP: 192.168.0.200
🐳 → ip route add 172.16.0.0/12 via 192.168.0.100
在 B 机器中扫描 A 机器的端口。
🐳 → nmap -p5432 -Pn --open 172.16.0.0/12
Starting Nmap 7.92 ( https://nmap.org ) at 2021-11-05 15:00 CDT
Nmap scan report for 172.17.0.2
Host is up (0.00047s latency).
PORT STATE SERVICE
5432/tcp open postgresql
在 B 机器中直接连接 PostgreSQL。
🐳 → psql -h 172.17.0.2 -U postgres
Password for user postgres:
# 解决方案
首先要严格限制允许访问容器端口的源地址和网络接口,例如 docker run -p 127.0.0.1:5432:5432 的原 iptables 规则如下:
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 tcp dpt:5432
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- lo docker0 127.0.0.1/8 172.17.0.2 tcp dpt:5432
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- eth0 docker0 192.168.0.0/24 172.17.0.2 tcp dpt:5432
最后要修改默认行为,如果使用 -p 参数时没有指定任何 IP 地址,就默认映射到 127.0.0.1。
# 引用链接
推荐阅读:
互联网初中高级大厂面试题(9个G) 内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper......等技术栈!
⬇戳阅读原文领取! 朕已阅
评论