防火牆安全
http://hongge.blog.51cto.com/服務器
Redhat Enterprise Linux7已經默認使用firewalld做爲防火牆,其使用方式已經變化。網絡
基於iptables的防火牆被默認不啓動,但仍然能夠繼續使用。ssh
RHEL7中有幾種防火牆共存:firewalld、iptables、ebtables等,默認使用firewalld做爲防火牆,管理工具是firewall-cmd。RHEL7的內核版本是3.10,在此版本的內核裏防火牆的包過濾機制是firewalld,使用firewalld來管理netfilter,不過底層調用的命令仍然是iptables等。由於這幾種daemon是衝突的,因此建議禁用其餘幾種服務tcp
例如若要禁用iptables、ip6tables、ebtables防火牆,方法以下圖ide
或工具
查看這幾種服務是否正在運行命令行
或3d
RHEL7雖然有iptables可是不建議使用了,使用新的firewalld服務。日誌
查看firewalld軟件包是否安裝
Firewalld提供了支持網絡/防火牆區域(zone)定義網絡連接以及接口安全等級的防火牆管理工具。擁有運行時配置和永久配置選項。它也支持容許服務或者應用程序直接添加防火牆規則的接口。之前的 system-config-firewall防火牆模型是靜態的,每次修改都要求防火牆徹底重啓。這個過程包括內核 netfilter 防火牆模塊的卸載和新配置所需模塊的裝載等。相反,firewall daemon 動態管理防火牆,不須要重啓整個防火牆即可應用更改。於是也就沒有必要重載全部內核防火牆模塊了。
什麼是區域:網絡區域定義了網絡鏈接的可信等級。
數據包要進入到內核必需要經過這些zone中的一個,而不一樣的zone裏定義的規則不同(即信任度不同,過濾的強度也不同)。能夠根據網卡所鏈接的網絡的安全性來判斷,這張網卡的流量到底使用哪一個zone,好比上圖來自eth0的流量所有使用zone1的過濾規則,eth1的流量使用zone2。一張網卡同時只能綁定到一個zone
預約義的服務:服務是端口和/或協議入口的組合。
端口和協議:定義了 tcp 或 udp 端口,端口能夠是一個端口或者端口範圍。
ICMP 阻塞:能夠選擇 Internet 控制報文協議的報文。這些報文能夠是信息請求亦但是對信息請求或錯誤條件建立的響應。
假裝:私有網絡地址能夠被映射到公開的IP地址。這是一次正規的地址轉換。
端口轉發:端口能夠映射到另外一個端口以及/或者其餘主機。
在進行firewalld配置以前,我想來討論一下區域(zones)這個概念。默認狀況就有一些有效的區域。由firewalld 提供的區域按照從不信任到信任的順序排序。
?丟棄區域(Drop Zone):若是使用丟棄區域,任何進入的數據包將被丟棄。這個相似與咱們以前使用iptables -j drop。使用丟棄規則意味着將不存在響應。
?阻塞區域(Block Zone):阻塞區域會拒絕進入的網絡鏈接,返回icmp-host-prohibited,只有服務器已經創建的鏈接會被經過即只容許由該系統初始化的網絡鏈接。
?公共區域(Public Zone):只接受那些被選中的鏈接,默認只容許 ssh 和 dhcpv6-client。這個 zone 是缺省 zone
?外部區域(External Zone):這個區域至關於路由器的啓用假裝(masquerading)選項。只有指定的鏈接會被接受,即ssh,而其它的鏈接將被丟棄或者不被接受。
?隔離區域(DMZ Zone):若是想要只容許給部分服務能被外部訪問,能夠在DMZ區域中定義。它也擁有隻經過被選中鏈接的特性,即ssh。
?工做區域(Work Zone):在這個區域,咱們只能定義內部網絡。好比私有網絡通訊才被容許,只容許ssh,ipp-client和 dhcpv6-client。
?家庭區域(Home Zone):這個區域專門用於家庭環境。它一樣只容許被選中的鏈接,即ssh,ipp-client,mdns,samba-client和 dhcpv6-client。
?內部區域(Internal Zone):這個區域和工做區域(Work Zone)相似,只有經過被選中的鏈接,和home區域同樣。
?信任區域(Trusted Zone):信任區域容許全部網絡通訊經過。記住:由於trusted是最被信任的,即便沒有設置任何的服務,那麼也是被容許的,由於trusted是容許全部鏈接的
以上是系統定義的全部的 zone,可是這些 zone 並非都在使用。只有活躍的 zone 纔有實際操做意義。
Firewalld的原則:
若是一個客戶端訪問服務器,服務器根據如下原則決定使用哪一個 zone 的策略去匹配
1.若是一個客戶端數據包的源 IP 地址匹配 zone 的 sources,那麼該 zone 的規則就適
用這個客戶端;一個源只能屬於一個zone,不能同時屬於多個zone。
2.若是一個客戶端數據包進入服務器的某一個接口(如eth0)區配zone的interfaces,
則麼該 zone 的規則就適用這個客戶端;一個接口只能屬於一個zone,不能同時屬於多個zone。
3.若是上述兩個原則都不知足,那麼缺省的 zone 將被應用
你可使用任何一種 firewalld 配置工具來配置或者增長區域,以及修改配置。工具備例如firewall-config 這樣的圖形界面工具, firewall-cmd 這樣的命令行工具,或者你也能夠在配置文件目錄中建立或者拷貝區域文件,/usr/lib/firewalld/zones 被用於默認和備用配置,/etc/firewalld/zones 被用於用戶建立和自定義配置文件。
命令行工具firewall-cmd支持所有防火牆特性,基本應用以下:
通常應用:
一、 獲取firewalld狀態
二、在不改變狀態的條件下從新加載防火牆:
若是你使用--complete-reload,狀態信息將會丟失。
三、獲取支持的區域列表
這條命令輸出用空格分隔的列表
四、獲取全部支持的服務
這條命令輸出用空格分隔的列表。
服務是firewalld所使用的有關端口和選項的規則集合。被啓動的服務會在firewalld服務開啓或者運行時自動加載。默認狀況下,不少服務是有效的。使用下面命令可列出有效的服務。
想要列出默認有效的服務,也能夠進入下面的目錄也可以取得。
# cd /usr/lib/firewalld/services/
想要建立本身的服務,須要在下面的目錄下定義它。好比,如今我想添加一個rhmp服務,端口號1935。首先,任選一個服務複製過來。
接下來把複製過來的文件重命名爲「rtmp.xml」,
接下來打開並編輯文件的頭部、描述、協議和端口號,以供RTMP服務使用,以下圖所示。
重啓firewalld服務或者從新加載設置,以激活這些設置。
# firewall-cmd --reload
爲確認服務是否已經啓動,運行下面的命令獲取有效的服務列表。
# firewall-cmd --get-services
五、獲取全部支持的ICMP類型
這條命令輸出用空格分隔的列表。
六、列出所有啓用的區域的特性(即查詢當前防火牆策略)
解釋:特性能夠是定義的防火牆策略,如:服務、端口和協議的組合、端口/數據報轉發、假裝、ICMP 攔截或自定義規則等
上面的命令將會列出每種區域如block、dmz、drop、external、home、internal、public、trusted以及work。若是區域還有其它詳細規則(rich-rules)、啓用的服務或者端口,這些區域信息也會分別被羅列出來
七、輸出區域所有啓用的特性。若是省略區域,將顯示默認區域的信息。
firewall-cmd [--zone=] --list-all
輸出指定區域啓動的特性
八、查看默認區域
public區域是默認區域。
在文件/etc/firewalld/firewalld.conf中定義成DefaultZone=public。
九、設置默認區域
firewall-cmd --set-default-zone=區域名
流入默認區域中配置的接口的新訪問請求將被置入新的默認區域。當前活動的鏈接將不受影響。
十、獲取活動的區域
這條命令將用如下格式輸出每一個區域所含接口:
區域名
interfaces : 接口名
十一、根據接口獲取區域即須要查看哪一個區域和這個接口綁定即查看某個接口是屬於哪一個zone的:
firewall-cmd --get-zone-of-interface=接口名
這條命令將輸出接口所屬的區域名稱。
十二、將接口(網卡)增長到區域
firewall-cmd [--zone=] --add-interface=接口名
若是接口不屬於區域,接口將被增長到區域。若是區域被省略了,將使用默認區域。接口在從新加載後將從新應用。
1三、修改接口所屬區域
firewall-cmd [--zone=] --change-interface=接口名
這個選項與 --add-interface 選項類似,可是當接口已經存在於另外一個區域的時候,該接口將被添加到新的區域。
1四、從區域中刪除一個接口
firewall-cmd [--zone=] --remove-interface=接口名
注:若是某個接口不屬於任何Zone,那麼這個接口的全部數據包使用默認的Zone的規則
1五、查詢區域中是否包含某接口
firewall-cmd [--zone=] --query-interface=接口名
若是區域被省略了,將使用默認區域
1六、列舉區域中啓用的服務
firewall-cmd [ --zone= ] --list-services
若是區域被省略了,將使用默認區域
查看home區域中啓用服務
1七、啓用應急模式阻斷全部網絡鏈接,以防出現緊急情況
1八、禁用應急模式
firewall-cmd --panic-off
1九、查詢應急模式
firewall-cmd --query-panic
其餘相關的配置項能夠查看firewall-cmd的手冊頁:#man firewall-cmd
處理運行時區域:
運行時模式下對區域進行的修改不是永久有效的。從新加載或者重啓後修改將失效。
一、啓用區域中的一種服務即給某個區域開啓某個服務
firewall-cmd [--zone=區域] --add-service=服務 [--timeout=秒數]
此操做啓用區域中的一種服務。若是未指定區域,將使用默認區域。若是設定了超時時間,服務將只啓用特定秒數。
使區域中的 ipp-client 服務生效60秒:
啓用默認區域中的http服務:firewall-cmd --add-service=http
二、禁用區域中的某種服務即關閉某個服務
firewall-cmd [--zone=區域] --remove-service=服務
此舉禁用區域中的某種服務。若是未指定區域,將使用默認區域。
例:禁止默認區域中的 http 服務:
三、查詢區域中是否啓用了特定服務
firewall-cmd [--zone=區域] --query-service=服務
Yes表示服務啓用,no表示服務關掉了。
四、啓用區域端口和協議組合
firewall-cmd [--zone=區域] --add-port=portid[-portid]/protocol [--timeout=seconds]
此操做將啓用端口和協議的組合。端口能夠是一個單獨的端口或者是一個端口範圍 - 。協議能夠是tcp或udp。
五、禁用端口和協議組合
firewall-cmd [--zone=區域] --remove-port=portid[-portid]/protocol
六、查詢區域中是否啓用了端口和協議組合
firewall-cmd [--zone=區域] --query-port=portid[-portid]/protocol
七、啓用區域中的 IP 假裝功能
firewall-cmd [--zone=區域] --add-masquerade
此操做啓用區域的假裝功能。私有網絡的地址將被隱藏並映射到一個公有IP。這是地址轉換的一種形式,經常使用於路由。因爲內核的限制,假裝功能僅可用於IPv4。
八、禁用區域中的 IP 假裝
firewall-cmd [--zone=區域] --remove-masquerade
九、查詢區域的假裝狀態
firewall-cmd [--zone=區域] --query-masquerade
注意:啓用假裝功能的主機同時也須要開啓轉發服務:
# echo 1 > /proc/sys/net/ipv4/ip_forward
或
#vi /etc/sysctl.conf 添加以下內容
net.ipv4.ip_forward = 1
保存退出並執行#sysctl -p使修改生效
十、啓用區域的 ICMP 阻塞功能
firewall-cmd [--zone=區域] --add-icmp-block=icmp類型
此操做將啓用選中的 Internet 控制報文協議(ICMP)報文進行阻塞。 ICMP 報文能夠是請求信息或者建立的應答報文,以及錯誤應答。
十一、禁止區域的 ICMP 阻塞功能
firewall-cmd [--zone=區域] --remove-icmp-block=icmp類型
十二、查詢區域的 ICMP 阻塞功能
firewall-cmd [--zone=區域] --query-icmp-block=icmp類型
1三、在區域中啓用端口轉發或映射
firewall-cmd [--zone=區域] --add-forward-port=port=portid[-portid]:proto=protocol[ :toport=portid[-portid]][ :toaddr=address [/mask]]
端口能夠映射到另外一臺主機的同一端口,也能夠是同一主機或另外一主機的不一樣端口。端口號能夠是一個單獨的端口或者是端口範圍 - 。協議能夠爲tcp或udp。目標端口能夠是端口號或者是端口範圍 - 。目標地址能夠是 IPv4 地址。受內核限制,端口轉發功能僅可用於IPv4。
意思是凡是來從external進來的22端口的數據包所有轉發到211.106.65.50
firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toaddr=211.106.65.50
1四、禁止區域的端口轉發或者端口映射
firewall-cmd [--zone=] --remove-forward-port=port=portid[-portid]:proto=protocol[ :toport=portid[-portid]][ :toaddr=address [/mask]]
1五、查詢區域的端口轉發或者端口映射
firewall-cmd [--zone=]--query-forward-port=port=portid[-portid]:proto=protocol[ :toport=portid[-portid]][ :toaddr=address [/mask]]
處理永久區域:
永久選項不直接影響運行時的狀態。這些選項僅在重載或者重啓服務時可用。爲了使用運行時和永久設置,須要分別設置二者。選項--permanent須要是永久設置的第一個參數。
一、獲取永久選項所支持的服務
firewall-cmd --permanent --get-services
二、獲取永久選項所支持的ICMP類型列表
firewall-cmd --permanent --get-icmptypes
三、獲取支持的永久區域
firewall-cmd --permanent --get-zones
四、配置防火牆在public區域打開http協議,並保存,以至重啓有效
firewall-cmd --permanent --zone=public --add-service=http
查看永久模式下public區域是否打開http服務。
firewall-cmd --permanent --zone=public --query-service=http
五、防火牆開放8080端口在public區域
firewall-cmd --permanent --zone=public --add-port=8080/tcp
六、命令行配置富規則:
查看富規則:# firewall-cmd --list-rich-rules
建立富規則:
firewall-cmd --add-rich-rule 'rule family=ipv4 source address=10.35.89.0/24 service name=ftp log prefix="ftp" level=info accept' --permanent
firewall-cmd --add-rich-rule 'rule family=ipv4 source address=10.35.89.0/24 port port=80 protocol=tcp log prefix="80" level=info accept' --permanent
firewall-cmd --add-rich-rule rule family="ipv4" source address="192.168.10.30" forward-port port="808" protocol="tcp" to-port="80" to-addr="10.10.10.2"
富規則中使用假裝功能能夠更精確詳細的限制:
firewall-cmd --add-rich-rule 'rule family=ipv4 source address=10.10.10.2/24 masquerade'
僅容許部分IP訪問本機服務配置
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4"
source address="192.168.0.0/24" service name="http" accept"
禁止遠程IP訪問ssh
firewall-cmd --permanent --zone=public --add-rich-rule=’rule family=ipv4
source address=192.168.0.0/24 service name=ssh reject’
七、刪除rich規則
firewall-cmd --permanent --zone=public --remove-rich-rule=’rule family=ipv4
source address=192.168.0.0/24 service name=ssh reject’
八、僅容許部分IP訪問本機端口配置
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4"
source address="192.168.0.0/24"port protocol="tcp" port="8080" accept"
九、建立rich規則,能夠指定日誌的前綴和輸出級別
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.0.4/24"port port=8080 protocol="tcp" log prefix=proxy level=warning accept"
能夠經過查看/var/log/messages日誌文件
十、端口轉發。實驗環境下,desktop訪問server的5423端口,將訪問server的80端口。
Server上的操做:(172.25.0.10是desktop的IP地址)
十一、172.25.1.0/24網段內的客戶端不能訪問主機的SSH
十二、也可經過配置如下XML文件,進行對防火牆的配置修改
#cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks
to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="dhcpv6-client"/>
<service name="ssh"/>
<rule family="ipv4">
<source address="192.168.0.4/24"/>
<service name="http"/>
<accept/>
</rule>
</zone>
總結
netfilter 防火牆老是容易受到規則順序的影響,由於一條規則在鏈中沒有固定的位置。在一條規則以前添加或者刪除規則都會改變此規則的位置。在靜態防火牆模型中,改變防火牆就是重建一個乾淨和完善的防火牆設置,默認鏈一般也沒有安全的方式添加或刪除規則而不影響其餘規則。
動態防火牆有附加的防火牆功能鏈。這些特殊的鏈按照已定義的順序進行調用,於是向鏈中添加規則將不會干擾先前調用的拒絕和丟棄規則。從而利於建立更爲合理完善的防火牆配置。
下面是一些由守護進程建立的規則,過濾列表中啓用了在公共區域對 ssh , mdns 和 ipp-client 的支持:
總結:
圖形化配置工具
firewall daemon 主要的配置工具是firewall-config。它支持防火牆的全部特性。管理員也能夠用它來改變系統或用戶策略。
命令行客戶端
firewall-cmd是命令行下提供大部分圖形工具配置特性的工具。
附錄:要想了解更多firewall防火牆更多知識能夠查看firewall的相關手冊頁,下圖所顯示的就是firewall防火牆的相關手冊頁:
若要查看rich-rule手冊頁
例如:容許icmp協議的數據包通訊