使用iptables进行流量控制
前言:19年搞的一個小玩意,懶得整理了,有時間的可以快速看看,趕時間的直接跳到第二部分
0X00?亂七八糟的資料收集
systemctl管理iptables服務(wù),yum remove iptables? ? yum install iptables-services? ?
保存規(guī)則的兩種方式:
service iptables save? /usr/libexec/iptables/iptables.init saveiptables -A INPUT -m limit -s 192.168.3.106 --limit 5/sec -j ACCEPT? 如果不加-s,限定是總速率
iptables -A INPUT -s 192.168.3.106 -j DROP
?
對于每個Client進行限速:
hashlimit的匹配是基于令牌桶 (Token bucket)模型的。令牌桶是一種網(wǎng)絡(luò)通訊中常見的緩沖區(qū)工作原理,它有兩個重要的參數(shù),令牌桶容量n和令牌產(chǎn)生速率s。我們可以把令牌當成是門票,而令牌桶則是負責制作和發(fā)放門票的管理員,它手里最多有n張令牌。一開始,管理員開始手里有n張令牌。每當一個數(shù)據(jù)包到達后,管理員就看看手里是否還有可用的令牌。如果有,就把令牌發(fā)給這個數(shù)據(jù)包,hashlimit就告訴iptables,這個數(shù)據(jù)包被匹配了。而當管理員把手上所有的令牌都發(fā)完了,再來的數(shù)據(jù)包就拿不到令牌了。這時,hashlimit模塊就告訴iptables,這個數(shù)據(jù)包不能被匹配。除了發(fā)放令牌之外,只要令牌桶中的令牌數(shù)量少于n,它就會以速率s來產(chǎn)生新的令牌,直到令牌數(shù)量到達n為止。通過令牌桶機制,即可以有效的控制單位時間內(nèi)通過(匹配)的數(shù)據(jù)包數(shù)量,又可以容許短時間內(nèi)突發(fā)的大量數(shù)據(jù)包的通過(只要數(shù)據(jù)包數(shù)量不超過令牌桶n)。
hashlimit模塊提供了兩個參數(shù)--hashlimit和--hashlimit-burst,分別對應(yīng)于令牌產(chǎn)生速率和令牌桶容量。除了令牌桶模型外,hashlimit匹配的另外一個重要概念是匹配項。在hashlimit中,每個匹配項擁有一個單獨的令牌桶,執(zhí)行獨立的匹配計算。通過hashlimit的--hashlimit-mode參數(shù),你可以指定四種匹配項及其組合,即:srcip(每個源地址IP為一個匹配項),dstip(每個目的地址IP為一個匹配項),srcport(每個源端口為一個匹配項),dstport(每個目的端口為一個匹配項)
除了前面介紹的三個參數(shù)外,hashlimit還有一個必須要用的參數(shù),即--hashlimit-name。 hashlimit會在/proc/net/ipt_hashlimit目錄中,為每個調(diào)用了hashlimit模塊的iptables 命令建立一個文件,其中保存著各匹配項的信息。--hashlimit-name參數(shù)即用來指定該文件的文件名。
iptables -A INPUT -p tcp --dport 22 -m hashlimit --hashlimit-name ssh --hashlimit 5/sec --hashlimit-burst 10 --hashlimit-mode srcip -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
?
2.擴展匹配
2.1隱含擴展:對協(xié)議的擴展
-p tcp :TCP協(xié)議的擴展。一般有三種擴展
--dport XX-XX:指定目標端口,不能指定多個非連續(xù)端口,只能指定單個端口,比如
--dport 21? 或者 --dport 21-23 (此時表示21,22,23)
--sport:指定源端口
--tcp-fiags:TCP的標志位(SYN,ACK,FIN,PSH,RST,URG)
??? 對于它,一般要跟兩個參數(shù):
?? ?1.檢查的標志位
?? ?2.必須為1的標志位
?? ?--tcpflags syn,ack,fin,rst syn?? =??? --syn
?? ?表示檢查這4個位,這4個位中syn必須為1,其他的必須為0。所以這個意思就是用于檢測三次握手的第一次包的。對于這種專門匹配第一包的SYN為1的包,還有一種簡寫方式,叫做--syn
-p udp:UDP協(xié)議的擴展
??? --dport
??? --sport
-p icmp:icmp數(shù)據(jù)報文的擴展
??? --icmp-type:
?? ?echo-request(請求回顯),一般用8 來表示
?? ?所以 --icmp-type 8 匹配請求回顯數(shù)據(jù)包
?? ?echo-reply (響應(yīng)的數(shù)據(jù)包)一般用0來表示
RETURN的用法,在子鏈中使用RETURN 會返回到上一層鏈,直到target為ACCPT或DEROP或REJECT,不然一直返回到父鏈中,匹配下一條規(guī)則。
匹配tcp第一次握手的報文
[root@localhost ~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT[root@localhost ~]# iptables -t filter -nvxL INPUT Chain INPUT (policy ACCEPT 10 packets, 712 bytes)pkts bytes target prot opt in out source destination0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 flags:0x3F/0x02 reject-with icmp-port-unreachable0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 10/min burst 5–tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN 這個的意思是要匹配SYN,ACK,FIN,RST,URG,PSH這五個標志為,且SYN為1的報文
匹配tcp第二次握手的報文
[root@localhost ~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT上述可以簡寫成?
用ALL來表示SYN,ACK,FIN,RST,URG,PSH
修改某條規(guī)則:
iptables -R INPUT 1 -s 192.168.0.1 -j DROP清空所有規(guī)則:
iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT iptables -t raw -F iptables -t raw -X0X01?實現(xiàn)對總流量限制、TCP流量限制、SYN包限制、ACK包限制:
****本機程序訪問本機程序的數(shù)據(jù)包同樣會經(jīng)過INPUT鏈****
#!/bin/bash iptables -N all-chain # 用來限制總流量/IP iptables -N tcp-chain # 限制tcp流量/IP iptables -N SYN-chain # 限制SYN包流量/IP iptables -N ACK-chain # 限制ACK包流量/IPiptables -N all-limit # 限制總觸發(fā)閥值 iptables -N tcp-limit # 限制tcp總觸發(fā)閥值 iptables -N SYN-limit # 限制SYN總觸發(fā)閥值 iptables -N ACK-limit # 限制ACK總觸發(fā)閥值# INPUT-chain iptables -A INPUT -s 127.0.0.1 -j ACCEPT # 本機訪問本機的所有數(shù)據(jù)包放行iptables -A INPUT -j all-chain # 所有流量轉(zhuǎn)到all-chain處理iptables -A INPUT -j tcp-chain # tcp流量轉(zhuǎn)到tcp-chainiptables -A INPUT -p tcp --syn -j SYN-chain # 第一次發(fā)送的SYN包轉(zhuǎn)到SYN-chainiptables -A INPUT -p tcp --tcp-flags ALL ACK -j ACK-chain # 所有ACK包轉(zhuǎn)到ACK-chain# FORWARD-chain iptables -A FORWARD -s 127.0.0.1 -j ACCEPT # 本機訪問本機的所有數(shù)據(jù)包放行iptables -A FORWARD -j all-chain # 所有流量轉(zhuǎn)到all-chain處理iptables -A FORWARD -j tcp-chain # tcp流量轉(zhuǎn)到tcp-chainiptables -A FORWARD -p tcp --syn -j SYN-chain # 第一次發(fā)送的SYN包轉(zhuǎn)到SYN-chainiptables -A FORWARD -p tcp --tcp-flags ALL ACK -j ACK-chain # 所有ACK包轉(zhuǎn)到ACK-chain# all-chain總流量限制 iptables -A all-chain -j all-limit iptables -A all-chain -m hashlimit --hashlimit-name all-chain --hashlimit 300/sec --hashlimit-burst 300 --hashlimit-mode srcip -j RETURN # 日志記錄,限制每分鐘最多記錄三次,防止日志爆炸 iptables -A all-chain -m limit --limit 3/min -j LOG --log-prefix="Probable ddos:all-chain" iptables -A all-chain -j DROP# all-limit iptables -A all-limit -m limit --limit 10000/sec --limit-burst 5000 -j RETURN iptables -A all-limit -j DROP# tcp-chain總流量限制 iptables -A tcp-chain -j tcp-limit iptables -A tcp-chain -m hashlimit --hashlimit-name tcp-chain --hashlimit 80/sec --hashlimit-burst 80 --hashlimit-mode srcip -j RETURN iptables -A tcp-chain -m limit --limit 3/min -j LOG --log-prefix="Probable ddos:tcp-chain" iptables -A tcp-chain -j DROP# tcp-limit iptables -A tcp-limit -m limit --limit 100/sec --limit-burst 100 -j RETURN iptables -A tcp-limit -j DROP# SYN-chain總流量限制 iptables -A SYN-chain -j SYN-limit iptables -A SYN-chain -m hashlimit --hashlimit-name SYN-chain --hashlimit 30/sec --hashlimit-burst 30 --hashlimit-mode srcip -j ACCEPT iptables -A SYN-chain -m limit --limit 3/min -j LOG --log-prefix="Probable ddos:SYN-chain" iptables -A SYN-chain -j DROP# SYN-limit iptables -A SYN-limit -m limit --limit 25/sec --limit-burst 25 -j RETURN iptables -A SYN-limit -j DROP# ACK-chain總流量限制 iptables -A ACK-chain -j ACK-limit iptables -A ACK-chain -m hashlimit --hashlimit-name ACK-chain --hashlimit 30/sec --hashlimit-burst 30 --hashlimit-mode srcip -j ACCEPT iptables -A ACK-chain -m limit --limit 3/min -j LOG --log-prefix="Probable ddos:ACK-chain" iptables -A ACK-chain -j DROP# ACK-limit iptables -A ACK-limit -m limit --limit 25/sec --limit-burst 25 -j RETURN iptables -A ACK-limit -j DROP設(shè)計思路:
?
****如何永久保存iptables規(guī)則****
1. systemctl stop firewalldsystemctl disable firewalld2. yum install iptables-services3. systemctl enable iptables4. systemctl restart iptables5. service iptables save默認保存路徑為 /etc/sysconfig/iptables iptables實現(xiàn)目的IP轉(zhuǎn)發(fā),利用nat表output鏈修改數(shù)據(jù)包目的ip地址iptables -t nat -A OUTPUT -d 192.168.2.9 -j DNAT --to-destination 192.168.2.10?
總結(jié)
以上是生活随笔為你收集整理的使用iptables进行流量控制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: drm android 工作原理,[原创
- 下一篇: html模拟手机页面