【问题标题】:ratelimiting with iptables recent gives error最近使用 iptables 进行速率限制会出错
【发布时间】:2018-03-22 15:25:38
【问题描述】:

由于大量机器人每秒访问我的网络服务器太多次,我进入我的服务器并发出以下命令,试图在 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: Invalid argument. Run `dmesg' for more information.”

一旦我执行它,我会在它的末尾收到以下内容:

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设备和其他系统设备。有人可以告诉我如何成功地限制传入连接而不遇到随机错误吗?

【问题讨论】:

    标签: iptables


    【解决方案1】:

    执行dmesg揭示错误原因:

    [78482.351825] xt_recent: hitcount (26) 大于要记住的数据包 (20)

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

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

      选项 xt_recent ip_pkt_list_tot=26

      创建文件后,通过modprobe -r xt_recent &amp;&amp; modprobe xt_recent 重新加载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 规则使用-m recent 模块时,您不能modprobe -r。请先与iptables-save | grep recent 联系。在这种情况下,要么暂时删除这些规则,要么重新启动。
    • 我用的是Debian,文件夹名是/etc/modprobe.d(不带'e'),内核模块叫ipt_recent
    • @lihume 好建议。在 CentOS 中,可以使用相同的文件夹。我把名为 ipt.conf 的文件放在那里,内容为 options ipt_recent ip_pkt_list_tot=250 ip_list_tot=2000
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 2017-02-28
    相关资源
    最近更新 更多