防火牆是具備很好的保護做用。***者必須首先穿越防火牆的安全防線,才能接觸目標計算機。在公司裏數據安全是最重要的,要求安所有門進行全公司進行服務器防火牆安全搭建,在原有的基礎上進行安全的防火牆設置,有效避免安全隱患等問題,建議你們仍是花個十多分鐘好好看一下防火牆的理論,這樣便於後期問題排查,最後一小節有經常使用命令操做。docker
防火牆是指設置在不一樣網絡或網絡安全域之間的一系列部件的組合,它能加強機構內部網絡的安全性。它經過訪問控制機制,肯定哪些內部服務容許外部訪問,以及容許哪些外部請求能夠訪問內部服務。它能夠根據網絡傳輸的類型決定IP包是否能夠傳進或傳出內部網。
防火牆經過審查通過的每個數據包,判斷它是否有相匹配的過濾規則,根據規則的前後順序進行一一比較,直到知足其中的一條規則爲止,而後依據控制機制作出相應的動做。若是都不知足,則將數據包丟棄,從而保護網絡的安全。
Linux系統的防火牆功能是由內核實現的。在2.4 版及之後的內核中,包過濾機制是netfilter.CentOS 6管理工具是iptables,CentOS 7管理工具是firewalld ,firewalld 是Linux新一代的防火牆工具,它提供了支持網絡/防火牆區域 (zone) 定義網絡連接以及接口安全等級的動態防火牆管理。
Netfilter,位於Linux內核中的包過濾防火牆功能體系,稱爲Linux防火牆「內核態」。firewall-cmd,位於/bin/firewall-cmd,是用來管理防火牆的命令工具,爲防火牆體系提供過濾規則/策略,決定如何過濾或處理到達防火牆主機的數據包,稱爲Linux防火牆的「用戶態」。習慣上,上述2種稱呼均可以表明Linux防火牆。小程序
(1) netfilter框架
Linux內核包含了一個強大的網絡子系統,名爲netfilter,它能夠爲iptables內核防火牆模塊提供有狀態或無狀態的包過濾服務,如NAT、IP假裝等,也能夠因高級路由或鏈接狀態管理的須要而修改IP頭信息。而firewalld能夠動態管理防火牆,將netfilter的過濾功能集於一身,它也支持容許服務或者應用程序直接添加防火牆規則的接口,netfilter所處的位置如圖1所示:安全
雖然防火牆模塊構建在Linux內核,而且要對流經IP層的數據包進行處理,但它並無改變IP協議棧的代碼,而是經過netfilter模塊將防火牆的功能引入IP層,從而實現防火牆代碼和IP協議棧代碼的徹底分離。netfilter模塊的結構。如圖2所示:
數據包從左邊進入IP協議棧,進行IP校驗之後,數據包被PREROUTING處理,而後就進入路由模塊,由其決定該數據包是轉發出去仍是送給本機。若該數據包是送給本機的,則經過INPUT處理後傳遞給本機的上層協議;若該數據包應該被轉發,則它將FORWARD處理,而後還要經POSTROUTING處理後才能傳輸到網絡。本機進程產生的數據包要先通過OUTPUT處理後,再進行路由選擇處理,而後通過POSTROUTING處理後再發送到網絡。
iptables服務在/etc/sysconfig/iptables中儲存配置,而firewalld將配置儲存在 /usr/lib/firewalld/和/etc/firewalld/中的各類XML文件裏,使用iptables的時候每個單獨更改意味着清除全部舊有的規則和從/etc/sysconfig/iptables裏讀取全部新的規則,使用firewalld 卻不會再建立任何新的規則,僅僅運行規則中的不一樣。所以firewalld能夠在運行時改變設置而不丟失現行配置。
Firewalld動態管理防火牆,不須要重啓整個防火牆即可應用更改。於是也就沒有必要重載全部內核防火牆模塊。不過,要使用firewalld就要求防火牆的全部變動都要經過firewalld守護進程來實現,以確保守護進程中的狀態和內核裏的防火牆是一致的。另外,firewalld沒法解析由iptables和iptables命令行工具添加的防火牆規則。 Firewalld防火牆堆棧示意圖,如圖3所示。
服務器
FirewallD 提供了支持網絡/防火牆區域(zone)定義網絡連接以及接口安全等級的動態防火牆管理工具。firewalld經過將網絡劃分紅不一樣的區域(一般狀況下稱爲 zones),制定出不一樣區域之間的訪問控制策略來控制不一樣區域間傳送的數據流。它支持 IPv4, IPv6 防火牆設置以及以太網橋接,而且擁有運行時配置和永久配置選項。它也支持容許服務或者應用程序直接添加防火牆規則的接口。 之前的 system-config-firewall/lokkit 防火牆模型是靜態的,每次修改都要求防火牆徹底重啓。這個過程包括內核 netfilter 防火牆模塊的卸載和新配置所需模塊的裝載等。而模塊的卸載將會破壞狀態防火牆和確立的鏈接。
相反,firewall daemon 動態管理防火牆,不須要重啓防火牆即可應用更改。於是也就沒有必要重載全部內核防火牆模塊了。不過,要使用 firewall daemon 就要求防火牆的全部變動都要經過該守護進程來實現,以確保守護進程中的狀態和內核裏的防火牆是一致的。另外,firewall daemon 沒法解析由 ip*tables 和 ebtables 命令行工具添加的防火牆規則。守護進程經過 D-BUS 提供當前激活的防火牆設置信息,也經過 D-BUS 接受使用 PolicyKit 認證方式作的更改。應用程序、守護進程和用戶能夠經過D-BUS請求啓用一個防火牆特性。特性能夠是預約義的防火牆功能,如:服務、端口和協議的組合、端口/數據報轉發、假裝、ICMP 攔截或自定義規則等。該功能能夠啓用肯定的一段時間也能夠再次停用。網絡
網絡區域定義了網絡鏈接的可信等級。這是一個一對多的關係,這意味着一次鏈接能夠僅僅是一個區域的一部分,而一個區域能夠用於不少鏈接。一個IP能夠看做是一個區域、一個網段能夠看做是一個區域,局域網、互聯網均可以看做是一個區域。例如:app
配置或者增長區域:可使用任何一種 firewalld 配置工具來配置或者增長區域,以及修改配置。工具備例如 firewall-config 這樣的圖形界面工具, firewall-cmd 這樣的命令行工具,以及D-BUS接口。或者也能夠在配置文件目錄中建立或者拷貝區域文件。 @PREFIX@/lib/firewalld/zones 被用於默認和備用配置,/etc/firewalld/zones 被用於用戶建立和自定義配置文件。
修改區域:區域設置以 ZONE= 選項 存儲在網絡鏈接的ifcfg文件中。若是這個選項缺失或者爲空,firewalld 將使用配置的默認區域。若是這個鏈接受到 NetworkManager 控制,也可使用 nm-connection-editor 來修改區域。
由NetworkManager控制的網絡鏈接:防火牆不可以經過 NetworkManager 顯示的名稱來配置網絡鏈接,只能配置網絡接口。所以在網絡鏈接以前 NetworkManager 將配置文件所述鏈接對應的網絡接口告訴 firewalld 。若是在配置文件中沒有配置區域,接口將配置到 firewalld 的默認區域。若是網絡鏈接使用了不止一個接口,全部的接口都會應用到 fiwewalld。接口名稱的改變也將由 NetworkManager 控制並應用到firewalld。爲了簡化,網絡鏈接將被用做與區域的關係。若是一個接口斷開了,NetworkManager也將告訴firewalld從區域中刪除該接口。當firewalld由systemd或者init腳本啓動或者重啓後,firewalld將通知NetworkManager把網絡鏈接增長到區域。框架
CentOS 7中使用firewall-config圖形界面管理的防火牆策略。也可使用firewall-cmd命令行工具進行管理, firewall-cmd 支持所有防火牆特性,對於狀態和查詢模式,命令只返回狀態,沒有其它輸出。另外還能夠直接編輯/etc/firewalld/中的配置文件用來管理firewalld的策略。ssh
firewall-cmd支持防火牆的全部特性,管理員能夠用它來改變系統或用戶策略,經過 firewall-cmd用戶能夠配置防火牆容許經過的服務、端口、假裝、端口轉發、和ICMP過濾器和調整 zone(區域)設置等功能。
firewall-cmd工具支持兩種策略管理方式,運行時和永久設置,須要分別設置二者:tcp
防火牆管理命令格式:
firewall-cmd [Options…]
firewall-cmd支持上百參數,下表爲經常使用Options說明,如表所示:ide
firewall-cmd命令 | 說明 |
---|---|
--get-default-zone | 查詢當前默認區域 |
--set-default-zone=<ZONE> | 設置默認區域,會更改運行時和永久配置 |
--get-zones | 列出全部可用區域 |
--get-active-zones | 列出正在使用的全部區域(具備關聯的接口或源)機器接口和源信息 |
--add-source=<CIDR> [--zone=<ZONE>] | 未來自IP地址或網絡/子網掩碼<CIDR>的全部流量路由到指定區域。 |
--remove-source=<CIDR> [--zone=<ZONE>] | 從指定區域中刪除用於路由來自IP地址或網絡/子網掩碼<CIDR>的全部流量的規則 |
--add-interface=<INTERFACE>[--zone=<ZONE>] | 未來自<INTERFACE>的全部流量路由到指定區域 |
--change-interface=<INTERFACE>[--zone=<ZONE>] | 將接口與<ZONE>而非其當前區域關聯 |
--list-all [--zone=<zone>] | 列出<ZONE>的全部已配置接口、源、服務和端口 |
--list-all-zones | 檢索全部區域的全部信息(接口、源、端口、服務等) |
--add-service=<SERVICE>[--zone=<ZONE>] | 容許到<SERVICE>的流量 |
--add-port=<PORT/PROTOCOL>[--zone=<ZONE>] | 容許到<PORT/PROTOCOL>端口的流量 |
--remove-service=<SERVICE>[--zone=<ZONE>] | 從區域容許列表中刪除<SERVICE> |
--remove-port=<PORT/PROTOCOL>[--zone=<ZONE>] | 從區域容許列表中刪除<PORT/PROTOCOL>端口 |
--reload | 丟棄運行時配置,並應用持久配置 |
firewall-config支持防火牆的全部特性,管理員能夠用它來改變系統或用戶策略,經過 firewall-config 用戶能夠配置防火牆容許經過的服務、端口、假裝、端口轉發、和ICMP過濾器和調整 zone(區域)設置等功能以使防火牆設置更加的自由、安全和強健。
firewall-config工做界面。如圖4所示。
firewall-config工做界面分紅三個部分:上面是主菜單,中間是配置選項卡,包括區域、服務設置選項卡,底部是狀態欄,狀態欄從左到右以此是鏈接狀態、默認區域、鎖定狀態、應急模式。
在左下方角落尋找「已鏈接」字符,這標誌着 firewall-config工具已經鏈接到用戶區後臺程序 firewalld。
firewall-config 主菜單包括四個選項:文件,選項,查看,幫助。其中選項子菜單是最主要的,它包括幾個部分:
firewall-config 配置選項卡包括:運行時和永久。
區域選項卡是一個主要設置界面,firewalld 提供了10種預約義的區域,區域配置選項和通用配置信息能夠在 firewall.zone(5) 的手冊裏查到,
區域選項卡有八個子選項卡,分別是服務、端口、假裝、端口轉發、ICMP過濾器、富規則、接口、來源,如圖3-1-5所示。
(4)firewall-config 服務選項卡
預約義了幾十種重要服務,可經過命令firewall-cmd --get-services查詢,服務是端口、協議、模塊和目標地址的集合,該選項卡配置只能在永久配置視圖中修改服務,不能在運行時配置中修改。
服務選項卡底下包含端口和協議、模塊、目標地址三種子選項卡,如圖所示。。
管理員能夠規定哪些用戶可使用用戶交互模式和限制防火牆可用特性。
端口元數據信息(由 Lennart Poettering 提議),擁有一個端口獨立的元數據信息是很好的。應用程序或服務的端口是動態的,於是端口自己並不能描述使用狀況,因此對 /etc/services 的端口和協議靜態分配模型不是個好的解決方案,也沒有反映當前使用狀況。。
元數據信息能夠用來爲防火牆制定簡單的規則。下面是一些例子:
這裏的元數據信息不僅有特定應用程序,還能夠是一組使用狀況。例如:組「所有共享」或者組「文件共享」能夠對應於所有共享或文件共享程序(如:torrent 文件共享)。這些只是例子,於是,可能並無實際用處。
這裏是在防火牆中獲取元數據信息的兩種可能途徑:
第二種解決方案的好處是不須要爲有新的元數據組和歸入改變(可信級.用戶偏好或管理員規則等等)從新編譯內核。這些抽象規則的添加使得 firewall daemon 更加自由。即便是新的安全級也不須要更新內核便可輕鬆添加。
實際應用中對sysctl 設置常常出現錯誤。
一個例子是,在 rc.sysinit 正運行時,而提供設置的模塊在啓動時沒有裝載或者從新裝載該模塊時會發生問題。
另外一個例子是 net.ipv4.ip_forward ,防火牆設置.libvirt 和用戶/管理員更改都須要它。若是有兩個應用程序或守護進程只在須要時開啓 ip_forwarding ,以後可能其中一個在不知道的狀況下關掉服務,而另外一個正須要它,此時就不得不重啓它。
sysctl daemon 能夠經過對設置使用內部計數來解決上面的問題。此時,當請求者再也不須要時,它就會再次回到以前的設置狀態或者是直接關閉它。
firewalld 和 iptables service 之間最本質區別是:
啓動: systemctl start firewalld
關閉: systemctl stop firewalld
查看狀態: systemctl status firewalld
開機禁用 : systemctl disable firewalld
開機啓用 : systemctl enable firewalld
(2) systemctl是CentOS7的服務管理工具中主要的工具,它融合以前service和chkconfig的功能於一體。
啓動一個服務:systemctl start firewalld.service
關閉一個服務:systemctl stop firewalld.service
重啓一個服務:systemctl restart firewalld.service
顯示一個服務的狀態:systemctl status firewalld.service
在開機時啓用一個服務:systemctl enable firewalld.service
在開機時禁用一個服務:systemctl disable firewalld.service
查看服務是否開機啓動:systemctl is-enabled firewalld.service
查看已啓動的服務列表:systemctl list-unit-files|grep enabled
查看啓動失敗的服務列表:systemctl --failed
(3) 配置firewalld-cmd
#《實例一》防火牆查詢 firewall-cmd --version //查看版本 firewall-cmd --help // 查看幫助 firewall-cmd --state // 顯示狀態 firewall-cmd --get-services //獲取支持服務列表(firewalld內置服務支持) firewall-cmd --zone=public --list-ports //查看全部打開的端口 firewall-cmd --list-forward-ports //查看轉發的端口 fierewall-cmd –reload //從新加載防火牆策略 firewall-cmd --get-active-zones //查看區域信息 firewall-cmd --list-all-zones //列出所有啓用的區域的特性 firewall-cmd --list-services //顯示防火牆當前服務 firewall-cmd --get-zone-of-interface=eth0 //查看指定接口所屬區域 firewall-cmd --panic-on //拒絕全部包 firewall-cmd --panic-offfir //取消拒絕狀態 firewall-cmd --query-panic //查看是否拒絕 *# 《實例二》 運行時區域策略設置示例(注:如下示例不加zone的爲默認區域public) firewall-cmd --add-service=ssh //容許 ssh 服務經過 firewall-cmd --remove-service=ssh //禁止 ssh 服務經過 firewall-cmd --add-service=samba --timeout=600 //臨時容許 samba 服務經過 600 秒 firewall-cmd --add-service=http --zone=work //容許http服務經過work區域 firewall-cmd --zone=work --add-service=http //從work區域打開http服務 firewall-cmd --zone=internal --add-port=443/tcp //打開 443/tcp 端口在內部區域(internal) firewall-cmd --zone=internal --remove-port=443/tcp //關閉443/tcp 端口在內部區域(internal) firewall-cmd --add-interface=eth0 //打開網卡eth0 firewall-cmd --remove-interface=eth0 //關閉網卡eth0 #《 實例三》 永久區域策略設置示例(注:如下示例不加zone的爲默認區域public;永久設置均需從新加載防火牆策略或重啓系統) firewall-cmd --permanent --add-service=ftp //永久容許 ftp 服務經過 firewall-cmd --permanent --remove-service=ftp //永久禁止 ftp 服務經過 firewall-cmd --permanent --add-service=http --zone=external //永久容許http服務經過external區域 firewall-cmd --permanent --add-service=http --zone=external //永久容許http服務經過external區域 firewall-cmd --permanent --zone=internal --add-port=111/tcp //打開 111/tcp 端口在內部區域(internal) firewall-cmd --permanent --zone=internal --remove-port=111/tcp //關閉 111/tcp 端口在內部區域(internal) firewall-cmd --permanent --add-interface=eth0 //永久打開網卡eth0 firewall-cmd --permanent --remove-interface=eth0 //永久關閉網卡eth0 firewall-cmd --permanent --zone=public --add-port=8080-8083/tcp //添加多個端口 firewall-cmd --permanent --zone=public --remove-port=81/tcp //刪除某個端口 firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.1.51" accept" //刪除某個IP firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.0.0/16" accept" // firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="9200" accept" //針對某個ip段訪問 firewall-cmd --reload //添加操做後別忘了執行重載纔會生效
歡迎各位關注我的公號「沒有故事的陳師傅」