iptables詳解


 IPTABLES

1、容器:包含或者說屬於的關系

 

2、Netfilter/iptables是表的容器,iptables包含的各個表

filter,NAT,MANGLE,RAW)

 

3、iptables的表tables又是鏈的容器

chains:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING

 

4、鏈chains是規則容器:

 

5、規則Policy:一條條過濾的語句。

lsmod |egrep "nat|filter"

modprobe ip_tables

modprobe iptable_filter

modprobe iptable_nat

modprobe ip_conntrack

modprobe ip_conntrack_ftp

modprobe ip_nat_ftp

modprobe ipt_state

 

iptables -F  //清除所有規則,不會處理默認的規則。

iptables -X  //刪除用戶自定義的鏈。

iptables -Z  //鏈的記數器清零。

 

 

什么是表tables?

表是鏈的容器,即所有的鏈都屬於其對應的表,如果把Netgilter看成是某小區的一棟樓,那么表就是樓里的其中一套房子 

什么是鏈chains?

鏈chains是規則policys的容器,如果把表當做一套房子,那么鏈就可以說是房子里的家具、櫃子等

什么是規則Policy?

規則policy就比較容易理解了,就是iptables一系列過濾信息的規范和具體方法條款了,可以理解為櫃子如果增加並擺放櫃子東西等

 

 

iptable表和鏈的關系

 

 

 

 

FILTER表:

 

 iptables -L  -n  查看filter表

 iptables -L  -n  -t nat 查看fnat表

 

 

nat表

 

 

 

 

iptables工作流程

 

 

 數據包的流向是從左向右的!

小結…

1、防火牆是層層過濾的。實際是按照配置規則的順序從上到下,從前到后進行過濾的。

2、如果匹配上規則,即明確表明是阻止還是通過,數據包就不在向下匹配新規則了。

3、如果所有規則中沒有明確表明是阻止還是通過,也就是沒有匹配規則,向下進行匹配, 直到匹配默認規則得到明確的阻止還是通過。

4、防火牆默認規則是所有的規則執行完才會執行的。

 

 

iptables表和鏈的工作流程圖

 

 

簡化后的

 

命令學習:

1.1、查看是否安裝成功

命令:systemctl status iptables

1.2、安裝iptables

yum install iptables-services

檢查是否安裝成功

systemctl status iptables

 

啟動iptables

systemctl start iptables.service

 

1.5、關閉SELINUX

在CentOS7 下由於SELINUX的開啟會導致很多系統服務和驅動不兼容,所以建議大家關閉SELINUX,我們可以通過修改配置文件的方式關閉SELINUX

命令:vi /etc/selinux/config

 

 

iptables -L -n 默認查看filter表
[root@localhost shell]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

 

 lsmod | egrep "nat|filter" 默認加載的內核模塊

[root@localhost shell]# lsmod | egrep "nat|filter"
nf_nat_masquerade_ipv4    13412  1 ipt_MASQUERADE
iptable_nat            12875  1
nf_nat_ipv4            14115  1 iptable_nat
nf_nat                 26787  2 nf_nat_ipv4,nf_nat_masquerade_ipv4
nf_conntrack          133387  5 nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4
ebtable_filter         12827  0
ebtables               35009  1 ebtable_filter
ip6table_filter        12815  0
ip6_tables             26901  1 ip6table_filter
iptable_filter         12810  1
ip_tables              27115  3 iptable_filter,iptable_mangle,iptable_nat
libcrc32c              12644  3 xfs,nf_nat,nf_conntrack

 

加載如下模塊到內核

 

 

 

iptables -F  清除防火牆 不會清除默認

iptables  -X 是刪除用戶自定義的鏈

iptables -Z 把 chain 或者所有 chain(當未指定 chain 名稱時)的包及字節的計數器清空

 

 

iptables 規則中各指令(command)的含義:

各種指令如下。既可以使用長指令,也可以使用短指令字母,例如,

iptables --append chain firewall-rule
等價於
iptables -A chain firewall-rule

另外,指令后面所帶的參數/選項,如果以 [ ] 包括,則表示該參數/選項可省略(有缺省值)。

--APPEND,-A

指令形式:

iptables -A chain firewall-rule
-A chain – 指定規則應該添加到的 chain 的名稱。例如,使用 INPUT 將會把規則添加到默認的 INPUT(入站)鏈的末尾,而使用 OUTPUT 則會將規則添加到出站鏈的末尾。
firewall-rule – 包含各種參數選項的防火牆規則,一次一條規則
“-A” 的意思是附加(append),並不是添加(Add)的意思。它是將規則添加到已有的防火牆鏈(chain)的末尾的操作指令。這是特別重要的,因為規則在 iptables 中的位置非常重要,所以千萬要記住, -A 的意思是將規則添加到末尾。因為一般情況下 iptables 中最后一條規則是丟棄所有數據包。如果你已經有了一條這樣的規則,使用 -A 參數添加的規則將會在丟棄規則之后,以至於新規則根本無法起作用。如果要插入到中間位置,需要用 -I 指令。

 

--DELETE,-D
從 chain 中刪除與指定規則匹配,或指定編號的條目。

指令形式:

iptables -D chain firewall-rule
表示從 chain 中刪除對應規則 firewall-rule 的那一條目。這種形式刪除規則比較麻煩,通常用下面的形式

iptables -D chain rulenum
刪除 chain 中編號為 rulenum 的那條規則。1 表示第一條。

--INSERT,-I

指令形式:

iptables -I chain [rulenum] firewall-rule
將 firewall-rule 添加為 chain 中的第 rulenum 條規則,原先的第 rulenum 條及以后各條的需要順次 +1。如上面一樣,1 表示該 chain 中第一條。默認為 1,即,如果沒有指定 rulenum 則將該 chain 中第一條規則替換掉。

--REPLACE,-R

指令形式:

iptables -R chain [rulenum] firewall-rule
將 chain 中原來的第 rulenum 條規則替換為 firewall-rule。如果沒有指定 rulenum,則替換該 chain 中第一條。

--LIST,-L

指令形式:

iptables -L [chain [rulenum]]
列出 chain 或者所有 chain(當未指定 chain 名稱時)中的 第 rulenum 條規則或者所有規則(當未指定 rulenum 時)。不過要注意,如果未指定 chain 則不能帶 rulenum 參數。

如果在 -L 后再加上 –line-numbers,則表示在每條規則前面顯示序號。如,iptables -L --line-numbers


--LIST-RULES,-S

指令形式:

iptables -S [chain [rulenum]]
打印出 chain 或者所有 chain(當未指定 chain 名稱時)中的 第 rulenum 條規則或者所有規則(當未指定 rulenum 時)。不過要注意,如果未指定 chain 則不能帶 rulenum 參數。

--FLUSH,-F

指令形式:

iptables -F [chain]
清空 chain 或所有 chain (當未指定 chain 名稱時)中的規則。

--ZERO,-Z

指令形式:

iptables -Z [chain [rulenum]]
把 chain 或者所有 chain(當未指定 chain 名稱時)的包及字節的計數器清空。

--NEW,-N

指令形式:

--new -N chain
創建一個名稱為 chain 的新鏈。

--DELETE-CHAIN,-X

指令形式:

iptables -X [chain]
刪除用戶自定義 chain 或者所有用戶自定義 chain(當未指定 chain 名稱時)。該指令不影響預設規則(如 INPUT、OUTPUT、FORWARD 等)。

--POLICY,-P

指令形式:

iptables -P chain target
改變 chain 的策略為 target。

--RENAME-CHAIN,-E

指令形式:

iptables -E old-chain new-chain
將 old-chain 名稱更改為 new-chain。這樣做可以使所有引用 old-chain 的規則失效。

 

iptables 規則中各參數的含義:

-P 代表協議(PROTOCOL)

指明當前規則針對的傳輸協議(如 TCP、UDP、ICMP 等)
可能的參數值有:tcp, udp, icmp, all
使用 “all” 表示適用於所有協議。而如果在規則中不指定 -p 參數,則默認使用 “all” 參數。一般不使用 “all” 這個值,要么指定某個特定的協議,要么就指定 -p 參數。
-p 的參數值既可以用名稱(如 tcp)也可以用協議對應的數值(如 6 代表 tcp 協議)
/etc/protocols 文件中包含了所有允許的協議名稱和相應數值
也可以用長的參數名 --protocol

-S 代表源地址(SOURCE)

指定數據包的源地址
可以是 ip 地址,或者網絡地址,或者主機名(hostname)
例如:-s 192.168.1.101 表示針對特定的 ip 地址
對於網絡掩碼,使用 /mask。例如,“-s 192.168.1.0/24″ 表示網絡掩碼為 255.255.255.0 的所有 192.168.1.x 地址都匹配。
如果不指定 -s 參數,默認匹配所有源地址
也可以用長參數名 --src 或者 --source

-D 代表目的地址(DESTINATION)

指定數據包的目的地址
使用方式與上面的 “-s” 一樣(不同之處僅在於 -s 指源,而 -d 表示目的地址)
也可以用長參數名 --dst 或者 --destination

-J 代表跳轉(TARGET)

j 的意思是 “jump”(跳轉) 到目標
指定當某個數據包滿足該規則的時候的就跳轉到的下一個處理規則,而不再順序執行后面的規則判斷
可能的值有:ACCEPT, DROP,REJECT, QUEUE, RETURN,分別表示接受、丟棄、拒絕、進入隊列,返回(跳出,通常是從某個 chain 中跳回到調用該 chain 的上層 chain)
也可以跳轉到某個自定義的 chain 中,使用該 chain 的名稱做為跳轉目標(DROP好於REJECT)

-I 代表 IN INTERFACE(入站接口)

i 表示 “input interface”(輸入接口,即,指定網絡數據處理的網卡,一般 eth0 即表示第一塊有線網卡的外網接口,lo 表示局域網接口)
可以直接理解為 “-i” 表示接口。不過,-i 和 -o 都表示接口,-i 表示輸入時的接口,而 -o 特指輸出用的接口。
指定數據包進入 INPUT、FORWARD 和 PREROUTING 鏈時經由的接口。
例如:-i eth0 表示該規則應該針對從 eth0 接口進來的數據包。
如果不指定 -i 參數,則經由系統中所有可用的接口進入的數據包都可以匹配該規則。
也可以使用長參數 –in-interface

 

-A 代表 IN INTERFACE(入站接口)

同上面-I類似

 -A  是添加規則到指定鏈的結尾、最后一條。

 -I 是添加規則到指定鏈的開頭,第一條。

 

-O 代表 OUT INTERFACE(出站接口)

o 表示 “output interface”(出站經由接口)
指定發送出去的數據包進入 INPUT、FORWARD 和 PREROUTING 鏈時經由的接口。
如果不指定 -o 參數,則經由系統中所有可用的接口發出的數據包都可以匹配該規則。
也可以使用長參數 --out-interface

 

其它防火牆參數選項

上面某些防火牆參數還有屬於它自己的參數選項,可以與其配合使用。下面是一些常用的選項。

要使用這些參數選項,需要指定相應的參數,例如,要使用 “--sport” 選項,應該在規則中指定 “-p tcp” (或者 “-p udp”)等參數。

注意:所有這些選項前面都是 --(2個短橫線 -- )。

--SPORT 表示 SOURCE PORT (源端口,用於 -P TCP, 或者 -P UDP)

默認匹配所有端口(未特別指定時)
可以指定端口號(數字),也可以指定端口名稱。例如,默認的 SSH 端口號碼為 22,名稱為 ssh,可以表示為 “–sport 22″ 或者 “–sport ssh”。
/etc/services 文件包含了所有允許的端口名稱和對應的端口號碼。
在規則中使用號碼比使用名稱要好(效率高些)
要匹配一個端口范圍,使用英文半角冒號(:),如 22:100 匹配從 22 到 100 的所有端口號。
也可以使用長名稱 --source-port

--DPORT 表示 DESTINATION PORT (目的端口,-P TCP, 或者 -P UDP)

與 –sport 的用法相同,區別僅在於對象是目的端口
也可以使用長名稱 –destination-port

--TCP-FLAGS 表示 TCP FLAGS (用於 -P TCP)

可以使用英文半角逗號(,)來指定多個 TCP 狀態標識
可能值有:SYN, ACK, FIN, RST, URG, PSH。可以全用,也可以不用。

--ICMP-TYPE 表示 ICMP TYPE (ICMP 類型,用於 -P ICMP)

當使用 icmp 協議 “-p icmp” 的時候,可以使用 “–icmp-type” 特別指定 ICMP 類型
例如,使用 “–icmp-type 0″ 表示 “Echo Reply”,“–icmp-type 8″ 表示 “Echo”。

 

------------------------------------------------------------------------------------------------------------------------

 eg1:禁止掉當前SSH端口,這里是22

iptables -t filter -A INPUT -p tcp --dport 22  -j DROP  

 

eg2:刪除上面規則

iptables  -A INPUT -p tcp --dport 22 -j DROP

 

其它刪除方法-根據序號刪除

 

iptables -L -n --line-numbers 規則加序號 清除規則方便
iptables -t filter -D INPUT 1 根據序號刪除
 
[root@ipt ~]# iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         
[root@ipt ~]#  iptables -t filter -D INPUT 1 

 

 

 

自定義規則順序:

 

 

封端口:

 

封ip:

 

封網段:

iptables -t filter -A INPUT -i eth0 -s 10.0.0.0/24 -j DROP

 

測試配置拒絕規則也是匹配:

下面的測試有兩個要點:非的作用,匹配拒絕也是匹配

iptables -t filter -A INPUT -i  eth0 ! -s 10.0.0.115 -j DROP

 

iptables -t filter -A INPUT -i  eth0 ! -s 10.0.0.115 -j ACCEPT

 

 

原地址不是10.0.0.101單個ip的禁止鏈接(ping命令)

 

 

 匹配指定協議外的所有協議

iptables -A INPUT -p  ! tcp

iptables -I INPUT ! -p tcp -s 10.0.0.123 -j DROP

 

 

匹配主機源ip

iptables  -A  INPU -s  10.0.0.14

iptables  -A  INPU  !  -s  10.0.0.14

 

匹配網段:

iptables  -A  INPU -s  10.0.0.0/24

iptables  -A  INPU  !  -s  10.0.0.0/24

 

匹配單一端口:

 

 

 

匹配指定端口之外的端口

 

 

匹配端口范圍:

 

 

 

 

 

匹配網絡狀態

 


免責聲明!

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



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