我不是 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
故障排除步骤:
检查多端口 iptables 模块是否已加载:
lsmod | grep multiport # Should see something like xt_multiport or ipt_multiport in the output
验证您的 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 内容。不要在里面放任何东西。