【发布时间】:2015-06-28 20:23:33
【问题描述】:
我正在寻找一个 Hook,它允许我告诉/指示 ServerConnector(或 Jetty 架构中更合适的挂钩点的任何其他对象)不要接受 Web 服务器端口上的传入 TCP/IP 连接(例如:80 或 443)基于远程方的 IP 地址(因为这是在调用 accept() 之前和之前可用的所有信息,在接受之后,HTTP 数据可从 TCP/IP 帧的有效载荷)。
我的想法是,我会在那个钩子上附加一个软件和平,对于每个传入的连接都可以说:接受/撤销。 撤销后,传入的连接将被忽略,并且套接字将保持关闭状态,从而避免 Jetty 容器在其上做更多的工作/使用资源。
它还可以通过仅接受例如本地地址 (10.32....) 等来保护某些服务器端口之后的系统功能(例如特殊管理菜单)。还能够访问连接设备的 MAC 地址,并且仅在 MAC 地址在授权列表中时才允许访问(=用户可以物理访问 LAN 以连接他的设备,否则他的 MAC 地址永远不会是一个这是在 LAN 上看到的,因为如果不在同一个 LAN 上,则没有对等 MAC 地址交换)。
通过这种方式,我打算防止恶意连接消耗 CPU、带宽和套接字,只是为了在攻击期间向它们发送“主要”页面并迫使它们等待超时。同时,它还允许基于“物理本地访问”保护对非公共功能的访问。钩子软件甚至可以撤销部分IP地址的连接,例如中文IP地址范围等。
我在 ServerConnector 类(open/close/accept/...)上找到了典型的 TCP/IP 套接字接口,但我没有找到可以注册 pre-accept() 挂钩或回调的地方。我还查看了 ServerConnector 的类祖先,但我也没有真正看到任何类似的东西。我从org.eclipse.jetty.server Class ServerConnector开始
为了清楚起见,对于那些更喜欢代码的人来说,这将在概念上代表我在代码中寻找的内容。
...setup Jetty server, Factories, etc
ServerConnector http2=new ServerConnector(this.oServer,sslF,alpnF,h2F,https2F);
http2.setPort(8443);
http2.setPreAcceptHook(8843, oMyHook); <---INVENTED line
this.oServer.addConnector(http2);
钩子是 MyHook 对象的一个简单方法,返回 true 或 false。
boolean AcceptRevoke(IP, Port) <--return true=accept, false=revoke
我欢迎任何关于查看方向的提示(类名左右)或确认此类功能不可用或不能因此永远不可用。容器设计中可能存在不允许预先接受撤销的限制,就像那些可以对套接字库做的那样,我不知道,因此会寻找不可能的。
非常感谢。
产品和版本信息: 码头 9.3.0 (v20150612) alpn-boot-8.1.3 (v20150130) JRE 8(Oracle 1.8.0 Build 45 - b15)
【问题讨论】:
标签: security jetty hook tcp-ip connector