我有一個郵件伺服器,我有一個壞習慣,用戶喜歡在一秒鐘內同時點擊發送/接收按鈕,導致日誌中充斥著不必要的資訊。
我試圖限制我的網路中的每個IP位址(內部IP位址)能夠每30秒一次連接到郵件伺服器,但它不應該應用於外部IP位址,郵件伺服器有時會收到另一個允許的郵件伺服器。
我已閱讀 iptables 的線上說明頁面並發現--connlimit-above N
它僅限制連線而不是按時間單位。
任何人都可以告訴我如何使用 iptables 或 ufw 來完成它?
答案1
這是速率限制的標準情況:
iptables -I INPUT -p tcp --dport 25 -i eth0 -s 192.168.0.0/24 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 25 -i eth0 -s 192.168.0.0/24 -m state --state NEW -m recent --update --seconds 30 --hitcount 2 -j DROP
這裡我假設你的區域網路是192.168.0.0/24你的介面是乙太網路0,如果不是,請相應更改。
第一條規則檢測所有新的數據包過來乙太網路0從您的 LAN 傳送到 TCP 連接埠 25,並將 IP 位址新增至最近的列表;第二個命令,在收到新的同一連接埠上的資料包,檢查最近的列表 (- 更新)並且,如果輸入到清單中的位址小於--秒 30之前,如果給定數量,則丟棄資料包--點擊次數2已達到。
請注意,這僅適用於新的資料包:如果您正在進行合法的對話,您不想幹擾它,只需阻止另一個對話的建立。在這一點上,我的答案與Angelo的答案完全不同
答案2
好吧,我還沒有測試過這個,所以如果它不起作用,我提前道歉(但希望這能讓你足夠了解它):
iptables -A INPUT -s 192.168.0.0/24 -p tcp -m state --state ESTABLISHED --tcp-flags FIN,ACK FIN,ACK --dport 25 -m recent --name smtplimit --set
iptables -A INPUT -s 192.168.0.0/24 -p tcp -m state --state ESTABLISHED --tcp-flags RST RST --dport 25 -m recent --name smtplimit --set
iptables -A INPUT -s 192.168.0.0/24 -m recent --name smtplimit --rcheck --seconds 30 --hitcount 1 -m limit --limit 1/minute -j LOG --log-prefix 'SMTP limit:'
iptables -A INPUT -s 192.168.0.0/24 -m recent --name smtplimit --rcheck --seconds 30 --hitcount 1 -j DROP