章節簡述:html

保障數據的安全性是繼保障數據的可用性以後最爲重要的一項工做。防火牆做爲公網與內網之間的保護屏障,在保障數據的安全性方面起着相當重要的做用。考慮到你們還不瞭解RHEL 7中新增的firewalld防火牆與先前版本中iptables防火牆之間的區別,劉遄老師決定先帶領讀者從理論層面和實際層面正確地認識在這兩款防火牆之間的關係。linux

本章將分別使用iptables、firewall-cmd、firewall-config和TCP Wrappers等防火牆策略配置服務來完成數十個根據真實工做需求而設計的防火牆策略配置實驗。在學習完這些實驗以後,各位讀者不只能夠熟練地過濾請求的流量,還能夠基於服務程序的名稱對流量進行容許和拒絕操做,確保Linux系統的安全性萬無一失。面試

8.1 防火牆管理工具

衆所周知,相較於企業內網,外部的公網環境更加惡劣,罪惡叢生。在公網與企業內網之間充當保護屏障的防火牆(見圖8-1)雖然有軟件或硬件之分,但主要功能都是依據策略對穿越防火牆自身的流量進行過濾。防火牆策略能夠基於流量的源目地址、端口號、協議、應用等信息來定製,而後防火牆使用預先定製的策略規則監控出入的流量,若流量與某一條策略規則相匹配,則執行相應的處理,反之則丟棄。這樣一來,就能夠保證僅有合法的流量在企業內網和外部公網之間流動了。安全

防火牆拓撲

圖8-1 防火牆做爲公網與內網之間的保護屏障bash

在RHEL 7系統中,firewalld防火牆取代了iptables防火牆。對於接觸Linux系統比較早或學習過RHEL 6系統的讀者來講,當他們發現曾經掌握的知識在RHEL 7中再也不適用,須要全新學習firewalld時,不免會有抵觸心理。其實,iptables與firewalld都不是真正的防火牆,它們都只是用來定義防火牆策略的防火牆管理工具而已,或者說,它們只是一種服務。iptables服務會把配置好的防火牆策略交由內核層面的netfilter網絡過濾器來處理,而firewalld服務則是把配置好的防火牆策略交由內核層面的nftables包過濾框架來處理。換句話說,當前在Linux系統中其實存在多個防火牆管理工具,旨在方便運維人員管理Linux系統中的防火牆策略,咱們只須要配置穩當其中的一個就足夠了。雖然這些工具各有優劣,但它們在防火牆策略的配置思路上是保持一致的。你們甚至能夠不用徹底掌握本章介紹的內容,只要在這多個防火牆管理工具中任選一款並將其學透,就足以知足平常的工做需求了。服務器

8.2 Iptables

在早期的Linux系統中,默認使用的是iptables防火牆管理服務來配置防火牆。儘管新型的firewalld防火牆管理服務已經被投入使用多年,可是大量的企業在生產環境中依然出於各類緣由而繼續使用iptables。考慮到iptables在當前生產環境中還具備頑強的生命力,以及爲了使你們在求職面試過程當中被問到iptables的相關知識時能成竹在胸,劉遄老師以爲仍是有必要在本書中好好地講解一下這項技術。更況且前文也提到,各個防火牆管理工具的配置思路是一致的,在掌握了iptables後再學習其餘防火牆管理工具時,也有借鑑意義。網絡

8.2.1 策略與規則鏈

防火牆會從上至下的順序來讀取配置的策略規則,在找到匹配項後就當即結束匹配工做並去執行匹配項中定義的行爲(即放行或阻止)。若是在讀取完全部的策略規則以後沒有匹配項,就去執行默認的策略。通常而言,防火牆策略規則的設置有兩種:一種是「通」(即放行),一種是「堵」(即阻止)。當防火牆的默認策略爲拒絕時(堵),就要設置容許規則(通),不然誰都進不來;若是防火牆的默認策略爲容許時,就要設置拒絕規則,不然誰都能進來,防火牆也就失去了防範的做用。app

iptables服務把用於處理或過濾流量的策略條目稱之爲規則,多條規則能夠組成一個規則鏈,而規則鏈則依據數據包處理位置的不一樣進行分類,具體以下:框架

在進行路由選擇前處理數據包(PREROUTING);

處理流入的數據包(INPUT);

處理流出的數據包(OUTPUT);

處理轉發的數據包(FORWARD);

在進行路由選擇後處理數據包(POSTROUTING)。

  

        源NAT(Source NAT,SNAT):修改數據包的源地址。源NAT改變第一個數據包的來源地址,它永遠會在數據包發送到網絡以前完成,數據包假裝就是一具SNAT的例子。
        目的NAT(Destination NAT,DNAT):修改數據包的目的地址。Destination NAT恰好與SNAT相反,它是改變第一個數據包的目的地地址,如平衡負載、端口轉發和透明代理就是屬於DNAT。

通常來講,從內網向外網發送的流量通常都是可控且良性的,所以咱們使用最多的就是INPUT規則鏈,該規則鏈能夠增大黑客人員從外網入侵內網的難度。

好比在您居住的社區內,物業管理公司有兩條規定:禁止小商小販進入社區;各類車輛在進入社區時都要登記。顯而易見,這兩條規定應該是用於社區的正門的(流量必須通過的地方),而不是每家每戶的防盜門上。根據前面提到的防火牆策略的匹配順序,可能會存在多種狀況。好比,來訪人員是小商小販,則直接會被物業公司的保安拒之門外,也就無需再對車輛進行登記。若是來訪人員乘坐一輛汽車進入社區正門,則「禁止小商小販進入社區」的第一條規則就沒有被匹配到,所以按照順序匹配第二條策略,即須要對車輛進行登記。若是是社區居民要進入正門,則這兩條規定都不會匹配到,所以會執行默認的放行策略。

可是,僅有策略規則還不能保證社區的安全,保安還應該知道採用什麼樣的動做來處理這些匹配的流量,好比「容許」、「拒絕」、「登記」、「不理它」。這些動做對應到iptables服務的術語中分別是ACCEPT(容許流量經過)、REJECT(拒絕流量經過)、LOG(記錄日誌信息)、DROP(拒絕流量經過)。「容許流量經過」和「記錄日誌信息」都比較好理解,這裏須要着重講解的是REJECT和DROP的不一樣點。就DROP來講,它是直接將流量丟棄並且不響應;REJECT則會在拒絕流量後再回復一條「您的信息已經收到,可是被扔掉了」信息,從而讓流量發送方清晰地看到數據被拒絕的響應信息。

咱們來舉一個例子,讓各位讀者更直觀地理解這兩個拒絕動做的不一樣之處。好比有一天您正在家裏看電視,忽然聽到有人敲門,您透過防盜門的貓眼一看是推銷商品的,便會在不須要的狀況下開門並拒絕他們(REJECT)。但若是您看到的是債主帶了十幾個小弟來討債,此時不只要拒絕開門,還要默不做聲,假裝成本身不在家的樣子(DROP)。

當把Linux系統中的防火牆策略設置爲REJECT拒絕動做後,流量發送方會看到端口不可達的響應:

[root@linuxprobe ~]# ping -c 4 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
From 192.168.10.10 icmp_seq=1 Destination Port Unreachable
From 192.168.10.10 icmp_seq=2 Destination Port Unreachable
From 192.168.10.10 icmp_seq=3 Destination Port Unreachable
From 192.168.10.10 icmp_seq=4 Destination Port Unreachable
--- 192.168.10.10 ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3002ms

而把Linux系統中的防火牆策略修改爲DROP拒絕動做後,流量發送方會看到響應超時的提醒。可是流量發送方沒法判斷流量是被拒絕,仍是接收方主機當前不在線:

   iptables -P INPUT DROP      根據iptables的規則策略不容許將默認策略設置成REJECT(做者定義的)

[root@linuxprobe ~]# ping -c 4 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.

--- 192.168.10.10 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3000ms
8.2.2 基本的命令參數

iptables是一款基於命令行的防火牆策略管理工具,具備大量參數,學習難度較大。好在對於平常的防火牆策略配置來說,你們無需深刻了解諸如「四表五鏈」的理論概念,只須要掌握經常使用的參數並作到靈活搭配便可,這就足以應對平常工做了。

iptables命令能夠根據流量的源地址、目的地址、傳輸協議、服務類型等信息進行匹配,一旦匹配成功,iptables就會根據策略規則所預設的動做來處理這些流量。另外,再次提醒一下,防火牆策略規則的匹配順序是從上至下的,所以要把較爲嚴格、優先級較高的策略規則放到前面,以避免發生錯誤。表8-1總結概括了經常使用的iptables命令參數。再次強調,咱們無需死記硬背這些參數,只需藉助下面的實驗來理解掌握便可。

表8-1 iptables中經常使用的參數以及做用

參數 做用
-P 設置默認策略
-F 清空規則鏈
-L 查看規則鏈
-A 在規則鏈的末尾加入新規則
-I num 在規則鏈的頭部加入新規則
-D num 刪除某一條規則
-s 匹配來源地址IP/MASK,加歎號「!」表示除這個IP外
-d 匹配目標地址
-i 網卡名稱 匹配從這塊網卡流入的數據
-o 網卡名稱 匹配從這塊網卡流出的數據
-p 匹配協議,如TCP、UDP、ICMP
--dport num 匹配目標端口號
--sport num 匹配來源端口號

在iptables命令後添加-L參數查看已有的防火牆規則鏈:

[root@linuxprobe ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination 
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere 
INPUT_direct all -- anywhere anywhere 
INPUT_ZONES_SOURCE all -- anywhere anywhere 
INPUT_ZONES all -- anywhere anywhere 
ACCEPT icmp -- anywhere anywhere 
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
………………省略部分輸出信息………………

在iptables命令後添加-F參數清空已有的防火牆規則鏈:

[root@linuxprobe ~]# iptables -F
[root@linuxprobe ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination 
………………省略部分輸出信息………………

把INPUT規則鏈的默認策略設置爲拒絕:

[root@linuxprobe ~]# iptables -P INPUT DROP
[root@linuxprobe ~]# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination 
…………省略部分輸出信息………………

如前面所提到的防火牆策略設置無非有兩種方式,一種是「通」,一種是「堵」,當把INPUT鏈設置爲默認拒絕後,就要往裏面寫入容許策略了,不然全部流入的數據包都會被默認拒絕掉,同窗們須要留意規則鏈的默認策略拒絕動做只能是DROP,而不能是REJECT。

向INPUT鏈中添加容許ICMP流量進入的策略規則:

在平常運維工做中,常常會使用ping命令來檢查對方主機是否在線,而向防火牆的INPUT規則鏈中添加一條容許ICMP流量進入的策略規則就默認容許了這種ping命令檢測行爲。

[root@linuxprobe ~]# iptables -I INPUT -p icmp -j ACCEPT (-j指定匹配到以後怎麼去作)
[root@linuxprobe ~]# ping -c 4 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.156 ms
64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.117 ms
64 bytes from 192.168.10.10: icmp_seq=3 ttl=64 time=0.099 ms
64 bytes from 192.168.10.10: icmp_seq=4 ttl=64 time=0.090 ms
--- 192.168.10.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.090/0.115/0.156/0.027 ms

刪除INPUT規則鏈中剛剛加入的那條策略(容許ICMP流量),並把默認策略設置爲容許:

[root@linuxprobe ~]# iptables -D INPUT 1      (刪除第一條
[root@linuxprobe ~]# iptables -P INPUT ACCEPT
[root@linuxprobe ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
………………省略部分輸出信息………………

將INPUT規則鏈設置爲只容許指定網段的主機訪問本機的22端口,拒絕來自其餘全部主機的流量

[root@linuxprobe ~]# iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT
[root@linuxprobe ~]# iptables -A INPUT -p tcp --dport 22 -j REJECT
[root@linuxprobe ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination 
ACCEPT tcp -- 192.168.10.0/24 anywhere tcp dpt:ssh
REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable
………………省略部分輸出信息………………

再次重申,防火牆策略規則是按照從上到下順序匹配的,所以必定要把容許動做放到拒絕動做前面,不然全部的流量就將被拒絕掉,從而致使任何主機都沒法訪問咱們的服務。另外,這裏提到的22號端口是ssh服務使用的(有關ssh服務,請見下一章),劉遄老師先在這裏挖坑,等你們學完第9章後可再驗證這個實驗的效果。

在設置完上述INPUT規則鏈以後,咱們使用IP地址在192.168.10.0/24網段內的主機訪問服務器(即前面提到的設置了INPUT規則鏈的主機)的22端口,效果以下:

[root@Client A ~]# ssh 192.168.10.10
The authenticity of host '192.168.10.10 (192.168.10.10)' can't be established.
ECDSA key fingerprint is 70:3b:5d:37:96:7b:2e:a5:28:0d:7e:dc:47:6a:fe:5c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.10' (ECDSA) to the list of known hosts.
root@192.168.10.10's password: 
Last login: Sun Feb 12 01:50:25 2017
[root@Client A ~]#

而後,咱們再使用IP地址在192.168.20.0/24網段內的主機訪問服務器的22端口(雖網段不一樣,但已確承認以相互通訊),效果以下,就會提示鏈接請求被拒絕了(Connection failed):

[root@Client B ~]# ssh 192.168.10.10
Connecting to 192.168.10.10:22...
Could not connect to '192.168.10.10' (port 22): Connection failed.

向INPUT規則鏈中添加拒絕全部人訪問本機12345端口的策略規則

[root@linuxprobe ~]# iptables -I INPUT -p tcp --dport 12345 -j REJECT
[root@linuxprobe ~]# iptables -I INPUT -p udp --dport 12345 -j REJECT
[root@linuxprobe ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination 
REJECT udp -- anywhere anywhere udp dpt:italk reject-with icmp-port-unreachable
REJECT tcp -- anywhere anywhere tcp dpt:italk reject-with icmp-port-unreachable
ACCEPT tcp -- 192.168.10.0/24 anywhere tcp dpt:ssh
REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable
………………省略部分輸出信息………………

向INPUT規則鏈中添加拒絕192.168.10.5主機訪問本機80端口(Web服務)的策略規則

[root@linuxprobe ~]# iptables -I INPUT -p tcp -s 192.168.10.5 --dport 80 -j REJECT
[root@linuxprobe ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination 
REJECT tcp -- 192.168.10.5 anywhere tcp dpt:http reject-with icmp-port-unreachable
REJECT udp -- anywhere anywhere udp dpt:italk reject-with icmp-port-unreachable
REJECT tcp -- anywhere anywhere tcp dpt:italk reject-with icmp-port-unreachable
ACCEPT tcp -- 192.168.10.0/24 anywhere tcp dpt:ssh
REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable
………………省略部分輸出信息………………

向INPUT規則鏈中添加拒絕全部主機訪問本機10001024端口的策略規則

[root@linuxprobe ~]# iptables -A INPUT -p tcp --dport 1000:1024 -j REJECT
[root@linuxprobe ~]# iptables -A INPUT -p udp --dport 1000:1024 -j REJECT
[root@linuxprobe ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination 
REJECT tcp -- 192.168.10.5 anywhere tcp dpt:http reject-with icmp-port-unreachable
REJECT udp -- anywhere anywhere udp dpt:italk reject-with icmp-port-unreachable
REJECT tcp -- anywhere anywhere tcp dpt:italk reject-with icmp-port-unreachable
ACCEPT tcp -- 192.168.10.0/24 anywhere tcp dpt:ssh
REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable
REJECT tcp -- anywhere anywhere tcp dpts:cadlock2:1024 reject-with icmp-port-unreachable
REJECT udp -- anywhere anywhere udp dpts:cadlock2:1024 reject-with icmp-port-unreachable
………………省略部分輸出信息………………

有關iptables命令的知識講解到此就結束了,你們是否是意猶未盡?考慮到Linux防火牆的發展趨勢,你們只要能把上面的實例吸取消化,就能夠徹底搞定平常的iptables配置工做了。可是請特別注意,使用iptables命令配置的防火牆規則默認會在系統下一次重啓時失效,若是想讓配置的防火牆策略永久生效,還要執行保存命令:

[root@linuxprobe ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
8.3 Firewalld

RHEL 7系統中集成了多款防火牆管理工具,其中firewalld(Dynamic Firewall Manager of Linux systems,Linux系統的動態防火牆管理器)服務是默認的防火牆配置管理工具,它擁有基於CLI(命令行界面)和基於GUI(圖形用戶界面)的兩種管理方式。

相較於傳統的防火牆管理配置工具,firewalld支持動態更新技術並加入了區域(zone)的概念。簡單來講,區域就是firewalld預先準備了幾套防火牆策略集合(策略模板),用戶能夠根據生產場景的不一樣而選擇合適的策略集合,從而實現防火牆策略之間的快速切換。例如,咱們有一臺筆記本電腦,天天都要在辦公室、咖啡廳和家裏使用。按常理來說,這三者的安全性按照由高到低的順序來排列,應該是家庭、公司辦公室、咖啡廳。當前,咱們但願爲這檯筆記本電腦指定以下防火牆策略規則:在家中容許訪問全部服務;在辦公室內僅容許訪問文件共享服務;在咖啡廳僅容許上網瀏覽。在以往,咱們須要頻繁地手動設置防火牆策略規則,而如今只須要預設好區域集合,而後只需輕點鼠標就能夠自動切換了,從而極大地提高了防火牆策略的應用效率。firewalld中常見的區域名稱(默認爲public)以及相應的策略規則如表8-2所示。

表8-2 firewalld中經常使用的區域名稱及策略規則

區域 默認規則策略
trusted 容許全部的數據包
home 拒絕流入的流量,除非與流出的流量相關;而若是流量與ssh、mdns、ipp-client、amba-client與dhcpv6-client服務相關,則容許流量
internal 等同於home區域
work 拒絕流入的流量,除非與流出的流量相關;而若是流量與ssh、ipp-client與dhcpv6-client服務相關,則容許流量
public 拒絕流入的流量,除非與流出的流量相關;而若是流量與ssh、dhcpv6-client服務相關,則容許流量
external 拒絕流入的流量,除非與流出的流量相關;而若是流量與ssh服務相關,則容許流量
dmz 拒絕流入的流量,除非與流出的流量相關;而若是流量與ssh服務相關,則容許流量
block 拒絕流入的流量,除非與流出的流量相關
drop 拒絕流入的流量,除非與流出的流量相關

8.3.1 終端管理工具

第2章在講解Linux命令時曾經聽到,命令行終端是一種極富效率的工做方式,firewall-cmd是firewalld防火牆配置管理工具的CLI(命令行界面)版本。它的參數通常都是以「長格式」來提供的,你們不要一聽到長格式就頭大,由於RHEL 7系統支持部分命令的參數補齊,其中就包含這條命令(很酷吧)。也就是說,如今除了能用Tab鍵自動補齊命令或文件名等內容以外,還能夠用Tab鍵來補齊表8-3中所示的長格式參數了(這太棒了)。

表8-3 firewall-cmd命令中使用的參數以及做用

參數 做用
--get-default-zone 查詢默認的區域名稱
--set-default-zone=<區域名稱> 設置默認的區域,使其永久生效
--get-zones 顯示可用的區域
--get-services 顯示預先定義的服務
--get-active-zones 顯示當前正在使用的區域與網卡名稱
--add-source= 將源自此IP或子網的流量導向指定的區域
--remove-source= 再也不將源自此IP或子網的流量導向某個指定區域
--add-interface=<網卡名稱> 將源自該網卡的全部流量都導向某個指定區域
--change-interface=<網卡名稱> 將某個網卡與區域進行關聯
--list-all 顯示當前區域的網卡配置參數、資源、端口以及服務等信息
--list-all-zones 顯示全部區域的網卡配置參數、資源、端口以及服務等信息
--add-service=<服務名> 設置默認區域容許該服務的流量
--add-port=<端口號/協議> 設置默認區域容許該端口的流量
--remove-service=<服務名> 設置默認區域再也不容許該服務的流量
--remove-port=<端口號/協議> 設置默認區域再也不容許該端口的流量
--reload 讓「永久生效」的配置規則當即生效,並覆蓋當前的配置規則
--panic-on 開啓應急情況模式
--panic-off 關閉應急情況模式

與Linux系統中其餘的防火牆策略配置工具同樣,使用firewalld配置的防火牆策略默認爲運行時(Runtime)模式,又稱爲當前生效模式,並且隨着系統的重啓會失效。若是想讓配置策略一直存在,就須要使用永久(Permanent)模式了,方法就是在用firewall-cmd命令正常設置防火牆策略時添加--permanent參數,這樣配置的防火牆策略就能夠永久生效了。可是,永久生效模式有一個「不近人情」的特色,就是使用它設置的策略只有在系統重啓以後才能自動生效。若是想讓配置的策略當即生效,須要手動執行firewall-cmd --reload命令。

 

查看firewalld服務當前所使用的區域:

[root@linuxprobe ~]# firewall-cmd --get-default-zone             (查詢默認區域)
public

查詢eno16777728網卡在firewalld服務中的區域:

[root@linuxprobe ~]# firewall-cmd --get-zone-of-interface=eno16777728
public

把firewalld服務中eno16777728網卡的默認區域修改成external,並在系統重啓後生效。分別查看當前與永久模式下的區域名稱:

[root@linuxprobe ~]# firewall-cmd --permanent --zone=external --change-interface=eno16777728
success
[root@linuxprobe ~]# firewall-cmd --get-zone-of-interface=eno16777728
public
[root@linuxprobe ~]# firewall-cmd --permanent --get-zone-of-interface=eno16777728
external

把firewalld服務的當前默認區域設置爲public:

[root@linuxprobe ~]# firewall-cmd --set-default-zone=public
success
[root@linuxprobe ~]# firewall-cmd --get-default-zone 
public

啓動/關閉firewalld防火牆服務的應急情況模式,阻斷一切網絡鏈接(當遠程控制服務器時請慎用):

[root@linuxprobe ~]# firewall-cmd --panic-on
success
[root@linuxprobe ~]# firewall-cmd --panic-off
success

查詢public區域是否容許請求SSH和HTTPS協議的流量:

[root@linuxprobe ~]# firewall-cmd --zone=public --query-service=ssh
yes
[root@linuxprobe ~]# firewall-cmd --zone=public --query-service=https
no

把firewalld服務中請求HTTPS協議的流量設置爲永久容許,並當即生效:

[root@linuxprobe ~]# firewall-cmd --zone=public --add-service=https
success
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-service=https
success
[root@linuxprobe ~]# firewall-cmd --reload
success

把firewalld服務中請求HTTP協議的流量設置爲永久拒絕,並當即生效:

[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --remove-service=http 
success
[root@linuxprobe ~]# firewall-cmd --reload 
success

把在firewalld服務中訪問8080和8081端口的流量策略設置爲容許,但僅限當前生效:

[root@linuxprobe ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp
success
[root@linuxprobe ~]# firewall-cmd --zone=public --list-ports 
8080-8081/tcp

把本來訪問本機888端口的流量轉發到22端口,要且求當前和長期均有效:

流量轉發命令格式爲firewall-cmd --permanent --zone=<區域> --add-forward-port=port=<源端口號>:proto=<協議>:toport=<目標端口號>:toaddr=<目標IP地址>

[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.10.10
success
[root@linuxprobe ~]# firewall-cmd --reload
success

在客戶端使用ssh命令嘗試訪問192.168.10.10主機的888端口:

[root@client A ~]# ssh -p 888 192.168.10.10
The authenticity of host '[192.168.10.10]:888 ([192.168.10.10]:888)' can't be established.
ECDSA key fingerprint is b8:25:88:89:5c:05:b6:dd:ef:76:63:ff:1a:54:02:1a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.10.10]:888' (ECDSA) to the list of known hosts.
root@192.168.10.10's password:此處輸入遠程root管理員的密碼
Last login: Sun Jul 19 21:43:48 2017 from 192.168.10.10

firewalld中的富規則表示更細緻、更詳細的防火牆策略配置,它能夠針對系統服務、端口號、源地址和目標地址等諸多信息進行更有針對性的策略配置。它的優先級在全部的防火牆策略中也是最高的。好比,咱們能夠在firewalld服務中配置一條富規則,使其拒絕192.168.10.0/24網段的全部用戶訪問本機的ssh服務(22端口):

[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.0/24" service name="ssh" reject"
success
[root@linuxprobe ~]# firewall-cmd --reload
success

在客戶端使用ssh命令嘗試訪問192.168.10.10主機的ssh服務(22端口):

[root@client A ~]# ssh 192.168.10.10
Connecting to 192.168.10.10:22...
Could not connect to '192.168.10.10' (port 22): Connection failed.
8.3.2 圖形管理工具

在各類版本的Linux系統中,幾乎沒有能讓劉遄老師欣慰並推薦的圖形化工具,可是firewall-config作到了。它是firewalld防火牆配置管理工具的GUI(圖形用戶界面)版本,幾乎能夠實現全部以命令行來執行的操做。絕不誇張的說,即便讀者沒有紮實的Linux命令基礎,也徹底能夠經過它來妥善配置RHEL 7中的防火牆策略。firewall-config的界面如圖8-2所示,其功能具體以下。

1:選擇運行時(Runtime)模式或永久(Permanent)模式的配置。

2:可選的策略集合區域列表。

3:經常使用的系統服務列表。

4:當前正在使用的區域。

5:管理當前被選中區域中的服務。

6:管理當前被選中區域中的端口。

7:開啓或關閉SNAT(源地址轉換協議)技術。

8:設置端口轉發策略。

9:控制請求icmp服務的流量。

10:管理防火牆的富規則。

11:管理網卡設備。

12:被選中區域的服務,若勾選了相應服務前面的複選框,則表示容許與之相關的流量。

13:firewall-config工具的運行狀態。

firewall-config界面

圖8-2 firewall-config的界面

劉遄老師再囉嗦幾句。在使用firewall-config工具配置完防火牆策略以後,無須進行二次確認,由於只要有修改內容,它就自動進行保存。下面進行動手實踐環節。

咱們先將當前區域中請求http服務的流量設置爲容許,但僅限當前生效。具體配置如圖8-3所示。

容許其餘主機訪問http服務

圖8-3 放行請求http服務的流量

嘗試添加一條防火牆策略規則,使其放行訪問8080~8088端口(TCP協議)的流量,並將其設置爲永久生效,以達到系統重啓後防火牆策略依然生效的目的。在按照圖8-4所示的界面配置完畢以後,還須要在Options菜單中單擊Reload Firewalld命令,讓配置的防火牆策略當即生效(見圖8-5)。這與在命令行中執行--reload參數的效果同樣。

容許其餘主機訪問8080-8088端口

圖8-4 放行訪問8080~8088端口的流量

重啓後依然有效

圖8-5 讓配置的防火牆策略規則當即生效

前面在講解firewall-config工具的功能時,曾經提到了SNAT(Source Network Address Translation,源網絡地址轉換)技術。SNAT是一種爲了解決IP地址匱乏而設計的技術,它可使得多個內網中的用戶經過同一個外網IP接入Internet。該技術的應用很是普遍,甚至能夠說咱們天天都在使用,只不過沒有察覺到罷了。好比,當咱們經過家中的網關設備(好比無線路由器)訪問本書配套站點www.linuxprobe.com時,就用到了SNAT技術。

你們能夠看一下在網絡中不使用SNAT技術(見圖8-6)和使用SNAT技術(見圖8-7)時的狀況。在圖8-6所示的局域網中有多臺PC,若是網關服務器沒有應用SNAT技術,則互聯網中的網站服務器在收到PC的請求數據包,並回送響應數據包時,將沒法在網絡中找到這個私有網絡的IP地址,因此PC也就收不到響應數據包了。在圖8-7所示的局域網中,因爲網關服務器應用了SNAT技術,因此互聯網中的網站服務器會將響應數據包發給網關服務器,再由後者轉發給局域網中的PC。

圖8-6 沒有使用SNAT技術的網絡

圖8-7 使用SNAT技術處理過的網絡

使用iptables命令實現SNAT技術是一件很麻煩的事情,可是在firewall-config中倒是小菜一碟了。用戶只需按照圖8-8進行配置,並選中Masquerade zone複選框,就自動開啓了SNAT技術。

開啓假裝功能

圖8-8 開啓防火牆的SNAT技術

爲了讓你們直觀查看不一樣工具在實現相同功能的區別,這裏使用firewall-config工具從新演示了前面使用firewall-cmd來配置防火牆策略規則,將本機888端口的流量轉發到22端口,且要求當前和長期均有效,具體如圖8-9和圖8-10所示。

將向本機888端口的請求轉發至本機的22端口

圖8-9 配置本地的端口轉發

圖8-10 讓防火牆效策略規則當即生效

配置富規則,讓192.168.10.20主機訪問到本機的1234端口號,如圖8-11所示。

僅容許192.168.10.20主機訪問本機的1234端口

圖8-11 配置防火牆富規則策略

若是生產環境中的服務器有多塊網卡在同時提供服務(這種狀況很常見),則對內網和對外網提供服務的網卡要選擇的防火牆策略區域也是不同的。也就是說,能夠把網卡與防火牆策略區域進行綁定(見圖8-12),這樣就可使用不一樣的防火牆區域策略,對源自不一樣網卡的流量進行鍼對性的監控,效果會更好。

最後,劉遄老師想說的是,firewall-config工具真的很是實用,不少本來複雜的長命令被用圖形化按鈕替代,設置規則也簡單明瞭,足以應對平常工做。因此再次向你們強調配置防火牆策略的原則—只要能實現所需的功能,用什麼工具請隨君便。

查看網卡設備信息

圖8-12 把網卡與防火牆策略區域進行綁定

8.4 服務的訪問控制列表

TCP Wrappers是RHEL 7系統中默認啓用的一款流量監控程序,它可以根據來訪主機的地址與本機的目標服務程序做出容許或拒絕的操做。換句話說,Linux系統中其實有兩個層面的防火牆,第一種是前面講到的基於TCP/IP協議的流量過濾工具,而TCP Wrappers服務則是能容許或禁止Linux系統提供服務的防火牆,從而在更高層面保護了Linux系統的安全運行。

TCP Wrappers服務的防火牆策略由兩個控制列表文件所控制,用戶能夠編輯容許控制列表文件來放行對服務的請求流量,也能夠編輯拒絕控制列表文件來阻止對服務的請求流量。控制列表文件修改後會當即生效,系統將會先檢查容許控制列表文件(/etc/hosts.allow),若是匹配到相應的容許策略則放行流量;若是沒有匹配,則去進一步匹配拒絕控制列表文件(/etc/hosts.deny),若找到匹配項則拒絕該流量。若是這兩個文件全都沒有匹配到,則默認放行流量。

TCP Wrappers服務的控制列表文件配置起來並不複雜,經常使用的參數如表8-4所示。

表8-4 TCP Wrappers服務的控制列表文件中經常使用的參數

客戶端類型 示例 知足示例的客戶端列表
單一主機 192.168.10.10 IP地址爲192.168.10.10的主機
指定網段 192.168.10. IP段爲192.168.10.0/24的主機
指定網段 192.168.10.0/255.255.255.0 IP段爲192.168.10.0/24的主機
指定DNS後綴 .linuxprobe.com 全部DNS後綴爲.linuxprobe.com的主機
指定主機名稱 www.linuxprobe.com 主機名稱爲www.linuxprobe.com的主機
指定全部客戶端 ALL 全部主機所有包括在內

在配置TCP Wrappers服務時須要遵循兩個原則:

  1. 編寫拒絕策略規則時,填寫的是服務名稱,而非協議名稱;
  2. 建議先編寫拒絕策略規則,再編寫容許策略規則,以便直觀地看到相應的效果。

下面編寫拒絕策略規則文件,禁止訪問本機sshd服務的全部流量(無須/etc/hosts.deny文件中修改原有的註釋信息):

[root@linuxprobe ~]# vim /etc/hosts.deny
#
# hosts.deny This file contains access rules which are used to
# deny connections to network services that either use
# the tcp_wrappers library or that have been
# started through a tcp_wrappers-enabled xinetd.
#
# The rules in this file can also be set up in
# /etc/hosts.allow with a 'deny' option instead.
#
# See 'man 5 hosts_options' and 'man 5 hosts_access'
# for information on rule syntax.
# See 'man tcpd' for information on tcp_wrappers
sshd:*
[root@linuxprobe ~]# ssh 192.168.10.10
ssh_exchange_identification: read: Connection reset by peer

接下來,在容許策略規則文件中添加一條規則,使其放行源自192.168.10.0/24網段,訪問本機sshd服務的全部流量。能夠看到,服務器馬上就放行了訪問sshd服務的流量,效果很是直觀:

[root@linuxprobe ~]# vim /etc/hosts.allow
#
# hosts.allow This file contains access rules which are used to
# allow or deny connections to network services that
# either use the tcp_wrappers library or that have been
# started through a tcp_wrappers-enabled xinetd.
#
# See 'man 5 hosts_options' and 'man 5 hosts_access'
# for information on rule syntax.
# See 'man tcpd' for information on tcp_wrappers
sshd:192.168.10.

[root@linuxprobe ~]# ssh 192.168.10.10
The authenticity of host '192.168.10.10 (192.168.10.10)' can't be established.
ECDSA key fingerprint is 70:3b:5d:37:96:7b:2e:a5:28:0d:7e:dc:47:6a:fe:5c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.10' (ECDSA) to the list of known hosts.
root@192.168.10.10's password: 
Last login: Wed May 4 07:56:29 2017
[root@linuxprobe ~]# 
本章節的複習做業(答案就在問題的下一行哦,用鼠標選中便可看到的~)

 

1.在RHEL 7系統中,iptables是否已經被firewalld服務完全取代?

答:沒有,iptables和firewalld服務都可用於RHEL 7系統。

2.請簡述防火牆策略規則中DROP和REJECT的不一樣之處。

答:DROP的動做是丟包,不響應;REJECT是拒絕請求,同時向發送方回送拒絕信息。

3.如何把iptables服務的INPUT規則鏈默認策略設置爲DROP?

答:執行命令iptables -P INPUT DROP便可。

4.怎樣編寫一條防火牆策略規則,使得iptables服務能夠禁止源自192.168.10.0/24網段的流量訪問本機的sshd服務(22端口)?

答:執行命令iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j REJECT便可。

5.請簡述firewalld中區域的做用。

答:能夠依據不一樣的工做場景來調用不一樣的firewalld區域,實現大量防火牆策略規則的快速切換。

6.如何在firewalld中把默認的區域設置爲dmz?

答:執行命令firewall-cmd --set-default-zone=dmz便可。

7.如何讓firewalld中以永久(Permanent)模式配置的防火牆策略規則當即生效?

答:執行命令firewall-cmd --reload。

8.使用SNAT技術的目的是什麼?

答:SNAT是一種爲了解決IP地址匱乏而設計的技術,它可使得多個內網中的用戶經過同一個外網IP接入Internet(互聯網)。

9. TCP Wrappers服務分別有容許策略配置文件和拒絕策略配置文件,請問匹配順序是怎麼樣的?

答:TCP Wrappers會先依次匹配容許策略配置文件,而後再依次匹配拒絕策略配置文件,若是都沒有匹配到,則默認放行流量。

本文原創地址:https://www.linuxprobe.com/chapter-08.html