我的 Debian 服务器在端口 5000 上运行着一项服务(docker 注册表)。我想限制特定 IP 对该服务的访问,因此我创建了一个包含规则的文件(1.2.3.4 是我信任的 IP)
*filter
-A INPUT -p tcp --dport 5000 --source 1.2.3.4 -j ACCEPT
-A INPUT -p tcp --dport 5000 -j DROP
COMMIT
然后我使用命令将这些规则应用到 iptables
sudo iptables-restore < myfile
因此命令 sudo iptables -L 的结果为:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 1.2.3.4 anywhere tcp dpt:5000
DROP tcp -- anywhere anywhere tcp dpt:5000
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
然后我检查是否可以从互联网(从我的另一台服务器)访问端口 5000
nc -zv 5.6.7.8 5000
结果是[...5000(?)开放] 我的问题是为什么?这些规则很简单,为什么我可以访问端口 5000 的服务?即使我只保留一条规则(-A 输入-p tcp --dport 5000-j DROP),我仍然可以访问该端口。
编辑 1:@AB 您说得对。现在我也可以看到 docker 的规则了。
sudo iptables-save -c
# Generated by xtables-save v1.8.2 on Thu Feb 13 15:21:42 2020
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:DOCKER - [0:0]
[39755:1536013] -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
[40:2500] -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
[0:0] -A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 5000 -j MASQUERADE
[0:0] -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
[0:0] -A DOCKER -i docker0 -j RETURN
[33:1824] -A DOCKER ! -i docker0 -p tcp -m tcp --dport 5000 -j DNAT --to-destination 172.17.0.2:5000
COMMIT
# Completed on Thu Feb 13 15:21:42 2020
# Generated by xtables-save v1.8.2 on Thu Feb 13 15:21:42 2020
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:DOCKER-USER - [0:0]
[0:0] -A DOCKER-USER -p tcp -m tcp --dport 5000 -j DROP
COMMIT
# Completed on Thu Feb 13 15:21:42 2020
那么现在的问题是如何向 nat 表添加 DROP 规则?我根据 docker docs 添加了一条规则
sudo iptables -t nat -N DOCKER-USER
sudo iptables -t nat -I DOCKER-USER -p tcp -m tcp --dport 5000 -j RETURN
但没有效果。
编辑2:终于!我在这里找到了答案:https://unix.stackexchange.com/questions/462706/block-docker-port-and-access-it-to-few-ip-addresses
这解决了问题。
-I FORWARD 1 -d 172.17.0.2 -p tcp --dport 5000 -j DROP
答案1
您需要将规则添加到 Docker 链中。为此,请创建以下文件:
*filter
-I DOCKER -i [interface] -s 1.2.3.4 -p tcp --dport 5000 -j ACCEPT
-I DOCKER 3 -i [interface] -p tcp --dport 5000 -j DROP
COMMIT
这将拒绝进入 docker 注册表的任何数据包,除了 1.2.3.4 之外。如果您想修改规则和行为,请记住相应地更改度量。以下链接将为您提供更多信息: https://docs.docker.com/network/iptables/