无法将 iptables 防火墙规则正确添加到 Docker 容器

无法将 iptables 防火墙规则正确添加到 Docker 容器

我想为 Docker 容器创建一个防火墙,仅允许某些 IP 并拒绝其他 IP。

默认设置是这样的:

$ sudo iptables --list
Chain DOCKER-USER (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

正如 Docker 文档中所述,这允许所有传入 IP。所以我正在修改这个。我运行了以下命令:

sudo iptables -D DOCKER-USER -j RETURN
sudo iptables -A DOCKER-USER -s xx.xx.xx.xx,yy.yy.yy.yy -j ACCEPT
sudo iptables -A DOCKER-USER -j DROP

这应该有效,我的预期结果是,如果我尝试从zz.zz.zz.zz IP访问服务器,它将被拒绝,但从xx.xx.xx.xx,它将通过。

但现在的结果是,无论我是从xx.xx.xx.xx(或yy.yy.yy.yy)还是zz.zz.zz.zz访问,页面都告诉我“连接失败”。所以显然它正在被放弃。

我不知道发生了什么,这个问题的原因是什么。感谢您的帮助。

答案1

所以,基本上问题是因为我跳过传递-i(--in-interface)选项来指定输入网络接口名称。

为什么我跳过了?嗯,我想是因为:

  • docker官方文档提到了-i带有模糊值的选项ext_if。作为此错误的第一个原因,ext_if经过一些谷歌搜索等后,我不(无法)理解这意味着什么。
  • sudo iptables --list不显示任何有关-i(或 -o)指定值的信息。所以我认为这个选项无论如何都不那么重要并且完全可以忽略不计。 (您可以使用 -v 选项列出选项,例如sudo iptables --list DOCKER-USER -v

感谢@AB 的评论,我再次看了一下同一个文档,并尝试了从零到最后的所有内容,并找到了解决方案。

因此,最后我运行并解决问题的命令集如下。

$ docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nameOfContainer # check the docker container's local ip e.g. 172.17.0.3

# assumes the docker container ip is 172.17.0.3, 
# the "internal" docker container port (e.g. "443" for "0.0.0.0:8122->443/tcp") you want to filter is 443, 
# the network interface (you can check with e.g. `ip addr`) is wlp2s0.

sudo iptables -I DOCKER-USER -i wlp2s0 -p tcp -m tcp --dport 443 -d 172.17.0.3 -j DROP
sudo iptables -I DOCKER-USER -i wlp2s0 -p tcp -m tcp --dport 443 -d 172.17.0.3 -s xx.xx.xx.xx -j ACCEPT
sudo iptables -I DOCKER-USER -i wlp2s0 -p tcp -m tcp --dport 443 -d 172.17.0.3 -s yy.yy.yy.0/24 -j ACCEPT

所以列表结果是这样的:

$ sudo iptables --list DOCKER-USER -v
[sudo] password for user: 
Chain DOCKER-USER (1 references)
 pkts bytes target     prot opt in     out     source               destination
   10   704 ACCEPT     tcp  --  wlp2s0 any     yy.yy.yy.0.static.xtom.com/24  172.17.0.3           tcp dpt:https
   20  1900 ACCEPT     tcp  --  wlp2s0 any     xx-xx-xx-xx.oo.oo.vectant.ne.jp  172.17.0.3           tcp dpt:https
   30  1760 DROP       tcp  --  wlp2s0 any     anywhere             172.17.0.3           tcp dpt:https
 145K   60M RETURN     all  --  any    any     anywhere             anywhere

答案2

在确定默认策略时,编辑规则集并将“RETURN”替换为“FORWARD”。

参考:https://www.linuxtopia.org/Linux_Firewall_iptables/x4604.html

相关内容