问题1:为什么我没有被禁止?

问题1:为什么我没有被禁止?

我不是 iptables 专家,有两个奇怪的行为需要修复!

问题1:为什么我没有被禁止?

我有一个自定义链f2b-nginx-naxsi,它具有以下 iptable 规则:

$ sudo iptables -S f2b-nginx-naxsi
-N f2b-nginx-naxsi
-A f2b-nginx-naxsi -s 81.250.100.81/32 -j REJECT --reject-with icmp-port-unreachable #<== Here
-A f2b-nginx-naxsi -j RETURN

81.250.100.81是我的公共IP,所以我应该被禁止。

它不起作用。规则无效!

从链上加载链的方式INPUT如下:

sudo iptables -S INPUT
-P INPUT ACCEPT
-A INPUT -p tcp -m multiport --dports 80,443 -j f2b-nginx-naxsi    #<== Here
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -j INPUT_direct
-A INPUT -j INPUT_ZONES_SOURCE
-A INPUT -j INPUT_ZONES
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -j REJECT --reject-with icmp-host-prohibited

问题 2:为什么我被禁止使用 SSH,而不是 :80?

为了修复问题1我采用了之前的规则并将其设置在INPUT链内:
-I INPUT -s 81.250.100.81/32 -j REJECT --reject-with icmp-port-unreachable

按 Enter 键后,我与机器断开连接,哈哈。
但由于某些原因,我仍然可以从浏览器 ping 我们的 nginx...
为什么它杀死了 SSH (22) 而不是标准 http 连接 (80)

提前谢谢,
;-)

答案1

故障排除步骤:

  1. 检查多端口 iptables 模块是否已加载:

     lsmod | grep multiport
     # Should see something like xt_multiport or ipt_multiport in the output
    
  2. 验证您的 nginx 服务器实际上正在侦听端口 80 和/或 443。您可以在代理后面进行配置。

     sudo ss -tlnp | grep nginx
     # Should see nginx listed listening on one of those two ports
    

(已编辑)

2b.检查 docker 主机上的哪些端口映射到 nginx 容器。

    docker port <container_name>

This command should show which port(s) you need to use in your custom IPtables chain running on the container host.

答案2

我终于揭开了谜底!

问题来自 docker,它超越了我的 iptable 规则......

为了删除与 docker 容器的传入连接,您必须将规则放置在名为 的链中DOCKER-USER
该链是由 Docker 本身创建的,这些规则将优先于 docker 引擎中的规则。

例如,禁止特定IP(例如来自fail2ban)在端口 443 上:

sudo iptables -I DOCKER-USER -i eth0 -s <SPECIFIC_IP> -p tcp --dport 443 -j DROP

(更改eth0为您的外部接口)

  • 不要忘记设置端口,否则规则可能适用于您的 SSH 端口 (22),您将禁止自己...
  • INPUT如果您尝试阻止对 Docker 容器的访问,则向链添加规则将不起作用。
  • 调用的链DOCKER仅适用于 docker 内容。不要在里面放任何东西。

相关内容