如何使用 iptables 阻止特定端口

如何使用 iptables 阻止特定端口

我的 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/

相关内容