成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何優雅的使用 IPtables 在多租戶環境中實現 TCP 限速

系統 Linux
由于 abuse 發生在連接建立階段,還沒有進入到業務代碼,所以無法從應用的層面進行限速,解決發現就是通過 iptables 實現的。詳細的實現方法可以參考這篇文章。

[[440071]]

我們有個服務以類似 SideCar 的方式和應用一起運行,SideCar 和應用通過 Unix Domain Socket 進行通訊。為了方便用戶,在開發的時候不必在自己的開發環境中跑一個 SideCar,我用 socat 在一臺開發環境的機器上 map UDS 到一個端口。這樣用戶在開發的時候就可以直接通過這個 TCP 端口測試服務,而不用自己開一個 SideCar 使用 UDS 了。

因為所有人都要用這一個地址做開發,所以就有互相影響的問題。雖然性能還可以,幾十萬 QPS 不成問題,但是總有憨憨拿來搞壓測,把資源跑滿,影響別人。我在使用說明文檔里用紅色大字寫了這是開發測試用的,不能壓測,還是有一些視力不好的同事會強行壓測。隔三差五我就得去解釋一番,禮貌地請同事不要再這樣做了。

最近實在累了。研究了一下直接給這個端口加上 per IP 的 rate limit,效果還不錯。方法是在 Per-IP rate limiting with iptables[1] 學習到的,這個公司是提供一個多租戶的 SaaS 服務,也有類似的問題:有一些非正常用戶 abuse 他們的服務,由于 abuse 發生在連接建立階段,還沒有進入到業務代碼,所以無法從應用的層面進行限速,解決發現就是通過 iptables 實現的。詳細的實現方法可以參考這篇文章。

iptables 本身是無狀態的,每一個進入的 packet 都單獨判斷規則。rate limit 顯然是一個有狀態的規則,所以要用到 module: hashlimit。(原文中還用到了 conntrack,他是想只針對新建連接做限制,已經建立的連接不限制速度了。因為這個應用內部就可以控制了,但是我這里是想對所有的 packet 進行限速,所以就不需要用到這個 module)

完整的命令如下: 

  1. $ iptables --new-chain SOCAT-RATE-LIMIT  
  2. $ iptables --append SOCAT-RATE-LIMIT \  
  3.     --match hashlimit \  
  4.     --hashlimit-mode srcip \  
  5.     --hashlimit-upto 50/sec \  
  6.     --hashlimit-burst 100 \  
  7.     --hashlimit-name conn_rate_limit \  
  8.     --jump ACCEPT  
  9. $ iptables --append SOCAT-RATE-LIMIT --jump DROP  
  10. $ iptables -I INPUT -p tcp --dport 1234 --jump SOCAT-RATE-LIMIT 

第一行是新建一個 iptables Chain,做 rate limit;

第二行處理如果在 rate limit 限額內,就接受包;否則跳到第三行,直接將包 DROP;

最后將新的 Chain 加入到 INPUT 中,對此端口的流量進行限制。

有關 rate limit 的算法,主要是兩個參數:

  1.   --hashlimit-upto 其實本質上是 1s 內可以進入多少 packet,50/sec 就是 20ms 一個 packet;
  2.   那如何在 10ms 發來 10 個 packet,后面一直沒發送,怎么辦?這個在測試情景下也比較常見,不能要求用戶一直勻速地發送。所以就要用到 --hashlimit-burst。字面意思是瞬間可以發送多少 packet,但實際上,可以理解這個參數就是可用的 credit。

兩個指標配合起來理解,就是每個 ip 剛開始都會有 burst 個 credit,每個 ip 發送來的 packet 都會占用 burst 里面的 credit,用完了之后再發來的包就會被直接 DROP。這個 credit 會以 upto 的速度一直增加,但是最多增加到 burst(初始值),之后就 use it or lost it.

舉個例子,假如 --hashlimit-upto 50/sec --hashlimit-burst 20 的話,某個 IP 以勻速每 ms 一個 packet 的速度發送,最終會有多少 packets 被接受?答案是 70. 最初的 20ms,所有的 packet 都會被接受,因為 --hashlimit-burst 是 20,所以最初的 credit 是 20. 這個用完之后就要依賴 --hashlimit--upto 50/sec 來每 20ms 獲得一個 packet credit 了。所以每 20ms 可以接受一個。

這是限速之后的效果,非常明顯:

 

 

責任編輯:龐桂玉 來源: 奇妙的Linux世界
相關推薦

2023-09-18 08:00:00

Kubernetes容器集群

2022-09-13 07:14:29

云計算SaaS多租戶

2021-10-26 10:28:41

開發架構Kubernetes

2015-10-10 10:21:26

OpenStackRegion多Region

2020-10-16 08:57:51

云平臺之多租戶的實踐

2011-03-16 09:05:29

iptablesNAT

2011-09-27 11:09:13

2022-04-30 11:10:40

Nacos集群環境企業

2011-03-16 11:15:12

2022-10-08 00:00:04

DataObjectFlowable流程

2011-03-15 14:50:03

使用IPTables

2024-03-29 12:11:46

2022-11-01 11:55:27

ReactVue3

2015-11-26 10:53:45

LinuxWindowsMac OS

2017-07-26 11:32:50

NETRabbitMQ系統集成

2021-12-01 09:00:00

公共云云計算服務器

2024-12-18 12:10:00

2022-11-15 07:50:47

ORM鏈式操作刪除

2022-11-11 07:48:56

ORM鏈式輪播圖

2021-12-21 15:17:53

Kubernetes緩存Linux
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜寂寞福利视频 | 偷拍亚洲色图 | av色站 | 热99精品视频 | 黄色片免费看 | 丝袜 亚洲 另类 欧美 综合 | 日日噜噜噜夜夜爽爽狠狠视频97 | 亚洲高清视频一区二区 | 欧美日韩中文字幕在线 | 国产剧情一区二区三区 | 国产999精品久久久久久 | 亚洲草草视频 | 午夜精品在线 | 米奇狠狠鲁 | 国产乱精品一区二区三区 | 精品久久久久久久人人人人传媒 | 成人欧美一区二区三区黑人孕妇 | 国产一区91精品张津瑜 | 盗摄精品av一区二区三区 | 欧美一级毛片久久99精品蜜桃 | 日韩视频一区二区三区 | 欧美综合在线视频 | 亚洲午夜网 | 久久www免费视频 | 精品国产乱码久久久久久88av | 国产伦一区二区三区久久 | 国产福利资源在线 | 一级片网站视频 | 亚洲精品电影在线观看 | 中文av在线播放 | 中文字幕中文字幕 | 日韩精品专区在线影院重磅 | 欧美在线色视频 | 亚洲精品68久久久一区 | 福利在线看 | 亚洲男女激情 | 国产日韩精品在线 | 国产精品s色 | com.国产| 一区二区三区中文字幕 | 奇米超碰在线 |