iptables 教程,iptables 詳解,iptables 常見使用實例


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








免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM