如何在 ODL 控制器中配置拒绝服务过滤器

Posted

技术标签:

【中文标题】如何在 ODL 控制器中配置拒绝服务过滤器【英文标题】:How to configure Denial of Service filters in ODL controller 【发布时间】:2020-06-18 20:56:59 【问题描述】:

我是 ODL 控制器和嵌入式码头的新手。 如果有请求泛滥,我想在 jetty.xml 中添加 DoSFilter 来限制 REST 请求。

我尝试搜索互联网,但有很多在 web.xml DoSFilter 中配置它的示例,但没有找到对 jetty.xml 的太多帮助

在 jetty.xml 中配置 DoSFilter 的任何帮助都会有很大帮助。

ODL - 氮气版

Jetty - 9.2.21.X 版本

以下是我目前尝试过的选项。

jetty.xml 中配置的过滤器:

    <Get name="handler">
        <Call name="addHandler">
            <Arg>
                <New class="org.eclipse.jetty.servlet.ServletContextHandler">
                    <Set name="contextPath">/</Set>
                    <Set name="resourceBase">../</Set>
                    <Call name="addFilter">
                        <Arg>
                            <New class="org.eclipse.jetty.servlet.FilterHolder">
                                <Arg>
                                    <New class="org.eclipse.jetty.servlets.DoSFilter" />
                                </Arg>
                                <Call name="setInitParameter">
                                    <Arg>maxRequestsPerSec</Arg>
                                    <Arg>30</Arg>
                                </Call>
                                <Call name="setInitParameter">
                                    <Arg>delayMs</Arg>
                                    <Arg>100</Arg>
                                </Call>
                                <Call name="setInitParameter">
                                    <Arg>maxRequestMs</Arg>
                                    <Arg>0</Arg>
                                </Call>
                                <Call name="setInitParameter">
                                    <Arg>maxIdleTrackerMs</Arg>
                                    <Arg>0</Arg>
                                </Call>
                                <Call name="setInitParameter">
                                    <Arg>ipWhitelist</Arg>
                                    <Arg>127.0.0.1</Arg>
                                </Call>
                            </New>
                        </Arg>
                        <Arg>/cxf/*</Arg>
                        <Arg>
                            <Call class="java.util.EnumSet" name="of">
                                <Arg>
                                    <Get class="javax.servlet.DispatcherType" name="REQUEST" />
                                </Arg>
                            </Call>
                        </Arg>
                    </Call>
                </New>
            </Arg>
        </Call>
    </Get>

在 web.xml 中配置的过滤器:

    <filter>
            <filter-name>DoSFilter</filter-name>
            <filter-class>org.eclipse.jetty.servlets.DoSFilter</filter-class>
            <init-param>
                    <param-name>maxRequestsPerSec</param-name>
                    <param-value>1</param-value>
            </init-param>
            <init-param>
                    <param-name>delayMs</param-name>
                    <param-value>100</param-value>
            </init-param>
            <init-param>
                    <param-name>maxRequestMs</param-name>
                    <param-value>0</param-value>
            </init-param>
            <init-param>
                    <param-name>maxIdleTrackerMs</param-name>
                    <param-value>0</param-value>
            </init-param>
            <init-param>
                    <param-name>ipWhitelist</param-name>
                    <param-value>127.0.0.1</param-value>
            </init-param>
    </filter>
    <filter-mapping>
            <filter-name>DoSFilter</filter-name>
            <url-pattern>/cxf/*</url-pattern>
    </filter-mapping>

【问题讨论】:

这不是一个供您使用 web xml 或 jetty-web xml 的网络应用程序吗? jetty xml 用于配置服务器。 您是否使用nginx 或apache httpd 之类的产品来代理您的码头应用程序?如果是这样,这两种产品都具有很好的速率限制请求能力。 @user2683814,该项目也有一个 web.xml。我什至在 web.xml 中也配置了过滤器,但没有运气。 【参考方案1】:

因为您使用的是嵌入式 Jetty,所以您不需要 jetty.xml 文件,而是可以通过 API 进行配置。这是一个代码示例,它在嵌入式使用中使用与示例相同的设置配置 DoSFilter。

Server server = new Server();
ServerConnector connector = new ServerConnector(server);
server.addConnector(connector);

ServletContextHandler contextHandler = new ServletContextHandler();
contextHandler.setContextPath("/");
server.setHandler(contextHandler);

DoSFilter filter = new DoSFilter();
filter.setMaxRequestsPerSec(30);
contextHandler.addFilter(new FilterHolder(filter), "/*", EnumSet.of(DispatcherType.REQUEST));

server.start();
server.join();

我还建议您更新到最新版本的 Jetty,因为 jetty-9.2 已停产,目前最新版本是 jetty-9.4.27。

【讨论】:

谢谢@Lachlan。我正在处理他们有 jetty.xml 的现有项目。它已经有其他服务器设置。我刚刚向其中添加了 QosFilter,但它不起作用。我已经用迄今为止尝试过的选项更新了我的问题。你能检查我是否做错了什么吗? 那个 web.xml 配置应该可以工作,我测试了它,它对我有用。你能提供一个码头服务器转储(设置 -Djetty.server.dumpAfterStart=true)吗?同样在 jetty.xml 示例中,您不需要在那里使用 init 参数,您可以直接调用 DoS 过滤器上的设置器。

以上是关于如何在 ODL 控制器中配置拒绝服务过滤器的主要内容,如果未能解决你的问题,请参考以下文章

烽火狼烟丨Apache Log4j2拒绝服务攻击(CVE45105)漏洞通告

如何在 Windows 上的 git 配置中修复“ssh 权限被拒绝,请重试错误”

如何知道用户是不是拒绝了 Swift 2 中的定位服务

如何设置IIS拒绝访问?

sql server 2000服务管理器 服务:拒绝访问。发生错误5-(拒绝

apache配置中的权限被拒绝:[Errno 13]权限被拒绝