您好,登錄后才能下訂單哦!
什么是防火墻
隔離本地網絡與外界網絡之間的一道防御系統,通俗的說,防火墻就是防火的墻,主要目的就是隔離火并建立安全區域,所以防火墻對于互聯網或計算機而言可能是工作在主機或網絡的邊緣(計算機的邊緣可能是一塊網卡,而網絡邊緣可能是路由),對于進出數據的報文事先定義好的規則中的標準進行檢查、監控,一旦符合標準的話,我們就采取由這個規則定義的處理動作,我們稱為主機防火墻或網絡防火墻。
Linux的網絡防火墻:
有兩組框架,實現防火功能的主要是netfilter,
Netfilter:是內核中的過濾框架,是網絡過濾器
Iptables:是一個生產防火規則的并且能夠將其附加在netfilter上,真正實現數據報文過濾的工具,當然這只是其中的一種功能,NAT、mangle等規則生成的工具。而它本身并不能防火,真正起到防火墻功能的是規則,規則只有放到netfilter上才能生效。規則包括處理標準和處理辦法防火墻可以是硬件也可以是軟件,無論硬件還是軟件需要定義規則之后,讓其生效,才能真正工作起來工作域
netfilter工作在內核空間(可以放規則的位置),iptables工作在用戶空間,可以寫規則,通過系統調用將規則放置在與它對應的位置上,只有生效以后這個應用程序就沒有用處了
1. 鏈到表的演化
ipfw-->ipchains-->iptables
每一個鏈看做每一列的演化
iptables/netfilter:網絡過濾器
netfiler:kernel中啟用的時才具有作用
hookfunction(鉤子函數):或稱為鏈
以理解為把某一個目標端口進程勾選出來,進行過濾規則的匹配
wKioL1ce-3qysfRNAACDSFO5xZw518.jpg
wKiom1ce-uOjVVwnAAcgYH62j1I503.png
[擴展]:使用參考,使用man,對于iptables來講,是一個多模塊的命令,可以使用maniptables;man iptables-extensions
iptables
防火墻功能的實現主要根據其中的一些規則,而這些規則的實現就是由iptables這個工具來寫入的
報文流向
(1) 從外部到主機內部—>流入
(2) 本機內部的報文到外面的—>流出
(3) 報文的轉發
只要有報文經過,它必須要從其中的一個位置經過,而路由表中的目標IP可以判定它應該走哪條路這叫路由決策,路由決策發生在一個報文被本機的網卡接收進來以后,送到TCP/IP協議棧上的那一刻就要做出路由決策。上面三種流向是工作在TCP/IP協議棧上的三個鉤子函數,任何一個報文經過其中的任何一個流向時都會被檢查一遍如果被其中的某條規則匹配到,就會執行其中的處理方法
hook:鉤子函數,自上而下逐個檢查。五個規則:
prerouting:路由之前
input:本地進來
output:本地出去
forward:轉發
postrouting:路由之后
而這每個規則組合起來就是一個鏈,叫規則鏈,每一個鉤子對應的函數都應該有一個鏈
五個規則鏈:
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
wKiom1ce-3CydLNNAAFPBoC38FU548.jpg
iptables結構:
wKiom1ce-7iicyKiAABrr3KcSVA460.jpg
Iptables內置鏈與自定義鏈
內置鏈:(大寫):對應于一個鉤子函數
PREROUTING,INPUT,FORWARD,OUTPUT, POSTROUTING
自定義鏈:
可以使用自定義的鏈,但只能在被調用時才能發揮作用,而且如果沒有被自定義鏈中的任何規則匹配,還應該有返回機制;用戶可以刪除自定義的空鏈,默認鏈無法刪除。每一條規則 都有兩個內置的計數器,一個記錄被匹配的報文個數,另一個記錄被匹配的報文大小之和 ;
Iptables規則的運作模式
wKiom1ce--KgC8JxAADDIH1CWGQ393.jpg
路由功能發生的時刻
報文進入本機后:
判斷目標主機是否為本機?
是:input
否:forward
wKioL1ce_NmQOQ1cAABvjZOtC4E327.jpg
報文離開本機之前:
判斷經由哪一個接口送往下一跳?
Iptables的規則:
組成部分:根據規則的匹配條件嘗試匹配報文,對匹配成功的報文根據規則定義的處理動作做出處理
匹配條件:
基本匹配:
擴展匹配:
處理動作:
基本處理動作
擴展處理動作
自定義處理動作
iptables添加規則時的考量點:
1、 要實現何種功能:判斷添加規則至哪個表上
2、 報文流經的位置:判斷添加規則至那個鏈上
IP首部
wKiom1ce_D3SetbRAADxM52lB10026.jpg
Iptables規則實現命令
防火墻開機處理模式
不同版本系統上的開機自啟方式
Centos7
~]# Systemctl stop firewalld.service
~]# Systemctl disabled fireealld.service
Centos6
~]# Service iptables stop
~]# Chkconfig iptables off
Iptables規則命令語法
命令格式:iptables [-ttable] SUBCOMMAND chain(鏈) [matches…] [-j target]
參數:
–t table:表示要操作的表
四個:Raw,mangle,nat,filter
SUBCOMMAND:操作的命令
Chain:要操作的鏈
Match:匹配的條件,可以是多個
-j:指定匹配到以后的執行動作
鏈管理:
-N:new 新增一條自定義鏈
Iptables –N testchain(添加一個空鏈(引用計數為0))
Iptables –nL查看
[root@bogon ~]# iptables -Ntestchain
[root@bogon ~]# iptables -nL
ChainINPUT (policy ACCEPT)
target prot opt source destination
ChainFORWARD (policy ACCEPT)
target prot opt source destination
ChainOUTPUT (policy ACCEPT)
target prot opt source destination
Chaintestchain (0 references)
target prot opt source destination
-X:delete,刪除自定義的空鏈
[root@bogon ~]# iptables -Xtestchain
[root@bogon ~]# iptables -nL
ChainINPUT (policy ACCEPT)
target prot opt source destination
ChainFORWARD (policy ACCEPT)
target prot opt source destination
ChainOUTPUT (policy ACCEPT)
target prot opt source destination
-P:policy,<鏈名><動作>設置某個鏈的默認規則
默認的策略有以下幾種:
ACCEPT:接受
Drop:丟棄
Reject:拒絕
[root@localhost ~]# iptables-t filter -P FORWARD DROP
設置filter表的默認規則是DROP
注意:當數據包沒有被規則列表里的任何規則匹配到時,按此默認規則的處理,動作前面不能加-j,這也是唯一一種匹配動作前面不加-j的情況
[擴展]如果把Input為drop的話遠程連接不上,解決方案:寫一個@定時(周期)計劃,清除規則
現象:全部改為drop遠程以及ping都連接不上但是22號ssh端口仍然在監聽
-E:rename 重命名自定義的未被引用(引用計數為0)的鏈
[root@bogon ~]# iptables -Ntestchain
[root@bogon ~]# iptables -Etestchain mychain
[root@bogon ~]# iptables -nL
ChainINPUT (policy ACCEPT)
target prot opt source destination
ChainFORWARD (policy ACCEPT)
target prot opt source destination
ChainOUTPUT (policy ACCEPT)
target prot opt source destination
Chainmychain (0 references)
target prot opt source destination
[root@bogon ~]#
規則管理:
-A :append 追加一條規則,(默認是放在最后)
[root@localhost ~]# iptables–t filter –A INPUT –j DROP
在filter表的input鏈里追加一條規則,(作為最后一條規則,匹配所有訪問本機ip的數據包,匹配到的丟棄)比如ssh登錄的偽終端也被終止
-I :insert <鏈名> [規則號碼] 插入一條規則
[root@localhost ~]# iptables -IINPUT -j DROP
在filter表的INPUT鏈里插入一條規則(插入成第一條)
[root@localhost ~]# iptables -IINPUT 3 -j DROP
在 filter 表的 INPUT 鏈里插入一條規則(插入成第 3 條)
注意: 1、-t filter 可不寫,不寫則自動默認是 filter 表
2、-I 鏈名 [規則號碼],如果不寫規則號碼,則默認是 1
3、確保規則號碼 ≤(已有規則數 + 1),否則報錯
-D <鏈名> <規則號碼|具體的規則內容>
Delete 刪除一條規則
[root@localhost ~]# iptables–D INPUT 3
(按照號碼匹配)刪除filter表INPUT鏈中第三條規則
注意:刪除3號后,原來的四號此時變成3號
[root@localhost~]#iptables–D INPUT –s 192.168.1.1 –jDROP
(按照內容匹配)刪除filter表INPUT鏈中內容為“–s 192.168.1.1 –j DROP”的規則(不管其位置在哪里)
注意:.
1、若規則列表中有多條相同的規則時,按內容匹配只刪除序號最小的一條
2、按號碼匹配刪除時,確保規則號碼≤已有規則數,否則報錯
3、按內容匹配刪除時,確保規則存在,否則報錯
-R :<鏈名><規則號碼><具體規則內容>
Replace 替換一條規則
[root@localhost ~]# iptables –RINPUT 3 –j ACCEPT
將原來編號為3的規則內容替換為“–j ACCEPT”
注意:確保規則號碼<=已有規則數,否則報錯
-F :[鏈名]
Flush 清空規則
[root@localhost ~]# iptables –FINPUT
清空filter 表INPUT 鏈中的所有規則
[root@localhost ~]# iptables –tNET –F FORWARD
清空nat 表PREROUTING 鏈中的所有規則
-Z :zero 置零
Iptables的每條規則都有兩個計數器:
有本規則匹配到的所有的packets
由本規則匹配到的所有的bytes
-S顯示指定鏈上的所有的規則
[root@localhost ~]# iptables-t filter -S INPUT
-P INPUT ACCEPT
顯示的是命令的格式
查看:(不能改變順序)
-L:[鏈名]
List 列出規則
-n:numeric表示只顯示IP地址和端口號碼,不顯示域名和服務名[不反解]
[root@localhost ~]# iptables-L INPUT
Chain INPUT (policyACCEPT)
target prot opt source destination
-v:verbose,詳細信息(v越多,顯示的越詳細)
[root@localhost ~]# iptables -vLINPUT
Chain INPUT (policyACCEPT 454 packets, 44317 bytes)
pkts bytes target prot opt in out source destination
[root@localhost ~]# iptables -vvvLINPUT
Chain INPUT (policyACCEPT 478 packets, 46257 bytes)
pkts bytes target prot opt in out source destination
libiptcvlibxtables.so.10. 632 bytes.
Table `filter'
Hooks:pre/in/fwd/out/post = ffffffff/0/98/130/ffffffff
Underflows:pre/in/fwd/out/post = ffffffff/0/98/130/ffffffff
Entry0 (0):
SRCIP: 0.0.0.0/0.0.0.0
DSTIP: 0.0.0.0/0.0.0.0
Interface:`'/................to `'/................
Protocol: 0
Flags: 00
Invflags: 00
Counters: 478packets, 46257 bytes
Cache: 00000000
Target name: `' [40]
verdict=NF_ACCEPT
Entry 1 (152):
SRC IP: 0.0.0.0/0.0.0.0
DST IP: 0.0.0.0/0.0.0.0
Interface: `'/................to`'/................
Protocol:0
Flags:00
Invflags:00
Counters:0 packets, 0 bytes
Cache:00000000
Targetname: `' [40]
verdict=NF_DROP
-x:exactly,在v的基礎上,禁止自動的單位換算
[root@localhost~]# iptables -vxL INPUT
ChainINPUT (policy ACCEPT 559 packets, 53847 bytes)
pkts bytes target prot opt in out source destination
--line-numbers:顯示鏈上的規則的編號;
Iptables –nL(n:表示以數字格式顯示地址和端口)
組合:-nvL
[root@localhost~]# iptables -L INPUT --line-numbers
ChainINPUT (policy ACCEPT)
num target prot opt source destination
列出filter表中所有的鏈及所有的規則
Iptables –t NAT–vnL:
用詳細方式列出nat 表所有鏈的所有規則,只顯示IP 地址和端口號
Iptables –t NAT –vnL PREROUTING:用詳細方式列出nat 表PREROUTING 鏈的所有規則以及詳細數字,不反解
匹配條件: [!]表示可以取反
基本匹配:netfilter自帶的匹配機制
[!] -s, <匹配源地址>
可以是ip,NET,DOMAIN,也可以是空(空表示任何地址)
[root@localhost~]# iptables -t filter -A INPUT -s 192.168.0.0/16 -j ACCEPT
[root@localhost~]# iptables -t filter -vnL
ChainINPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
6 428 ACCEPT all -- * * 192.168.0.0/16 0.0.0.0/0
ChainFORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
ChainOUTPUT (policy ACCEPT 4 packets, 528 bytes)
pkts bytes target prot opt in out source destination
在filter表的INPUT鏈最后追加一條接受匹配來自172.18.0.0/16網絡的數據包
[!] –d <匹配目的地址>
可以是ip,NET,DOMAIN,也可以是空(空表示任何地址)
[root@localhost~]# iptables -A OUTPUT -d 192.168.1.1/16 -j ACCEPT
[root@localhost~]# iptables -t filter -vnL
ChainINPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
133 10048 ACCEPT all -- * * 192.168.0.0/16 0.0.0.0/0
ChainFORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
ChainOUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
4 576 ACCEPT all -- * * 0.0.0.0/0 192.168.0.0/16
在filter表的OUPUT鏈最后追加一條匹配接受去往172.18.0.0/16網絡的數據包
Iptables –A OUTPUT –d www.linuxedu.top匹配去往www.linuxedu.top的數據包
[!] -i, --in-interface name 限制報文流入的接口,只能用于prorouting,input及forward
[!] -o, --out-interface name限制報文流出的接口,只能用于output,forward,及postrouting
擴展匹配:經由擴展模塊引入的匹配機制,-m matchname
隱式擴展:可以不用使用-m選項專門加載相應的模塊,前提是要使用-P選項可匹配何種協議
[!]-p <匹配協議類型>
可以指明只開放某一種協議
協議:tcp,udp,icmp,icmpv6,esp,sh,sctp,mh or <空>
自己ping別人:出去的是8,回來的是0
別人ping自己:進來的是8,出去的是0
0:echo-replay回顯應答
8:echo-request回顯請求
[!] –sport<匹配源端口>
可以是個別端口,也可以是端口范圍
--sport 1000 匹配源端口是1000的數據包
--sport 1000-3000匹配源端口是1000-3000的端口
--sport :3000 匹配源端口是小于3000的端口
--sport 1000: 匹配源端口是大于1000的端口
[!]--dport <匹配目的端口>
可以是個別端口,可以是端口范圍
例如:
--dport 80 匹配目的端口是80 的數據包
--dport 6000:8000 匹配目的端口是6000-8000 的數據包(含6000、8000)
--dport :3000 匹配目的端口是3000 以下的數據包(含3000)
--dport 1000: 匹配目的端口是1000 以上的數據包(含1000)
注意:--sport 和--dport 必須配合-p 參數使用
匹配組合:
1、端口匹配
-p udp --dport 53
匹配網絡中目的端口是53 的UDP協議數據包
2、地址匹配
-s 10.1.0.0/24 -d 172.17.0.0/16
匹配來自10.1.0.0/24 去往172.17.0.0/16 的所有數據包
3、端口和地址聯合匹配
-s 192.168.0.1 -d www.abc.com -p tcp --dport80
匹配來自192.168.0.1,去往www.abc.com 的80 端口的TCP協議數據包
注意:
1、--sport、--dport 必須聯合-p 使用,必須指明協議類型是什么
2、條件寫的越多,匹配越細致,匹配范圍越小
處理動作”
-j targetanme [per-target-iptions]
ACCEPT:通過,允許數據包通過本鏈而不攔截它,類似Cisco 中ACL 里面的permit
Iptables –A INPUT –j ACCEPT:允許所有訪問本機IP 的數據包通過
DROP:丟棄,阻止數據包通過本鏈而丟棄它,類似Cisco 中ACL 里的deny
Iptables –A FORWARD –s 172.18.0.1/16 –j DROP阻止來源地址為192.168.80.39 的數據包通過本機
REJECT
RETURN|:返回調用的鏈
REDIRECT:端口重定向
LOG:日志
MARK:防火墻標記
DNAT:目標地址轉換
-j DNAT --to IP[-IP][:端口-端口](nat 表的PREROUTING 鏈)
目的地址轉換,DNAT 支持轉換為單IP,也支持轉換到IP 地址池(一組連續的IP 地址)
例如:
iptables -t nat -A PREROUTING -i ppp0 -p tcp--dport 80 -j DNAT --to 192.168.0.1
解釋:把從ppp0 進來的要訪問TCP/80 的數據包目的地址改為192.168.0.1
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 81 -jDNAT --to 192.168.0.2:80
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -jDNAT --to 192.168.0.1-192.168.0.10
SNAT:源地址轉換
-j SNAT --to IP[-IP][:端口-端口](nat表的POSTROUTING 鏈)源地址轉換,SNAT 支持轉換為單IP,也支持轉換到IP 地址池(一組連續的IP 地址)
例如:
iptables -t nat -A POSTROUTING -s192.168.0.0/24 -j SNAT --to 1.1.1.1
將內網192.168.0.0/24 的原地址修改為1.1.1.1,用于NAT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24-j SNAT --to 1.1.1.1-1.1.1.10
同上,只不過修改成一個地址池里的IP
MASQERADE:地址偽裝
-j MASQUERADE
動態源地址轉換(動態IP 的情況下使用)
例如:
iptables -t nat -A POSTROUTING -s192.168.0.0/24 -j MASQUERADE
將源地址是192.168.0.0/24 的數據包進行地址偽裝
匹配條件:
顯示擴展
Multiport:多端口匹配
以離散方式死你故意多端口匹配,最多可以指定15個端口,但是必須與-p參數一起使用
Iptables –A INPUT –p tcp –m multiport–dports 21,22,25,80,110 –j ACCEPT
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。