由于大量的漫游器每秒访问我的Web服务器太多次,因此我进入服务器并发出以下命令,以尝试在5秒内将连接数限制为最多25个。我可能需要更严格一些,但我不是因为我有一个很少访问的页面,该页面要求50张图像,并且可能需要51个连接,并且我不希望用户永远等待剩余的26张图片。

iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 5 --hitcount 26 -j DROP

使用iptables -nL验证后,第一个命令可以工作,但是第二个命令立即返回以下消息:“iptables:无效参数。运行'dmesg'获取更多信息”。

执行后,将在其末尾收到以下消息:
Call Trace:
<IRQ>  [<ffffffff8112f7ba>] ? __alloc_pages_nodemask+0x74a/0x8d0
[<ffffffff81299270>] ? swiotlb_map_page+0x0/0x100
[<ffffffff8116e282>] ? kmem_getpages+0x62/0x170
[<ffffffff8116ee9a>] ? fallback_alloc+0x1ba/0x270
[<ffffffff8116e8ef>] ? cache_grow+0x2cf/0x320
[<ffffffff8116ec19>] ? ____cache_alloc_node+0x99/0x160
[<ffffffff8116fb9b>] ? kmem_cache_alloc+0x11b/0x190
[<ffffffff8144d058>] ? sk_prot_alloc+0x48/0x1c0
[<ffffffff8144e262>] ? sk_clone+0x22/0x2e0
[<ffffffff8149ff16>] ? inet_csk_clone+0x16/0xd0
[<ffffffff814b97d3>] ? tcp_create_openreq_child+0x23/0x470
[<ffffffff814b6f8d>] ? tcp_v4_syn_recv_sock+0x4d/0x310
[<ffffffff814b9576>] ? tcp_check_req+0x226/0x460
[<ffffffff814b69cb>] ? tcp_v4_do_rcv+0x35b/0x490
[<ffffffffa0322557>] ? ipv4_confirm+0x87/0x1d0 [nf_conntrack_ipv4]
[<ffffffff814b825a>] ? tcp_v4_rcv+0x51a/0x900
[<ffffffff81495270>] ? ip_local_deliver_finish+0x0/0x2d0
[<ffffffff8149534d>] ? ip_local_deliver_finish+0xdd/0x2d0
[<ffffffff814955d8>] ? ip_local_deliver+0x98/0xa0
[<ffffffff81494a9d>] ? ip_rcv_finish+0x12d/0x440
[<ffffffff81495025>] ? ip_rcv+0x275/0x350
[<ffffffff8145c3eb>] ? __netif_receive_skb+0x4ab/0x750
[<ffffffff81460058>] ? netif_receive_skb+0x58/0x60
[<ffffffff81460160>] ? napi_skb_finish+0x50/0x70
[<ffffffff814618c9>] ? napi_gro_receive+0x39/0x50
[<ffffffffa024e267>] ? e1000_receive_skb+0x67/0x110 [e1000e]
[<ffffffffa0250e6f>] ? e1000_clean_rx_irq+0x37f/0x580 [e1000e]
[<ffffffffa025397d>] ? e1000e_poll+0x8d/0x2d0 [e1000e]
[<ffffffff814619e3>] ? net_rx_action+0x103/0x2f0
[<ffffffff8107a5f1>] ? __do_softirq+0xc1/0x1e0
[<ffffffff810e6c60>] ? handle_IRQ_event+0x60/0x170
[<ffffffff8107a64f>] ? __do_softirq+0x11f/0x1e0
[<ffffffff8100c30c>] ? call_softirq+0x1c/0x30
[<ffffffff8100fa75>] ? do_softirq+0x65/0xa0
[<ffffffff8107a4a5>] ? irq_exit+0x85/0x90
[<ffffffff81532525>] ? do_IRQ+0x75/0xf0
[<ffffffff8100b9d3>] ? ret_from_intr+0x0/0x11
<EOI>

之前的内容是指USB设备和其他系统设备。有人可以告诉我如何成功限制传入连接的速率,而不会出现随机错误吗?

最佳答案

执行dmesg会显示错误原因:



这意味着recentiptables模块仅限于仅记住20个数据包。为了解决此问题,您可以执行以下任一操作:

  • hitcount规则中的iptables参数的值从26减少到20或更小。
  • 通过设置hitcount内核模块的选项ip_pkt_list_tot,将xt_recent参数的最大可能值从其默认值20增加。这可以通过在ip_pkt_list_tot.conf中创建一个/etc/modprobe.d/文件来完成,该文件包含:



    创建文件后,通过xt_recent重新加载modprobe -r xt_recent && modprobe xt_recent内核模块或重新引导系统。

  • 检查iptables的手册页会得出相同的结论:
       --hitcount hits
              This option must be used in conjunction with one of --rcheck or --update. When used, this will narrow the match to only happen  when
              the  address  is  in  the list and packets had been received greater than or equal to the given value. This option may be used along
              with --seconds to create an even narrower match requiring a certain number of hits within a specific time frame. The  maximum  value
              for  the  hitcount parameter is given by the "ip_pkt_list_tot" parameter of the xt_recent kernel module. Exceeding this value on the
              command line will cause the rule to be rejected.
    

    请注意,在某些系统上,xt_recent称为ipt_recent

    关于iptables - iptables的ratelimiting最近给出了错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26936653/

    10-16 21:42