我想为 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