centos7-防火牆

    netfilter/iptables是集成在linux2.4.x版本內核中的包過濾防火牆系統。

    該框架可以實現數據包過濾,網絡地址轉換以及數據包管理功能。linux中的防火牆系統包括兩個部分:netfilte和iptables。netfilte可以對本機所有流入、流出、轉發的數據包進行查看、修改、丟棄、拒絕等操作。由於netfilter在內核空間中,用戶通常無法接觸內核和修改內核,此時需要命令行工具,一般使用iptables,firewalld等工具。使用iptables可以添加、刪除具體的過濾規則,iptables默認維護四個表和五個鏈,所有的防火牆策略規則都將被分別寫入表和鏈中。centos7系統防火牆模塊存放在/lib/modules/3.10.0-514.el7.x86_64/kernel/net/netfilter/目錄下,當需要某個模塊功能時,可以通過modprobe加載。

    centos7在原有的netfilter/iptables架構上又增加了firewalld。iptables工具是一個比較低級別的工具,僅可以調整ipv4的防火牆規則,所以在centos7上使用了firewalld作爲默認的用戶防火牆工具,但當用戶使用firewalld編寫ipv4防火牆規則時,firewalld依然是調用了底層的iptables實現具體的功能,只是這個調用過程對用戶是透明的。


一、iptables

    默認的iptables規則表又fileter表(過濾規則表),nat表(地址轉換規則表)、mangle(修改數據標記位規則表)、raw(跟蹤數據表規則表)。每個規則表中包含多個數據鏈:INPUT(入站數據過濾)、OUTPUT(出站數據過濾)、FORWARD(轉發數據過濾)、PREROUTING(路由前過濾)和POSTROUTING(路由後過濾),防火牆規則需要寫入到這些具體的數據鏈中。

以下爲流程

1)外部主機發送數據包給防火牆本機,數據將會經過PEROUTING與INPUT鏈;

2)如果防火牆本機發送數據包到外部主機,數據經過OUTPUT於POSTRTOUTING鏈

3)如果防火牆作爲路由負責轉發數據,則數據經過PEROUTING鏈、FORWARD鏈已經POSTROUTING鏈


iptables的表與鏈的關係如下所示:


1.1 iptables的語法

 iptables定義規則的方式比較複雜:

 格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION

 -t table :3個filter nat mangle

 COMMAND:定義如何對規則進行管理

 chain:指定你接下來的規則到底是在哪個鏈上操作的,當定義策略的時候,是可以省略的

 CRETIRIA:指定匹配標準

 -j ACTION :指定如何進行處理

選項:

-t                      指定需要維護的防火牆規則表,不使用-t時,則默認操作對象爲filter表

-A                     追加防火牆規則

-D                     刪除防火牆規則

-I                       插入防火牆規則

-F                      清空防火牆規則

-L                      列出防火牆規則

-R                      替換防火牆規則

-Z                      清空防火牆數據表統計信息

-P                      設置默認規則


匹配參數:

[!]-p                    匹配協議,!代表取反

[!]-s                     匹配源地址

[!]-d                    匹配目標地址

[!]-o                    匹配入站網卡接口

[!]--sport            匹配源端口

[!]--dport            匹配目的端口

[!]--src-range      匹配目標地址範圍

[!]--dst-range     匹配目標地址範圍

[!]--limit              匹配數據錶速率

[!]--mac-source   匹配源mac地址

[!]--sports            匹配多個源地址

[!]--dports            匹配多個目的地址

[!]--state               匹配狀態(INVALID,ESTABLISHED,NEW,EELATED)

[!]--string              匹配應用層字符串


觸發動作:

ACCEPT                允許數據包通過

REJECT                 拒絕數據包通過

LOG                      將數據包信息記錄syslog日誌

DNAT                   目標地址轉換

SNAT                    源地址轉換

MASQUERADE     地址欺騙

REDIRECT             重定向


iptables防火牆規則的順序非常重要,內核按順序檢查這些規則,如果發現有匹配的股則條目按,則立刻執行相關動作,停止繼續向下查找規則條目,如果所有的防火牆規則都未能匹配成功,

則按照默認策略處理。使用-A選項添加防火牆規則會將該規則追加到整個鏈的最後,而使用-I選項添加的規則則默認會插入到鏈中作爲第一條規則。下面通過實例簡單演示iptables命令的使用方法。

iptables -nL                         #查看filter表的所有規則
iptables -t nat -nL                  #查看nat表所有的規則
iptables -F                          #清空filter表中所有的規則
iptables -A INPUT -s 192.168.0.1 -j DROP         #向filter表中添加一條新的入站規則,丟棄192.168.0.1主機發送給防火牆本機的所有的數據包
iptables -I INPUT -s 192.168.0.22 -p icmp -j REJECT       #向filter表中插入一條新的入站規則,拒絕192.168.0.22 ping
iptables -nL --line-number           #查看錶中防火牆規則並顯示規則編號
iptables -D INPUT 1                  #刪除表中INPUT鏈的第一條規則
iptables -R INPURT 2 ! -s 192.168.0.254 -j REJECT        #替換filter表中INPUT鏈的第二條規則,拒絕192.168.0.254之外的任何主機連接防火牆本機
iptables -t fileter -p INPUT ACCEPT  #修改filte表中INPUT鏈的默認規則爲接收數據包
iptables -I INPUT -s 192.168.0.10 -p tcp --dport 22 -j LOG #將192.168.0.10主機發送給防火牆本機的22端口的所有數據包信息記錄到messages日誌
iptables -I INPUT -i eth1 --p tcp --dport 80 -j ACCEPT     #允許任何主機從eth1網絡接口訪問本機的80端口

 

1.2運用舉例

 1) 允許任意客戶端訪問服務器主機提供的日常服務(HTTP,HTTPS,DNS,NTP,SMTP,POP3,SSH),在linux系統中,/etc/services文件可以找到各種服務所對應的標準端口信息

image.png

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p udp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 143 -j ACCEPT
iptables -A INPUT -p tcp --dport 123 -j ACCEPT
iptables -P INPUT -P INPUT DROP
iptables -P INPUT -p OUTPUT ACCEPT


2)使用SNAT共享上網,服務器作爲軟路由,內部所有的192.168.0.0/24網端內的主機連接外網時,防火牆自動將所有源地址修改爲公網IP,最後互聯網將信息返回給路由後,由路由再轉交給真正的後端主機。防火牆源地址轉換(SNAT)規則需要被寫入到NAT表中的POSTROUTING鏈

vim /etc/sysctl.conf

image.png

systctl -p      #重新加載內核參數配置文件
iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 124.125.199.84    #配置nat表,使用snat方式將源地址段192.168.0.0/24  轉換爲124.125.199.84公網地址


3)配置DNAT,外部網絡公網IP訪問內網業務服務器

sed -i '$a\net.ipv4.ip_forward = 1' /etc/sysctl.conf   #配置文件最後一行添加
systctl -p       #重新加載內核配置文件
iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100   #配置nat表,使用dnat方式,訪問公網地址80端口轉換192.168.0.100
iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.101



4)限制單位時間內數據包的個數,防止網絡***發送大量無效的數據包給服務器,造成服務器無法響應正常的請求包

iptables -I INPUT -m limit --limit 500/sec -j ACCCEPT   #當每秒數據包個數爲500的時候接收入站連接,否則拒絕連接
iptables -P INPURT DROP


5)根據數據連接狀態設置防火牆規則,放行所有的出站數據包,拒絕入站的新連接請求與無效鏈接,放行入站的迴應請求

iptables -F
iptables -A INPUT -m state --state NEW -j DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P OUTPUT ACCEPT


6)防火牆設置規則,記錄192.168.0.1 到192.168.0.22地址段內所有的主機發送給路由要求轉發的數據包,並允許轉發這些數據包

iptables -A FORWARD -m iprange --src-range 192.168.0.1-192.168.0.10 -p tcp --dport 80 -j LOG
iptables -A FORWARD -m iprange --src-range 192.168.0.1-192.168.0.10 -p tcp --dport 80 -j ACCEPT


1.4 iptables備份與還原

    默認的iptables防火牆規則會立刻生效,但是如果不保存,當計算機重啓後,所有的規則將會丟失,所以需要即時保存。

iptables軟件包提供了兩個非常有用的工具,iptables-save和iptables-restore,可以方便的處理大量的防火牆規則。centos7系統中的防火牆規則默認保存再/etc/sysconfig/iptables文件中,使用iptables-save將規則保存至該文件中實現保存防火牆規則的作用,重啓後會自動加載該文件中的規則。如果使用iptables-save將規則保存到其他位置,可以實現備份防火牆規則的作用。當防火牆規則需要做還原時,可以使用iptables-restore將備份文件直接導入當前防火牆規則。

iptables-save > /etc/sysconfig/iptables
iptables-save > firewall.bak
iptables-restore < firewall.bak



二、firewalld

firewalld將所有的網絡流量都分類匯聚到zones中,它通過zones管理防火牆規則,每一個進入系統的數據包,都會首先檢查源IP地址和接口,如果與某個zone匹配,則該zone的規則將生效。而每個zone都會有開啓或關閉服務和端口的列表,以實現允許或拒絕鏈接服務和端口。如果數據包的源IP地址和網卡接口都不能和任何zone匹配,則該數據包將匹配默認zone,一般情況下是一個public的默認zone。firewalld會提供block,dmz,drop,external,home,internal,public,trusted,work這九個zone。比如有一個數據包從eno1網卡進入本機,根據規則進入work這個zone而在work這和zone中有允許訪問http服務的規則,則最後該數據包將可以進入本機並訪問http服務

大部分zone都定義的有自己的允許規則,規則通過端口/協議(631/udp)或者預定義的服務(ssh)這種形式設置,如果數據包沒有匹配這些允許的規則,則該數據包一般會被防火牆拒絕。但是如果有名爲trusted的zone,默認會運行所有的數據流量,如果有一個數據包進入了該zone,則被允許訪問所有的資源。

具體的firwalld預定義zone及其描述信息如下所示:


drop(丟棄):任何接受的網絡數據包都被丟棄,沒有任何回覆,

僅能有發送出去的網絡連接(數據包不能進來,但是可以出去)


block(限制):任何接受的網絡連接都被IPv4的icmp-host-prohibited信息和IPv6的icmp6-adm-prohibited信息所拒絕。(和drop相比,比較寬鬆一些,主要是爲了針對icmp)


piblic(公共):在公共區域內使用,不能相信網絡內其他計算機不會對你造成危害,只能接受經過選取的連接。


external(外部):特別是爲路由器啓用了僞裝功能的外部網,你不能信任來自網絡的其他計算,不能相信他們不會對你造成傷害,只能接受經過選擇的連接。


dmz(非軍事區):用於你的非軍事區內的電腦,此區域可公開訪問,可以有限的進入你的內部網絡,僅僅接受經過選擇的連接。


work(工作):用於工作區,你可以基本信任網絡內的其他電腦不會對你造成危害,僅僅接收經過選擇的連接。


home(家庭):用於內部網絡,你可以基本上信任網絡內其他電腦不會對你造成危害,僅僅接收經過選擇的連接。


internal(內部):用於內部網絡,你可以基本上信任網絡內其他電腦不會對你造成危害,僅僅接收經過選擇的連接。


trusted(信任):可接受所有的網絡連接。


2.1 firewalld-cmd命令

   可以使用firewall-cmd命令來管理防火牆規則,語法格式如下:

  用法:

firwall-cmd [OPTIONS....]

選項:

--get-default-zone                        獲取默認zone信息

--set-default-zone=<zone>          設置默認zone

--get-active-zones                          顯示當前正在使用的zone信息

--get-zones                                       顯示系統預定義的zone

--get-zone-of-interface=<interface>      查詢某個接口與哪個zone匹配

--get-zone-of-source=<source>[/<mast>/]        查詢某個源地址與哪個zone匹配

--list-all-zones                                            顯示所有的zone信息的所有規則

--add-service=<service>                            向zone中添加允許訪問的服務

--add-port=<portid>[-<portid>]/<protocol>       向zone中添加允許訪問的端口

--add-interface=<interface>                        將接口與zone綁定

--add-source=<source>[/<mask>/]            將源地址與zone綁定

 


--list-all                                         列出某個zone所有的規則信息

--remove-service=<service>       從zone中移除允許某個服務的規則

--remove-port=<portid>[-<portid>]/<protocol>            從zone中移除允許的某個端口規則

--remove-source=<source>[/<mask>]            將源地址與zone解除綁定

--remove-interface=<interface>                     將網卡接口與zone接觸綁定

--permanent                                                      設置永久有效的規則,默認的情況規則都是臨時的

--reload                                                            重新加載防火牆規則

firewall-cmd --get-default-zone            #查看默認zone,爲public
firewall-cmd --set-default-zone=trusted     #設置默認zone爲trusted
firewall-cmd --get-active-zones            #顯示當前正在使用的zone信息

image.png

firewall-cmd --get-zones                    #顯示系統預定義的zone,默認爲九個zone

image.png

firewall-cmd --get-services                #顯示系統預定義的服務名稱

image.png

firewall-cmd --get-zone-of-interface=ens192                #查詢接口匹配的zone

image.png

firewall-cmd --list-all-zones                        #顯示所有的zone以及對應的規則信息

image.png

firewall-cmd --add-service=ftp --zone=public                    #public中添加允許訪問ftp服務的規則
firewall-cmd --remove-service=ftp --zone=public                 #public中刪除允許訪問ftp服務的規則
firewall-cmd --add-port=3306/tcp --zone=public                   #public中添加允許訪問3306服務的規則
firewall-cmd  --remove-port=3306/tcp --zone=public                                     #public中刪除允許訪問3306服務的規則
firewall-cmd  --add-interface=eno1 --zone=public                                       #將網卡eno1與public綁定,流量接入該接口匹配public規則
firewall-cmd  --remove-port=eno1 --zone=public                                          #將網卡eno1與public解綁定
firewall-cmd  --add-source=1.1.1 --zone=public                                           #將源地址1.1.1.1與public綁定,以後該主機訪問本機時匹配public中的規則
firewall-cmd  --list-all --zone=public                                                   #查看public中這個zone的規則列表
firewall-cmd  --permanet --add-port=3306/tcp --zone=public                               #public中添加一條永久規則
firewall-cmd  --reload                                                                    #重啓防火牆

    


一般在實際運維中,我們主要使用 iptables做爲防火牆,將firewalld服務禁用,避免干擾

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章