基本匹配條件
-s 匹配條件 源地址
① 一次性指定多個ip源地址,用“逗號”隔開,多個特定ip地址
iptables -t filter -I INPUT -s 192.168.23.242,192.168.23.47 -j DROP
② 指定特定網段
iptables -I INPUT -s 192.168.23.0/24 -J DROP
③ 匹配取反條件
iptables -t filter -A INPUT ! -s 192.168.23.246 -j ACCEPT
意思為不是23.246的包就可以接受 但是沒有指明23.246的包如何處理
所以23.246的包應該是沒有匹配規則之后就會執行默認的規則也就是accpet規則所以取反規則相當於無效。
-d 匹配條件目標地址
我們可以用如下規則去查看我們當前機器的地址總共有多少
ifconfig | awk '/inet addr/{print $1,$2}'
比如當前機器有多個網絡出口,當前我只對某個接口進行接口的生效作用,當我個更換機器的的網絡出口的時
該網絡協議包還是可以正常運作,以路由器為例
當前路由器有蜂窩LTE出口ip、wlan出口ip、wan口出口ip、lan口出口ip等等
①指定不接收某個指定 ip 地址,指定不接收wan口請求相關的ping包等
iptables -I INPUT -s 192.168.23.46 -d 192.168.23.44 -j DROP
則當前規則生效
②一次性指定多個ip地址和-s一樣
-p 協議類型
①只想拒絕 tcp請求
iptables -t filter -I INPUT -s 192.168.23.246 -d 192.168.23.44 -p tcp -j DROP
當前ping還是可以ping通 但是ssh失敗了失去響應 說明當前的防火牆規則生效
在centos6中,-p支持的協議類型有
tcp、udp、udplite、icmp、esp、ah、sctp
centos7中除了上面的協議外 還支持 icmpv6、mh
當不適用-p則默表示所有類型的協議都會被匹配到,與使用-p all的效果相同
-i 網卡接口
-i 用於匹配報文流入的網卡, 從網卡出去的報文是不會用到-i選項的
-i 一般用於PREROUTING、INPUT鏈、FORWARD鏈
當主機有多塊網卡時,可以使用-o選項,匹配報文將由哪塊網卡流出,-o和-i是相對的,-i用於匹配報文從哪個網卡流入。-o 匹配從哪個網卡流出
-o 一般只能是POSTROUTING鏈、OUTPUT鏈、 FORWARD鏈
擴展匹配條件
--dport(--sport)源端口目的端口
基本匹配條件如源地址、目的地址可以直接用 然而擴展匹配條件的使用 需要依賴相應的擴展模塊。
如果在-p中已經指定協議,則默認使用協議中寫的模塊名。
如果沒有必須要指定對應的模塊 -m +模塊名 這樣才能正常使用 --dport功能
--dport(--sport)
① 在使用--dport之前一定要先定義好是在哪個模塊協議上進行使用的
否則會無法正常使用 --sport
iptables -I INPUT -p tcp -s 192.168.23.246 --sport 22 -j DROP
② 拒絕多個端口的訪問 可以在-m 后面加上multiport加上多個端口
iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT
③ 用 :的方式來決定當前的端口是從哪個端口到哪個端口
iptables -A INPUT -p tcp -m multiport --dports 22,80,22:443 -j ACCEPT
--src-range (--dst-range)
指定一段連續的ip地址范圍
iptables -I INPUT -m iprange --src-range 192.168.23.240-192.168.23.246 -j DROP
--string
--alogo指定對應的匹配算法,可用算法為bm、kmp,此選項為必需選項
--string指定需要匹配的字符串
報文中包含字符XXX,我們就丟棄當前的報文
iptables -I INPUT -m string --algo bm --string "百度一下" -j REJECT
-m string表示使用string模塊--algo bm表示用bm算法去匹配指定的字符串,--string " "要匹配的內容
--algo:用於指定匹配算法 可選的算法有bm和kmp 此選項為必選項
time
表示報文到達的時間在指定的時間范圍內 則符合匹配條件
比如在指定的時間內規定不能看網頁,如家中的熊孩子周六日的早上9:00到下午6:00不能瀏覽網頁
--timestart 指定時間范圍的開始時間,不可取反
--timestop 指定時間范圍的結束時間,不可取反
--weekdays 指定星期幾 可取反
--monthdays 指定幾號,可取反
--datestart 用於指定日期范圍的開始日期 不可取反
--datestop 用於指定日期范圍的結束時間 不可取反
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --monthdays 22,23 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time ! --monthdays 22,23 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --datestart 2017-12-24 --datestop 2017-12-27 -j REJECT
限制從2019.12.15-2019.12.16都不能上網
connlimit模塊
主要用來限制連接服務器的數量
常用的擴展匹配條件如下
--connlimit-above 單獨使用此選項時,表示限制每個ip的鏈接數量
--connlimit-mask 選項不可單獨使用,配合--connlimit-above選項,配合此選項針對某類ip段內的一定數量的ip進行連接數量限制
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 27 -j REJECT
限制鏈接數量上限,如每個ip地址最多只能占用2個ssh鏈接遠程到server端,我們可以用如下的限制
可以發現第三個連接就不能正常連接進來了
mask為掩碼的意思 24轉換成十進制表示的是255.255.255.0一個最多只能包含254個ip的C類網址中,
同時最多只能有2個ssh客戶端連接到當前服務器...如果子網掩碼是27 表示為這個網段中最多只能有30個ip
limit模塊
主要用來調整網絡流量和速率限制
--limit-burst 類比令牌桶算法 此選項用於指定令牌桶中令牌的最大數量
--limit 類比令牌桶算法 此選項用於指定令牌桶中生成新令牌的頻率,可用時間單位有second minute hour day
iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT
iptables -t filter -A INPUT -p icmp -j REJECT
令牌桶算法是網絡流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一種算法。典型情況下,令牌桶算法用來控制發送到網絡上的數據的數目,並允許突發數據的發送。
大小固定的令牌桶可自行以恆定的速率源源不斷地產生令牌。如果令牌不被消耗,或者被消耗的速度小於產生的速度,令牌就會不斷地增多,直到把桶填滿。后面再產生的令牌就會從桶中溢出。最后桶中可以保存的最大令牌數永遠不會超過桶的大小。
如果令牌桶中存在令牌則允許發送流量,如果令牌桶中不存在令牌,則不允許發送流量
令牌桶算法 假如用戶配置的平均發送速率為r,每個1/r 秒 一個令牌被加入捅中
假設桶最多可以存b個令牌 如果令牌桶滿 則令牌會被丟棄
當一個n個字節(一個字節需要一個令牌才能發送數據)的數據包到達 就從令牌桶中拿出那個令牌 將數據包發送到網絡
如果令牌桶中少於 n個令牌,那么數據包在流量限制之外,
對於在流量限制之外的數據包的處理方式有以下幾種
1 被丟棄 2排列在隊列中當令牌桶積累足夠多令牌再傳輸 3 單個數據包拿單個令牌繼續發送需要做特殊標記 網絡過載時就會把這些特殊標記包丟棄
--limit用於指定多長時間生成一個新令牌的b limit-burst指的是木桶中最多存放幾個令牌
如上例中表示令牌桶最多存放3個令牌 每分鍾生成10個令牌(6s 生成一個令牌)
對報文到達速率進行限制 想要限制單位時間內流入的包的數量 就用limit模塊(單位時間可以是 分鍾 小時 天)
比如限制本機最多每6s放行一個ping包
--tcp-flags
tcp頭中的標志位 結構表如下
第一條命令為第一次握手的報文 第二條命令為第二次握手的報文
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags ALL SYN,ACK -j REJECT