我正在尝试通过调整 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