我有一个问题,我有以下 iptables 配置:
[root@nd01 ~]# iptables -L INPUT --line-numbers -n
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
2 ACCEPT all -- my_local_ip/32 0.0.0.0/0
3 INPUT_direct all -- 0.0.0.0/0 0.0.0.0/0
4 INPUT_ZONES_SOURCE all -- 0.0.0.0/0 0.0.0.0/0
5 INPUT_ZONES all -- 0.0.0.0/0 0.0.0.0/0
6 DROP all -- 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
7 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
但是,如果我从一个随机的机器 telnet 到这台机器,比如说从一个 DNS 服务器到这台服务器,我仍然可以通过。
[root@ns1 ~]# telnet server.com 3306
Trying server.com...
Connected to server.com.
Escape character is '^]'.
X
5.5.5-10.2.8-MariaDB =wbeV^Th???3`kw6F=@geHtmysql_native_password
^C
Connection closed by foreign host.
[root@ns1 ~]#
端口 3306 使用“-p 3306:3306”标志从 docker 容器绑定到主机。
这是为什么?我感觉所有通过 dockers 的 sh 脚本安装了 docker 的服务器都是开放的,因为我最近才发现这个安装完全破坏了防火墙。
答案1
您之所以能够通过,是因为您使用 专门将该端口暴露给互联网docker run -p
。
Docker 创建必要的 iptables 规则(包括不是在 INPUT 链中,因此查看那里是没有意义的)来使该流量到达您的容器。
您一定不能暴露您不想从主机外部访问的端口。
要创建一个包含多个容器并可以私下互相通信的设置,请使用 docker-compose。