我之所以要这样做,是因为用户使用 JavaScript 针对我们的 API 进行开发,并且一些开发人员搞砸了并导致访问者使用 AJAX 请求猛烈抨击服务器。发生这种情况时,我希望能够将 API 请求限制为每分钟 50 个请求,或者类似的效果。
注意:(特别是数据库密集型资源,所以可能在路径级别,而不是服务器范围内(例如,节流“/json_api/”,但不是“/static/”)。
在最近的更新和安全“强化”之后,位于 120Mbps 电缆调制解调器连接后面的 CentOS6 NAT 路由器/防火墙似乎将吞吐量限制在 30Mbps。
在更新和强化之前,我获得了 90Mbps。
我检查了 CPU 和网络使用情况,这些似乎都不是限制因素。 tc
没有显示任何流量整形正在进行,我不知道如何进一步解决这个问题。
我有一个 CentOS 6 系统作为 NAT 路由器/防火墙在 Comcast 电缆调制解调器后面运行,它也作为 NAT 路由器运行
1000 100
eth1 eth0
Internet-------Modem-------------CentOS6-----------------LAN
10.0.0.0/24 192.168.10.0/24
Run Code Online (Sandbox Code Playgroud)
双 NAT 是 CentOS 系统的遗产,以前曾作为以桥接模式运行的时代华纳电缆调制解调器后面的路由器/防火墙。当我进入 Comcast 领域时,我打算将调制解调器切换到桥接模式,但从未尝试过,而且双 NAT 从未引起过问题。我获得了 90Mbps 的吞吐量,没有任何问题。
在准备在 Comcast 调制解调器上转换为桥接模式时,我决定通过禁用一些不需要的服务并执行“yum update”来“强化”CentOS 系统,我已经有一段时间没有这样做了。加固后,我进行了速度测试,惊讶地发现吞吐量低至 30Mbps。
我尝试像这样将我的主桌面系统直接连接到调制解调器
eth1 eth0
Internet---Modem-------------CentOS6-----------------LAN
| 10.0.0.0/24 192.168.10.0/24
|
+--------------Desktop(Win7)
Run Code Online (Sandbox Code Playgroud)
运行 speedtest.net 验证了我的 Comcast 连接能够达到 120Mbps,因此我在 CentOS 系统上更改的某些内容导致吞吐量上限为 30Mbps。每次我从 LAN(在 CentOS 系统后面)进行速度测试时,我都会得到一个在 30Mbps 的 1-2% 内的值,所以几乎感觉有些东西在人为地限制吞吐量。
我想也许流量整形以某种方式启用了,但tc
似乎表明它不活跃
[jhg@perseus …
Run Code Online (Sandbox Code Playgroud) 这似乎与编程有关,但这是一个操作系统问题。
我正在编写一个小型高性能守护进程,每秒需要数千个连接。它在 Linux 上运行良好(特别是 EC2 上的 Ubuntu 9.10)。在 Mac OS X 上,如果我在一个基准测试中抛出几千个连接(大约 16350 个),它只是打开一个连接,做它的事情并关闭连接,然后基准程序挂起几秒钟等待套接字变为可用在继续之前(或在过程中超时)。
我同时使用了 Apache Bench 和 Siege(以确保它不是基准应用程序)。
那么为什么/如何 Mac OS X 限制可以使用套接字的速率,我可以阻止它这样做吗?
还是有其他事情发生?
我知道有一个文件描述符限制,但我没有达到那个限制。接受套接字没有错误,它只是在第一个(大约)16000 之后挂起一段时间,等待 - 我假设 - 操作系统释放套接字。这不应该发生,因为此时所有先前的套接字都已关闭。它们应该以关闭的速度提供,并在 Ubuntu 上提供,但在 Mac OS X 上似乎存在某种多(5-10?)秒的延迟。
我尝试使用 ulimit 进行调整。纳达。
我正在寻找一种以尊重站点策略的方式灵活管理出站 HTTP/HTTPS 流量的方法,并且可以部署在我们数据中心网络的“边缘”。
例如,我们使用了几个具有限制率的 Web API,例如“每秒不超过 4 个请求”或“每天最多 50K 个请求”等。我们公司有很多人使用这样的各种服务,所以我不能集中管理软件中的所有请求。人们以不同的时间表和不同的强度运行这些东西。我们对此很好(它满足内部需求),但我们意识到 - 总的来说 - 我们可能会遇到产生如此多并发流量的情况,我们会被网站阻止。(虽然是无意的)
我所期待/希望的是,我们可以利用网络硬件世界中已经存在的带宽管理/流量整形解决方案,然后我们可以在数据中心网络的边缘部署这样的东西。
理想情况下,我可以编写 L4 或 L7 路由规则,以确保我们的数据中心生成不超过 - 例如 - 4 req/sec 出站。理想情况下,其余的请求将由硬件排队一段合理的时间,而队列容量过剩则被简单地拒绝。我意识到没有免费的午餐,节流不会解决基本的内在需求(请求)与供应(站点策略)问题。但是,节流将允许我们在某个窗口(例如一天)内“平滑”请求,以便我们可以以适当限制的方式利用外部服务,同时最大限度地利用。
有谁知道这样的网络级带宽管理解决方案?如果是这样,它是否还支持不仅基于 HTTP 请求中的 URL 之类的规则,而且还支持一些额外的 HTTP 标头?
我对保护 Web 应用程序免受机器人攻击的背景感兴趣,但我认为它适用于机器人可以通过 IPv6 进行的所有类型的攻击。
在 Web 应用程序中,您希望保护一些页面免受机器人攻击。
它可能是一个登录页面:您希望避免数百万个尝试用户名/密码组合的请求。
它可能是一个注册页面。您不希望在您的网站上创建数千个机器人帐户。
或者您可能不希望立即下载数据库的全部内容。您认为匿名用户每天向您的数据库发出 100 或 200 个请求来获取一些信息是可以接受的,但您不能接受机器人每分钟执行 1000 个请求来下载您提供的所有内容。
或者只是为了统计目的。您正在记录网站上的访问者活动,并且您不希望机器人完全影响您的数据,例如,人为地点击链接数千次,以便其链接到的文章成为您的新闻网站上“最受欢迎的文章” 。
我经常使用基于 IP 地址的节流/速率限制以及 Nginx 速率限制功能来处理此问题:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/m;
server {
location /sensitiveUrl {
limit_req zone=mylimit;
proxy_pass http://my_upstream;
}
}
Run Code Online (Sandbox Code Playgroud)
但对于 IPv6,我不确定这有多有效。我的意思是,使用 IPv4 相对有效,因为攻击者创建和使用数千个 IP 地址的成本很高,但使用 IPv6 似乎任何人都可以创建数百万个 IP。这要怎么处理呢?我应该对 IPv6 网络而不是地址应用限制吗?如果我这样做的话,实际效果如何?
我们使用的服务的 API 将拒绝请求,除非源 IP 先前已被列入白名单。他们只给了我们 3 个插槽,这是一个问题,因为我们有超过 3 台机器需要使用 API。
解决此问题的最常用技术是什么?
注意:我不想做任何违反 3rd-party API 的条款和条件的事情。我们正在使用ResellerClub,我联系他们要求更多插槽,但他们回答说:
我请求您将您的服务器路由到几组 IP。
因此这个问题。
想法:
我们的架构:我们使用 AWS 并在 ELB 后面运行的 VPC 中放置我们的实例。我们经常在事先不知道 IP 地址的情况下启动新实例。我们在所有机器上运行相同的软件。这些机器运行 CoreOS,我们的应用程序在 Docker 容器中运行。
throttling ×6
bandwidth ×2
http ×1
ip-address ×1
ipv6 ×1
mac-osx ×1
nat ×1
networking ×1
nginx ×1
proxy ×1
router ×1
socket ×1
tunneling ×1