使用iptables进行流量控制
前言:19年搞的一個(gè)小玩意,懶得整理了,有時(shí)間的可以快速看看,趕時(shí)間的直接跳到第二部分
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
?
對(duì)于每個(gè)Client進(jìn)行限速:
hashlimit的匹配是基于令牌桶 (Token bucket)模型的。令牌桶是一種網(wǎng)絡(luò)通訊中常見(jiàn)的緩沖區(qū)工作原理,它有兩個(gè)重要的參數(shù),令牌桶容量n和令牌產(chǎn)生速率s。我們可以把令牌當(dāng)成是門(mén)票,而令牌桶則是負(fù)責(zé)制作和發(fā)放門(mén)票的管理員,它手里最多有n張令牌。一開(kāi)始,管理員開(kāi)始手里有n張令牌。每當(dāng)一個(gè)數(shù)據(jù)包到達(dá)后,管理員就看看手里是否還有可用的令牌。如果有,就把令牌發(fā)給這個(gè)數(shù)據(jù)包,hashlimit就告訴iptables,這個(gè)數(shù)據(jù)包被匹配了。而當(dāng)管理員把手上所有的令牌都發(fā)完了,再來(lái)的數(shù)據(jù)包就拿不到令牌了。這時(shí),hashlimit模塊就告訴iptables,這個(gè)數(shù)據(jù)包不能被匹配。除了發(fā)放令牌之外,只要令牌桶中的令牌數(shù)量少于n,它就會(huì)以速率s來(lái)產(chǎn)生新的令牌,直到令牌數(shù)量到達(dá)n為止。通過(guò)令牌桶機(jī)制,即可以有效的控制單位時(shí)間內(nèi)通過(guò)(匹配)的數(shù)據(jù)包數(shù)量,又可以容許短時(shí)間內(nèi)突發(fā)的大量數(shù)據(jù)包的通過(guò)(只要數(shù)據(jù)包數(shù)量不超過(guò)令牌桶n)。
hashlimit模塊提供了兩個(gè)參數(shù)--hashlimit和--hashlimit-burst,分別對(duì)應(yīng)于令牌產(chǎn)生速率和令牌桶容量。除了令牌桶模型外,hashlimit匹配的另外一個(gè)重要概念是匹配項(xiàng)。在hashlimit中,每個(gè)匹配項(xiàng)擁有一個(gè)單獨(dú)的令牌桶,執(zhí)行獨(dú)立的匹配計(jì)算。通過(guò)hashlimit的--hashlimit-mode參數(shù),你可以指定四種匹配項(xiàng)及其組合,即:srcip(每個(gè)源地址IP為一個(gè)匹配項(xiàng)),dstip(每個(gè)目的地址IP為一個(gè)匹配項(xiàng)),srcport(每個(gè)源端口為一個(gè)匹配項(xiàng)),dstport(每個(gè)目的端口為一個(gè)匹配項(xiàng))
除了前面介紹的三個(gè)參數(shù)外,hashlimit還有一個(gè)必須要用的參數(shù),即--hashlimit-name。 hashlimit會(huì)在/proc/net/ipt_hashlimit目錄中,為每個(gè)調(diào)用了hashlimit模塊的iptables 命令建立一個(gè)文件,其中保存著各匹配項(xiàng)的信息。--hashlimit-name參數(shù)即用來(lái)指定該文件的文件名。
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.擴(kuò)展匹配
2.1隱含擴(kuò)展:對(duì)協(xié)議的擴(kuò)展
-p tcp :TCP協(xié)議的擴(kuò)展。一般有三種擴(kuò)展
--dport XX-XX:指定目標(biāo)端口,不能指定多個(gè)非連續(xù)端口,只能指定單個(gè)端口,比如
--dport 21? 或者 --dport 21-23 (此時(shí)表示21,22,23)
--sport:指定源端口
--tcp-fiags:TCP的標(biāo)志位(SYN,ACK,FIN,PSH,RST,URG)
??? 對(duì)于它,一般要跟兩個(gè)參數(shù):
?? ?1.檢查的標(biāo)志位
?? ?2.必須為1的標(biāo)志位
?? ?--tcpflags syn,ack,fin,rst syn?? =??? --syn
?? ?表示檢查這4個(gè)位,這4個(gè)位中syn必須為1,其他的必須為0。所以這個(gè)意思就是用于檢測(cè)三次握手的第一次包的。對(duì)于這種專門(mén)匹配第一包的SYN為1的包,還有一種簡(jiǎn)寫(xiě)方式,叫做--syn
-p udp:UDP協(xié)議的擴(kuò)展
??? --dport
??? --sport
-p icmp:icmp數(shù)據(jù)報(bào)文的擴(kuò)展
??? --icmp-type:
?? ?echo-request(請(qǐng)求回顯),一般用8 來(lái)表示
?? ?所以 --icmp-type 8 匹配請(qǐng)求回顯數(shù)據(jù)包
?? ?echo-reply (響應(yīng)的數(shù)據(jù)包)一般用0來(lái)表示
RETURN的用法,在子鏈中使用RETURN 會(huì)返回到上一層鏈,直到target為ACCPT或DEROP或REJECT,不然一直返回到父鏈中,匹配下一條規(guī)則。
匹配tcp第一次握手的報(bào)文
[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 這個(gè)的意思是要匹配SYN,ACK,FIN,RST,URG,PSH這五個(gè)標(biāo)志為,且SYN為1的報(bào)文
匹配tcp第二次握手的報(bào)文
[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上述可以簡(jiǎn)寫(xiě)成?
用ALL來(lái)表示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?實(shí)現(xiàn)對(duì)總流量限制、TCP流量限制、SYN包限制、ACK包限制:
****本機(jī)程序訪問(wèn)本機(jī)程序的數(shù)據(jù)包同樣會(huì)經(jīng)過(guò)INPUT鏈****
#!/bin/bash iptables -N all-chain # 用來(lái)限制總流量/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 # 本機(jī)訪問(wèn)本機(jī)的所有數(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 # 本機(jī)訪問(wèn)本機(jī)的所有數(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è)計(jì)思路:
?
****如何永久保存iptables規(guī)則****
1. systemctl stop firewalldsystemctl disable firewalld2. yum install iptables-services3. systemctl enable iptables4. systemctl restart iptables5. service iptables save默認(rèn)保存路徑為 /etc/sysconfig/iptables iptables實(shí)現(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进行流量控制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: drm android 工作原理,[原创
- 下一篇: html模拟手机页面