尝试使 iptables 无状态会导致无法预料的过滤

尝试使 iptables 无状态会导致无法预料的过滤

我正在尝试通过调整 iptables 来不跟踪 TCP 连接的状态,从而提高服务器的性能。我正在查看此指南: http://cotdp.com/2011/07/nginix-on-a-256mb-vm-slice-24000-tps/

但是,如果我执行以下任何一项操作,似乎所有传出连接都会被切断:

删除此规则: INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 添加这些:

iptables -t raw -I OUTPUT -j NOTRACK
iptables -t raw -I PREROUTING -j NOTRACK

进行任何更改后,立即会导致“ping google.com”返回无法找到“google.com”的错误(即 DNS 停止解析)。

以下是启动时加载的规则,但 fail2ban 随后添加了其他规则:

*筛选
-A 输入-i lo -j 接受
-A 输入!-i lo -d 127.0.0.0/8 -j 拒绝
-A 输入 -m 状态 --状态 ESTABLISHED,RELATED -j 接受
-A 输出 -j 接受
-A 输入-p icmp -j 接受
-A 输入-p tcp --dport ssh -j 接受
-A 输入-p tcp --dport http -j 接受
-A 输入-p tcp --dport https -j 接受
-A 输入-p tcp --dport smtp -j 接受
-A 输入-p tcp --dport ssmtp -j 接受
-A 输入 -j 拒绝
-A 转发 -j 拒绝
犯罪

以下是 iptables --list 的输出:

链输入(策略接受)
目标 保护 优化 源 目标         
fail2ban-ssh tcp -- 任何地方 任何地点 多端口 dports ssh
fail2ban-ssh-ddos tcp -- 任何地方 任何端口 dports ssh
fail2ban-pam-generic tcp -- 任何地方            
接受所有 -- 任何地方 任何地方            
拒绝所有 - 任何地点的环回/8 拒绝 - icmp 端口不可达
接受所有 -- 任何地方任何地方状态 RELATED,ESTABLISHED
接受 icmp -- 任何地方            
接受 tcp -- 任何地方 任何地方 tcp dpt:ssh
接受 tcp -- 任何地方 任何地方 tcp dpt:www
接受 tcp -- 任何地方 任何地方 tcp dpt:https
接受 tcp -- 任何地方 任何地方 tcp dpt:smtp
接受 tcp -- 任何地方 任何地方 tcp dpt:ssmtp
拒绝所有 - 任何地方任何地方拒绝 - icmp 端口不可达

链转发(策略接受)
目标 保护 优化 源 目标         
拒绝所有 - 任何地方任何地方拒绝 - icmp 端口不可达

链输出(策略接受)
目标 保护 优化 源 目标         
接受所有 -- 任何地方 任何地方            

链 fail2ban-pam-generic (1 个引用)
目标 保护 优化 源 目标         
返回全部 -- 任意位置 任意位置            

链 fail2ban-ssh (1 引用)
目标 保护 优化 源 目标         
返回全部 -- 任意位置 任意位置            

链 fail2ban-ssh-ddos (1 引用)
目标 保护 优化 源 目标         
返回全部 -- 任意位置 任意位置            

答案1

您有一条阻止所有传入流量的规则:

-A INPUT -j REJECT

并且您停止连接跟踪,因此接受已建立连接数据包的规则不再起作用:

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

因此您的 DNS 数据包出去后不会被跟踪,然后被第一条规则拒绝。

您需要启用跟踪以使第二条规则发挥作用,或者添加规则以允许来自“良好”来源的传入流量。

答案2

Linux 连接跟踪不仅跟踪 TCP 连接,还跟踪 UDP 伪连接和其他各种内容。

如果没有 notrack 规则,会发生什么情况。

  • 您的系统发送一个 DNS 请求,这会创建一个连接跟踪条目。
  • DNS 服务器生成回复
  • 该答复符合您的“接受已建立且相关”规则。

使用 notrack 规则时会发生以下情况

  • 您的系统发送了 DNS 请求,但未创建连接跟踪条目。
  • DNS 服务器生成回复
  • 该答复不符合您的“接受已建立且相关”规则。
  • 回复失败并触及了你的全部拒绝规则。

那么如何解决这个问题呢?要么你必须明确允许响应流量而不依赖于状态跟踪,要么你必须对 notrack 规则进行更有选择性的调整。

对于 DNS,明确允许响应流量可能是合理的。您知道您的 DNS 服务器是什么,并且您可能信任它。

如果您的服务器需要访问互联网上的资源,那么完全不使用连接跟踪就意味着使用效率低下的防火墙。

我希望你只需将 notrack 应用于往返于你的网络服务器的流量,就能以更少的麻烦获得更多的性能优势。例如

iptables -t raw -I OUTPUT -p tcp --sport http -j NOTRACK
iptables -t raw -I PREROUTING -p tcp --dport http -j NOTRACK

相关内容