iptables的詳細教程,
可以參考朱雙印的個人博客,http://www.zsythink.net/archives/1199
iptables由4張表 5條鏈組成
表像一個容器,來存儲不同類型的規則,
鏈是類似一個關卡,大門上寫好了不同的表(表里有規則)
表: filter表,nat表,mangle表,raw表
鏈: input鏈,output鏈,prerouting鏈,postrouting鏈,forward鏈
雖然表有4張,其實運維幾乎大部分時候只用到了 filter表
雖然鏈有5條,其實運維幾乎大部分的時候只用到了input鏈(output 鏈偶爾用到,不過數量忽略不計,其他的鏈更是很少很少用)
其實運維方面大部分是圍繞 filter表,input鏈展開的
如 iptables -t filter -I INPUT -p tcp -m tcp --dport 8080 -j ACCEPT
關鍵字 filter(表), INPUT(鏈),
iptables 的設置需要依照順序,來添加規則,順序不好,影響性能,雖然也許影響的性能只是微乎其微
最好的規則規划,可以參考iptables 的默認規則
iptables 規則可以修改配置/etc/sysconfig/iptables文件,之后service iptables restart來生效
或者直接用類似"iptables -t filter -I INPUT -p tcp -m tcp --dport 8080 -j ACCEPT" 這樣的方式在命令行添加,
但是命令行添加后,重啟服務器,設置會丟失,需要保存一下,命令是 service iptables save,運行該命令,會把設置
寫入到/etc/sysconfig/iptables中
centos 7 默認使用firewalld 沒有使用iptables
可以通過如下命令禁用firewalld 並啟用iptables,(清空iptables 規則的命令 iptables -F)
yum install iptables-services -y systemctl stop firewalld systemctl disable firewalld systemctl enable iptables service iptables start iptables -F service iptables save
以上操作后,啟用iptables 並且清空了iptables的規則
(一)查詢規則
iptables -nL
n參數是禁止把ip轉換成域名的形式,因為很多ip會反解析成域名,不方便查看
L是列表的意思
查看現有的filter表的規則,默認省卻了 -t filter, 其實全寫是iptables -t filter -nL
如果要查詢nat表的規則,那就iptables -t nat -nL
iptables -nvL
比上面的事例多了一個v, v參數可以顯示不同規則,產生的流量包數量和流量大小
iptables -nvxL
比上面的事例多了一個x, 這個在shell編程中可能會用到,不加x ,類似 ls -h, 流量是為了人類可讀的方式,根據流量
大小,轉換成Kb或者Mb
加了x,那么流量的單位就變成了小b, byte,方便shell腳本計算
iptables -t filter -nvxL INPUT iptables -t filter -nvxL OUTPUT iptables -t filter -nvxL self_define
可以指定查看不同鏈,在行尾放不同的鏈名稱,或者自定義的鏈名稱
iptables -t filter -nvxL INPUT --line
比上一個多了一個--line,兩個短杠加line ,雙短杠不可以省略,原本全寫是--line-numbers,已經是省略過的了
可以查看不同規則的行號
清空統計
iptables -Z
或者指定清零、清空某個鏈的某個規則
-Z參數支持指定鏈名稱和規則索引號
iptables -Z INPUT 1
(二)修改規則
iptables -t filter -A INPUT -s 192.168.1.146 -j DROP iptables -t filter -A INPUT -s 192.168.1.146 -j ACCEPT
命令語法: iptabels -t 表名 -A 鏈名 匹配條件 -j 動作
-A 是append的意思,這里如果寫 -I 就是insert的意思
append把新增規則放到最后一行
insert把新增規則放到第一行
第一個命令是把 s (source的意思) 來自IP 192.168.1.146 的數據包 drop 掉這個命令加到行尾
第二個命令是把 s (source的意思) 來自IP 192.168.1.146 的數據包 accept 這個命令加到行尾
iptables -t filter -D INPUT -s 192.168.1.146 -j DROP
命令語法: iptabels -t 表名 -D 鏈名 匹配條件 -j 動作
-D 是delete 刪除的意思
是把 s (source的意思) 來自IP 192.168.1.146 的數據包 drop掉這個命令刪除
iptables -t filter -A INPUT 2 -s 192.168.1.146 -j DROP
比上面的事例多了一個2(在INPUT后面),這個2的意思是把規則添加到第2行
iptables -t filter -D INPUT 2
表示刪除filter表中關於INPUT鏈的2號規則(--line-numbers 中的序列號為2)
iptabels -t filter -P INPUT ACCEPT
iptabels -t filter -P FORWARD ACCEPT
命令的意思是給某個鏈設定默認的規則,
第一個命令把INPUT鏈設置為默認ACCEPT
第二個命令把FORWARD鏈設置為默認ACCEPT
iptables -t filter -F INPUT
iptables -t filter -F OUTPUT
第一個命令表示清空filter表中的關於INPUT鏈的所有規則
第二個命令表示清空filter表中關於OUTPUT鏈的所有規則
iptables -t filter -F
iptables -t nat -F
第一個命令表示清空filter表中的所有規則,-f filter 可以省卻,寫作iptables -F
第二個命令表示清空nat表中的所有規則
service iptables save /usr/sbin/iptables-save > /etc/sysconfig/iptables /usr/sbin/iptables-restore < /etc/sysconfig/iptables-new
第一行的命令和第二行的命令,功能相同,都是把現有規則寫入到系統中 /etc/sysconfig/iptables中
並且即使重啟服務器,iptables規則也不會改變
第三行命令是說把文件/etc/sysconfig/iptables-new中的規則應用到系統中,需要service iptabels save
才可以真正寫入到系統文件/etc/sysconfig/iptables 中,保證開啟重啟后有效
(三)基本匹配條件
iptables -t filter -I INPUT -s 192.168.1.111,192.168.1.118 -j DROP iptables -t filter -I INPUT -s 192.168.1.0/24 -j ACCEPT iptables -t filter -I INPUT ! -s 192.168.1.0/24 -j ACCEPT
參數-s 用於匹配源地址,如有多個源地址,每個IP之間用逗號隔開,
支持網段
iptables -t filter -I OUTPUT -d 192.168.1.111,192.168.1.118 -j DROP iptables -t filter -I INPUT -d 192.168.1.0/24 -j ACCEPT iptables -t filter -I INPUT ! -d 192.168.1.0/24 -j ACCEPT
參數-d 用於匹配目標地址,如有多個源地址,每個IP之間用逗號隔開,
支持網段
iptables -t filter -I INPUT -p tcp -s 192.168.1.146 -j ACCEPT iptables -t filter -I INPUT ! -p udp -s 192.168.1.146 -j ACCEPT
參數-p 用於匹配tcp協議,類似的匹配協議類型有 udp,icmp,udplite,esp,ah,sctp等
centos7 還支持,icmpv6,mh
iptables -t filter -I INPUT -p icmp -i eth4 -j DROP
iptables -t filter -I INPUT -p icmp ! -i eth4 -j DROP
參數-i ,通常和INPUT 配合,針對某個網卡,使用規則
iptables -t filter -I OUTPUT -p icmp -o eth4 -j DROP
iptables -t filter -I OUTPUT -p icmp ! -o eth4 -j DROP
參數-o, 通常和OUTPUT配合,針對某個網卡,使用規則
(四)擴展匹配條件
參數-m 后面接模塊名稱,如tcp模塊,udp模塊,multiport模塊
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECT iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j REJECT
參數-p tcp -m tcp 用於匹配tcp協議,
--sport 源端口
--dport 目標端口
可以使用冒號,指定一個連續的端口范圍
iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j DROP iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80 -j DROP iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport ! --dports 22,80 -j DROP iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 80:88 -j DROP iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80:88 -j DROP iptables -t filter -A INPUT -p tcp -m multiport --dports 8088,8000:10000 -j DROP
模塊multiport 代替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
參數 --tcp-flags,判斷tcp 頭中的標志位
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT
--syn參數,等價於"--tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN"
專門匹配第一次握手
有個state模塊,-m state --state NEW 該state NEW可以是udp,tcp,icmp等,比--syn適用范圍更廣
(五)更多擴展匹配條件
iprange 模塊 (-m iprange --src-range 192.168.1.127-192.168.1.146)
string 模塊 (-m string --algo bm --string "XXOOstring")
time 模塊
connlimit 模塊
limit 模塊
state模塊
set模塊
iptabels -t filter -I INPUT -m iprange --src-range 192.168.1.127-192.168.1.146 -j DROP iptables -t filter -I OUTPUT -m iprange --dst-range 192.168.1.127-192.168.1.146 -j DROP iptabels -t filter -I INPUT -m iprange ! --src-range 192.168.1.127-192.168.1.146 -j DROP
使用iprange模塊,指定不同的src或者dst IP range
iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j DROP iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo kmp --string "OOXX" -j DROP
使用string模塊,--algo 指定算法,算法可以為 bm,kmp,這是必需的選項
--string 指定需要匹配的字符串
使用ipset來批量添加IP
例如:
#創建一個名為myipset的集合,timeout 0允許新增IP帶時間參數,最大存儲IP數量是1000000 ipset create -exist myipset hash:net family inet hashsize 1024 maxelem 1000000 timeout 0 #添加一個關於ipset myipset的 iptables規則, iptables -I INPUT -m set --match-set myipset src -j DROP #添加IP 1.2.3.4到myset中,並且timeout是3600秒 ipset -exist add myipset 1.2.3.4 timeout 3600
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 2020-05-01 --datestop 2020-05-07 -j REJECT
使用time模塊
--timestart 指定時間范圍開始時間,不可取反
--timestop 指定時間范圍結束時間,不可取反
--weekdays 用於指定星期幾,可取反
--monthdays 用於指定幾號,可取反
--datestart 用於指定日期范圍的開始日期,不可取反
--datestop 用於指定日期范圍的結束日期,不可取反
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
使用connlimit模塊,對連接數量做限制
--connlimit-above 單獨使用此選項時,表示限制每個IP的鏈接數量
--connlimit-mask 此選項不能單獨使用,使用 --connlimit-above選項時,配合此選項,表示針對某IP段內的IP,限制接數量
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
以上事例是兩條命令的組合,一起組合使用,表示每分鍾允許10個包,令牌桶數量為3,多余的包被reject掉
使用limit模塊,對報文的到達速率做限制,如果要限制單位時間內流入包的數量,就能用limit模塊
--limit-burst 此選項用於指定令牌筒的最大數量,令牌筒要裝滿,才可以出去
--limit 此選項用於指定令牌桶中生成新令牌的頻率,
可用的時間單位有second,minute,hour,day
iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPT iptables -t filter -I INPUT -p udp -m udp --dport 137:157 -j ACCEPT iptables -t filter -I INPUT -p udp -m multiport --dport 53,137:157 -j DROP
udp擴展,可以配合--sport,--dport匹配地址,
連續端口可以使用冒號,離散的端口可以配合multiport模塊指定多個端口
iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j DROP iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8 -j DROP iptables -t filter -I INPUT -p icmp -m icmp --icmp-type "echo-request" -j DROP iptables -t filter -I OUTPUT -p icmp -m icmp --icmp-type 0/0 -j REJECT iptables -t filter -I OUTPUT -p icmp -m icmp --icmp-type 0 -j REJECT
以上五行效果相同,表示 可以ping 通別人,但是別人不可以ping 通我,
謙三行針對INPUT設置規則,后兩行針對OUTPUT設置規則
--icmp-type 匹配icmp報文的具體類型
在有-p 情況下,可以省卻-m icmp ,類似的情況有 tcp 和 udp等
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT iptables -t filter -A INPUT -j REJECT
以上三行,需要一起配合使用,才有效果,表示只有回應我們的抱文或者已經建立好鏈接的請求才可以通過防火牆
第二行的意思是允許某個端口的第一次tcp連接請求
iptables -t filter -N IN_WEB
表示在filter表中創建名為IN_WEB的自定義鏈
iptables -t filter -I IN_WEB -p tcp -m multiport --dports 80,8000:10000 -j DROP
給自定義鏈IN_WEB設置規則
iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB
表示在INPUT鏈中引用剛才創建的自定義鏈
iptables -E IN_WEB WEB
表示將IN_WEB自定義鏈重命名為WEB
iptables -X WEB
表示刪除自定義鏈WEB
刪除需要滿足兩個條件
1. 自定義鏈沒有被引用
2. 自定義鏈中沒有任何規則
最好的iptables 規則就是 iptables默認的規則
*filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [60:7140] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m multiport --dports 22,80,8181,3000,5000,8000:10000 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT
請根據具體的情況修改iptables 規則
iptables 中的中括號[]內的數字,例如如下
INPUT ACCEPT [26:2613] FORWARD DROP [0:0] OUTPUT ACCEPT [12:844]
[26:2613] 26是指 26個數據包 2613是指 2613 bytes
[12:844] 12是指 12個數據包 844是指 844 bytes
有些是否你會注意到 INPUT ACCEPT policy 為 [0:0] 因為這里統計的數據包和大小是指沒有被INPUT 規則匹配
沒匹配的數據包會走到默認policy,進而產生數據,也就是在設置了INPUT 規則的情況下,你會看到 INPUT ACCEPT [0:0]
可以通過命令iptables -nvL 查看當前某個鏈的數據包數量和流量大小
service iptables save 之后把當前的數據包數量和流量大小保存到/etc/sysconfig/iptables