Linux就該這么學》最新正式版已出版上市,同學們可在線上京東網當當網淘寶網亞馬遜等電商平臺購買。

*亦可就近在新華書店購買*

章節簡述:

保障數據的安全性是繼保障數據的可用性之后最為重要的一項工作。防火墻作為公網與內網之間的保護屏障,在保障數據的安全性方面起著至關重要的作用。考慮到大家還不了解RHEL 7中新增的firewalld防火墻與先前版本中iptables防火墻之間的區別,劉遄老師決定先帶領讀者從理論層面和實際層面正確地認識在這兩款防火墻之間的關系。

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

8.1 防火墻管理工具

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

防火墻拓撲

圖8-1? 防火墻作為公網與內網之間的保護屏障

在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 策略與規則鏈

防火墻會從上至下的順序來讀取配置的策略規則,在找到匹配項后就立即結束匹配工作并去執行匹配項中定義的行為(即放行或阻止)。如果在讀取完所有的策略規則之后沒有匹配項,就去執行默認的策略。一般而言,防火墻策略規則的設置有兩種:一種是“通”(即放行),一種是“堵”(即阻止)。當防火墻的默認策略為拒絕時(堵),就要設置允許規則(通),否則誰都進不來;如果防火墻的默認策略為允許時,就要設置拒絕規則,否則誰都能進來,防火墻也就失去了防范的作用。

iptables服務把用于處理或過濾流量的策略條目稱之為規則,多條規則可以組成一個規則鏈,而規則鏈則依據數據包處理位置的不同進行分類,具體如下:

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

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

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

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

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

一般來說,從內網向外網發送的流量一般都是可控且良性的,因此我們使用最多的就是INPUT規則鏈,該規則鏈可以增大黑客人員從外網入侵內網的難度。

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

但是,僅有策略規則還不能保證社區的安全,保安還應該知道采用什么樣的動作來處理這些匹配的流量,比如“允許”、“拒絕”、“登記”、“不理它”。這些動作對應到iptables服務的術語中分別是ACCEPT(允許流量通過)、REJECT(拒絕流量通過)、LOG(記錄日志信息)、DROP(拒絕流量通過)。“允許流量通過”和“記錄日志信息”都比較好理解,這里需要著重講解的是REJECT和DROP的不同點。就DROP來說,它是直接將流量丟棄而且不響應;REJECT則會在拒絕流量后再回復一條“您的信息已經收到,但是被扔掉了”信息,從而讓流量發送方清晰地看到數據被拒絕的響應信息。

我們來舉一個例子,讓各位讀者更直觀地理解這兩個拒絕動作的不同之處。比如有一天您正在家里看電視,突然聽到有人敲門,您透過防盜門的貓眼一看是推銷商品的,便會在不需要的情況下開門并拒絕他們(REJECT)。但如果您看到的是債主帶了十幾個小弟來討債,此時不僅要拒絕開門,還要默不作聲,偽裝成自己不在家的樣子(DROP)。

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

[[email protected] ~]# 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拒絕動作后,流量發送方會看到響應超時的提醒。但是流量發送方無法判斷流量是被拒絕,還是接收方主機當前不在線:

[[email protected] ~]# 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參數查看已有的防火墻規則鏈:

[[email protected] ~]# 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參數清空已有的防火墻規則鏈:

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

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

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

如前面所提到的防火墻策略設置無非有兩種方式,一種是“通”,一種是“堵”,當把INPUT鏈設置為默認拒絕后,就要往里面寫入允許策略了,否則所有流入的數據包都會被默認拒絕掉,同學們需要留意規則鏈的默認策略拒絕動作只能是DROP,而不能是REJECT。

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

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

[[email protected]?~]#?iptables?-I?INPUT?-p?icmp?-j?ACCEPT
[[email protected]?~]#?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流量),并把默認策略設置為允許:

[[email protected] ~]# iptables -D INPUT 1
[[email protected] ~]# iptables -P INPUT ACCEPT
[[email protected] ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
………………省略部分輸出信息………………

將INPUT規則鏈設置為只允許指定網段的主機訪問本機的22端口,拒絕來自其他所有主機的流量

[[email protected] ~]# iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT
[[email protected] ~]# iptables -A INPUT -p tcp --dport 22 -j REJECT
[[email protected]?~]# 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端口,效果如下:

[[email protected] 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.
[email protected]'s password: 
Last login: Sun Feb 12 01:50:25 2017
[[email protected] A ~]#

然后,我們再使用IP地址在192.168.20.0/24網段內的主機訪問服務器的22端口(雖網段不同,但已確認可以相互通信),效果如下,就會提示連接請求被拒絕了(Connection?failed):

[[email protected] 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端口的策略規則

[[email protected] ~]# iptables -I INPUT -p tcp --dport 12345 -j REJECT
[[email protected] ~]# iptables -I INPUT -p udp --dport 12345 -j REJECT
[[email protected] ~]# 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服務)的策略規則

[[email protected] ~]# iptables -I INPUT -p tcp -s 192.168.10.5 --dport 80 -j REJECT
[[email protected] ~]# 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端口的策略規則

[[email protected] ~]# iptables -A INPUT -p tcp --dport 1000:1024 -j REJECT
[[email protected] ~]# iptables -A INPUT -p udp --dport 1000:1024 -j REJECT
[[email protected] ~]# 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命令配置的防火墻規則默認會在系統下一次重啟時失效,如果想讓配置的防火墻策略永久生效,還要執行保存命令:

[[email protected] ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]

出現問題?大膽提問!

因讀者們硬件不同或操作錯誤都可能導致實驗配置出錯,請耐心再仔細看看操作步驟吧,不要氣餒~

Linux技術交流請加A群:560843(滿),B群:340829(推薦),C群:463590(推薦),點此查看全國群

*本群特色:通過口令驗證確保每一個群員都是《Linux就該這么學》的讀者,答疑更有針對性,不定期免費領取定制禮品。

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命令。

接下來的實驗都很簡單,但是提醒大家一定要仔細查看劉遄老師使用的是Runtime模式還是Permanent模式。如果不關注這個細節,就算是正確配置了防火墻策略,也可能無法達到預期的效果。

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

[[email protected] ~]#?firewall-cmd --get-default-zone
public

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

[[email protected] ~]# firewall-cmd --get-zone-of-interface=eno16777728
public

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

[[email protected] ~]# firewall-cmd --permanent --zone=external --change-interface=eno16777728
success
[[email protected] ~]# firewall-cmd --get-zone-of-interface=eno16777728
public
[[email protected] ~]# firewall-cmd --permanent --get-zone-of-interface=eno16777728
external

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

[[email protected] ~]#?firewall-cmd --set-default-zone=public
success
[[email protected] ~]# firewall-cmd --get-default-zone 
public

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

[[email protected] ~]# firewall-cmd --panic-on
success
[[email protected] ~]# firewall-cmd --panic-off
success

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

[[email protected] ~]# firewall-cmd --zone=public --query-service=ssh
yes
[[email protected] ~]# firewall-cmd --zone=public --query-service=https
no

把firewalld服務中請求HTTPS協議的流量設置為永久允許,并立即生效:

[[email protected] ~]# firewall-cmd --zone=public --add-service=https
success
[[email protected] ~]# firewall-cmd --permanent --zone=public --add-service=https
success
[[email protected] ~]# firewall-cmd --reload
success

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

[[email protected] ~]# firewall-cmd --permanent --zone=public --remove-service=http 
success
[[email protected] ~]# firewall-cmd --reload 
success

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

[[email protected] ~]#?firewall-cmd --zone=public --add-port=8080-8081/tcp
success
[[email protected] ~]# firewall-cmd --zone=public --list-ports 
8080-8081/tcp

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

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

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

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

[[email protected] 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.
[email protected]'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端口):

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

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

[[email protected] 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.52437949.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.52437949.com 主機名稱為www.52437949.com的主機
指定所有客戶端 ALL 所有主機全部包括在內

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

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

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

[[email protected] ~]# 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:*
[[email protected] ~]# ssh 192.168.10.10
ssh_exchange_identification: read: Connection reset by peer

接下來,在允許策略規則文件中添加一條規則,使其放行源自192.168.10.0/24網段,訪問本機sshd服務的所有流量。可以看到,服務器立刻就放行了訪問sshd服務的流量,效果非常直觀:

[[email protected] ~]# 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.

[[email protected] ~]# 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.
[email protected]'s password: 
Last login: Wed May 4 07:56:29 2017
[[email protected]?~]# 

出現問題?大膽提問!

因讀者們硬件不同或操作錯誤都可能導致實驗配置出錯,請耐心再仔細看看操作步驟吧,不要氣餒~

Linux技術交流請加A群:560843(滿),B群:340829(推薦),C群:463590(推薦),點此查看全國群

*本群特色:通過口令驗證確保每一個群員都是《Linux就該這么學》的讀者,答疑更有針對性,不定期免費領取定制禮品。

本章節的復習作業(答案就在問題的下一行哦,用鼠標選中即可看到的~)

 

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會先依次匹配允許策略配置文件,然后再依次匹配拒絕策略配置文件,如果都沒有匹配到,則默認放行流量。

本文原創地址:http://www.52437949.com/chapter-08.html編輯:劉遄,審核員:暫無