RH254-第二十六節-iptables和firewalld防火牆

防火牆管理工具


保證數據的安全性是繼可用性之後最爲重要的一項工作,防火牆技術作爲公網與內網之間的保護屏障,起着至關重要的作用。面對同學們普遍不瞭解在紅帽RHEL7系統中新舊兩款防火牆的差異,認識在紅帽RHEL7系統中firewalld防火牆服務與iptables防火牆服務之間的關係,從理論和事實層面剖析真相。

本章節內將會分別使用iptables、firewall-cmd、firewall-config和Tcp_wrappers等防火牆策略配置服務來完成數十個根據真實工作需求而設計的防火牆策略配置實驗,讓同學們不僅能夠熟練的對請求數據包流量進行過濾,還能夠基於服務程序進行允許和關閉操作,做到保證Linux系統安全萬無一失。

    保證數據安全性是繼可用性之後最爲重要的一項工作,衆所周知外部公網相比企業內網更加的“罪惡叢生”,因此防火牆技術作爲公網與內網之間的保護屏障,雖然有軟件或硬件之分,但主要功能都是依據策略對外部請求進行過濾。防火牆技術能夠做到監控每一個數據包並判斷是否有相應的匹配策略規則,直到匹配到其中一條策略規則或執行默認策略爲止,防火牆策略可以基於來源地址、請求動作或協議等信息來定製,最終僅讓合法的用戶請求流入到內網中,其餘的均被丟棄

第8章 Iptables與Firewalld防火牆。第8章 Iptables與Firewalld防火牆。

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

在紅帽RHEL7系統中Firewalld服務取代了Iptables服務,對於接觸Linux系統比較早或學習過紅帽RHEL6系統的讀者來講,突然改用Firewalld服務後確實不免會有些抵觸心理,或許會覺得Firewalld服務是一次不小的改變。但其實Iptables服務與Firewalld服務都不是真正的防火牆,它們都只是用來定義防火牆策略功能的“防火牆管理工具”而已,iptables服務會把配置好的防火牆策略交由內核層面的netfilter網絡過濾器來處理,而firewalld服務則是把配置好的防火牆策略交由內核層面的nftables包過濾框架來處理。換句話說,當前在Linux系統中其實同時有多個防火牆管理工具共同存在,它們的作用都是爲了方便運維人員管理Linux系統的防火牆策略,而咱們只要配置妥當其中一個就足夠了。雖然各個工具之間各有優劣特色,但對於防火牆策略的配置思路上是保持一致的,同學們甚至可以不用完全掌握本章節內的知識,而是在這諸多個防火牆管理工具中任選一款來學透即可,完全能夠滿足日常的工作所需

 Iptables

在較早期的Linux系統中想配置防火牆默認使用的都是iptables防火牆管理命令,而新型Firewalld防火牆管理服務已經被投入使用多年,但還記得劉遄老師在第0章0.6小節裏談到過企業不願意及時升級的原因吧,於是不論出於什麼樣的原因,目前市場上還有大量的生產環境中在使用着iptables命令來管理着防火牆的規則策略。雖然明知iptables可能有着即將被“淘汰”的命運,但爲了讓同學們不必在面試時尷尬以及看完手中這本《Linux就該這麼學》書籍後能“通吃”各個版本的Linux系統,劉遄老師覺得還是有必要把這一項技術好好賣力氣講一下,更何況各個工具的配置防火牆策略思路上大體一致,具有很高的相同性及借鑑意義。

策略與規則鏈

防火牆會從上至下來讀取規則策略,一旦匹配到了合適的就會去執行並立即結束匹配工作,但也有轉了一圈之後發現沒有匹配到合適規則的時候,那麼就會去執行默認的策略。因此對防火牆策略的設置無非有兩種,一種是“通”,一種是“堵”——當防火牆的默認策略是拒絕的,就要設置允許規則,否則誰都進不來了,而如果防火牆的默認策略是允許的,就要設置拒絕規則,否則誰都能進來了,起不到防範的作用。

iptables命令把對數據進行過濾或處理數據包的策略叫做規則,把多條規則又存放到一個規則鏈中,規則鏈是依據處理數據包位置的不同而進行的分類,包括有:在進行路由選擇前處理數據包(PREROUTING)、處理流入的數據包(INPUT)、處理流出的數據包(OUTPUT)、處理轉發的數據包(FORWARD)、在進行路由選擇後處理數據包(POSTROUTING)。從內網向外網發送的數據一般都是可控且良性的,因此顯而易見咱們使用最多的就是INPUT數據鏈,這個鏈中定義的規則起到了保證私網設施不受外網駭客侵犯的作用

比如您所居住的社區物業保安有兩條規定——“禁止小商販進入社區,各種車輛都需要登記”,這兩條安保規定很明顯應該是作用到了社區的正門(流量必須經過的地方),而不是每家每戶的防盜門上。根據前面提到的防火牆策略的匹配順序規則,咱們可以猜想有多種情況——比如來訪人員是小商販,則會被物業保安直接拒絕在大門外,也無需再對車輛進行登記,而如果來訪人員是一輛汽車,那麼因爲第一條禁止小商販策略就沒有被匹配到,因而按順序匹配到第二條策略,需要對車輛進行登記,再有如果來訪的是社區居民,則既不滿足小商販策略,也不滿足車輛登記策略,因此會執行默認的放行策略。

不過只有規則策略還不能保證社區的安全,物業保安還應該知道該怎麼樣處理這些被匹配到的流量,比如包括有“允許”、“登記”、“拒絕”、“不理他”,這些動作對應到iptables命令術語中是ACCEPT(允許流量通過)、LOG(記錄日誌信息)、REJECT(拒絕流量通過)、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拒絕動作策略後,對方會看到本機響應超時的提醒,無法判斷流量是被拒絕,還是對方主機當前不在線:

[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
基本的命令參數

iptables是一款基於命令行的防火牆策略管理工具,由於該命令是基於終端執行且存在有大量參數的,學習起來難度還是較大的,好在對於日常控制防火牆策略來講,您無需深入的瞭解諸如“四表五鏈”的理論概念,只需要掌握常用的參數並做到靈活搭配即可,以便於能夠更順暢的勝任工作所需。iptables命令可以根據數據流量的源地址、目的地址、傳輸協議、服務類型等等信息項進行匹配,一旦數據包與策略匹配上後,iptables就會根據策略所預設的動作來處理這些數據包流量,另外再來提醒下同學們防火牆策略的匹配順序規則是從上至下的,因此切記要把較爲嚴格、優先級較高的策略放到靠前位置,否則有可能產生錯誤。下表中爲讀者們總結歸納了幾乎所有常用的iptables命令參數,劉遄老師遵循《Linux就該這麼學》書籍的編寫初衷而設計了大量動手實驗,讓您無需生背硬記這些參數,可以結合下面的實例來逐個參閱即可。

參數 作用
-P 設置默認策略:iptables -P INPUT (DROP|ACCEPT)
-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鏈的默認策略設置爲拒絕:

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

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

向INPUT鏈中添加允許icmp數據包流入的允許策略:

在日常運維工作中經常會使用到ping命令來檢查對方主機是否在線,而向防火牆INPUT鏈中添加一條允許icmp協議數據包流入的策略就是默認允許了這種ping命令檢測行爲。

[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
[root@linuxprobe ~]# iptables -I INPUT -p icmp -j ACCEPT
[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鏈中的那條策略,並把默認策略還原爲允許:

[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端口,拒絕其他所有主機的數據請求流量:

防火牆策略是按照從上至下順序匹配的,因此請一定要記得把允許動作放到拒絕動作上面,否則所有的流量就先被拒絕掉了,任何人都獲取不到咱們的業務。文中提到的22端口是下面第9章節講的ssh服務做佔用的資源,劉遄老師在這裏挖個小坑~等讀者們稍後學完再回來驗證這個實驗效果吧~

[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
………………省略部分輸出信息………………

使用IP地址在192.168.10.0/24網段內的主機訪問服務器的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.
[email protected]'s password: 
Last login: Sun Feb 12 01:50:25 2017
[root@Client A ~]#

使用IP地址在192.168.20.0/24網段外的主機訪問服務器的22端口:

[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鏈中添加拒絕所有主機不能訪問本機1000至1024端口的防火牆策略:

[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防火牆管理命令的學習到此就可以結束了,考慮到以後防火牆的發展趨勢,同學們只要能把上面的實例看懂看熟就可以完全搞定日常的iptables防火牆配置工作了。但請特別留意下,iptables命令配置的防火牆規則默認會在下一次重啓時失效,所以如果您想讓配置的防火牆策略永久的生效下去,還要執行一下保存命令:

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


Firewalld

RHEL7是一個集合多款防火牆管理工具並存的系統,Firewalld動態防火牆管理器服務(Dynamic Firewall Manager of Linux systems)是目前默認的防火牆管理工具,同時擁有命令行終端和圖形化界面的配置工具,即使是對Linux命令並不熟悉的同學也能快速入門。相比於傳統的防火牆管理工具還支持了動態更新技術並加入了“zone區域”的概念,簡單來說就是爲用戶預先準備了幾套防火牆策略集合(策略模板),然後可以根據生產場景的不同而選擇合適的策略集合,實現了防火牆策略之間的快速切換。例如咱們有一臺筆記本電腦每天都要在辦公室、咖啡廳和家裏使用,按常理推斷最安全的應該是家裏的內網,其次是公司辦公室,最後是咖啡廳,如果需要在辦公室內允許文件共享服務的請求流量、回到家中需要允許所有的服務,而在咖啡店則是除了上網外不允許任何其他請求,這樣的需求應該是很常見的,在以前只能頻繁的進行手動設置,而現在只需要預設好zone區域集合,然後輕輕點擊一下就可以切換過去了上百條策略了,極大的提高了防火牆策略的應用效率,常見的zone區域名稱及應用可見下表(默認爲public):

區域 默認規則策略
trusted 允許所有的數據包。
home 拒絕流入的數據包,除非與輸出流量數據包相關或是ssh,mdns,ipp-client,samba-client與dhcpv6-client服務則允許。
internal 等同於home區域
work 拒絕流入的數據包,除非與輸出流量數據包相關或是ssh,ipp-client與dhcpv6-client服務則允許。
public 拒絕流入的數據包,除非與輸出流量數據包相關或是ssh,dhcpv6-client服務則允許。
external 拒絕流入的數據包,除非與輸出流量數據包相關或是ssh服務則允許。
dmz 拒絕流入的數據包,除非與輸出流量數據包相關或是ssh服務則允許。
block 拒絕流入的數據包,除非與輸出流量數據包相關。
drop 拒絕流入的數據包,除非與輸出流量數據包相關。

終端管理工具

命令行終端是一種極富效率的工作方式,firewall-cmd命令是Firewalld動態防火牆管理器服務的命令行終端。它的參數一般都是以“長格式”來執行的,但同學們也不用太過於擔心,因爲紅帽RHEL7系統非常酷的支持了部分命令的參數補齊,也正好包括了這條命令,也就是說現在除了能夠用Tab鍵來補齊命令或文件名等等內容,還可以用Tab鍵來補齊下列長格式參數啦(這點特別的棒)。

參數 作用
--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 讓“永久生效”的配置規則立即生效,覆蓋當前的。

如同其他的防火牆策略配置工具一樣,Firewalld服務對防火牆策略的配置默認是當前生效模式(RunTime),配置信息會隨着計算機重啓而失效,如果想要讓配置的策略一直存在,那就要使用永久生效模式(Permanent)了,方法就是在正常的命令中加入--permanent參數就可以代表針對於永久生效模式的命令了。但這個永久生效模式也有一個“不近人情”的特點,就是對它設置的策略需要重啓後才能自動生效,如果想讓配置的策略立即生效的話需要手動執行一下--reload參數。接下來具體實驗的操作步驟並不難,一定要細心看劉遄老師到底是對Runtime還是Permanent模式的操作,否則就算是策略配置100%正確也不能達到預想的效果。

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

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

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

[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防火牆服務的當前默認zone區域設置爲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.
[email protected]'s password:此處輸入遠程root用戶的密碼
Last login: Sun Jul 19 21:43:48 2017 from 192.168.10.10

在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.
圖形管理工具

縱觀Linux系統發展歷程,實在少有能如此讓劉遄老師欣慰並推薦的圖形化工具,firewall-config命令是管理Firewalld防火牆策略的圖形化工具,界面和操作都頗爲出人意料,幾乎可以實現所有命令行終端的操作,可以毫不誇張的說,即使初學者沒有紮實的Linux命令基礎,也一樣可以通過這款圖形化工具配置好RHEL7系統的防火牆策略。Firewalld防火牆圖形化的界面如圖8-2所示,功能分別爲1:選擇"當前立即生效(Runtime)"或"重啓後長期生效(Permanent)"配置、2:可選策略集合區域列表、3:常用系統服務列表、4:當前正在使用的區域、5:管理當前被選中區域中的服務、6:管理當前被選中區域中的端口、7:開啓或關閉SNAT(僞裝)技術、8:設置端口轉發策略、9:控制ICMP協議請求流量、10:管理防火牆的富規則、11:管理網卡設備、12:被選中區域的服務,前面有√的表示允許放行、13:Firewalld防火牆圖形化工具的狀態。

第8章 Iptables與Firewalld防火牆。第8章 Iptables與Firewalld防火牆。

圖8-2 Firewall-config圖形化工具首界面

劉遄老師再囉嗦提醒一下,這款Firewall-config圖形化管理工具在配置策略後,您不需要點擊保存或完成按鈕,只要有修改內容工具就會自動保存好。例如咱們先來動手試一試把當前區域中http服務的請求流量允許放行吧,但僅限當前生效,如圖8-3所示:

第8章 Iptables與Firewalld防火牆。第8章 Iptables與Firewalld防火牆。

圖8-3 配置防火牆策略允許http服務的請求流量數據

咱們嘗試添加一條允許放行8080-8088端口號(tcp協議)入站請求數據的策略,並且把配置模式提前設置爲永久長期生效,以達到重啓後依然生效的目的,配置過程如圖8-4所示,並且可以如圖8-5所示,在菜單中點擊Reload Firewalld選項,來讓配置文件立即生效,這與在命令行終端中執行了--reload參數的效果是一樣的。

第8章 Iptables與Firewalld防火牆。第8章 Iptables與Firewalld防火牆。

圖8-4 配置防火牆策略允許8080-8088端口號的請求流量數據

第8章 Iptables與Firewalld防火牆。第8章 Iptables與Firewalld防火牆。

圖8-5 讓防火牆永久生效策略配置信息立即生效

SNAT源地址轉換協議是爲了解決IP地址資源匱乏問題而設計的技術協議,SNAT技術能夠使得多個內網用戶通過一個外網IP地址上網。例如當您通過家中的網關設備(無線路由器等)訪問了《Linux就該這麼學》書籍網站的時候,實際上就已經經過SNAT技術處理了,這項技術的應用非常廣泛,甚至可以說每個人每天都在使用中,但原先咱們僅僅是使用者,或許只是沒有察覺到而已。如圖8-6所示,在一個局域網中有多臺主機,如果網關之上沒有經過SNAT處理,那麼請求過後的回覆數據包就不能在互聯網中找到這個私網IP地址,所以用戶也就不能順利取得想要的資源了,但是在如圖8-7所示的拓撲中,因使用了SNAT源地址轉換技術,服務器應答後先由網關服務器接收,再分發給內網的用戶主機,從而使得用戶順利的拿到了所需資源。

第8章 Iptables與Firewalld防火牆。第8章 Iptables與Firewalld防火牆。

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

第8章 Iptables與Firewalld防火牆。第8章 Iptables與Firewalld防火牆。

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

使用iptables命令做SNAT源地址轉換是一件很麻煩的事情,但在Firewalld防火牆圖形化工具中只需要按照如圖8-8所示,點擊開啓僞裝區域技術就自動開啓了SNAT源地址轉換技術,具體效果會在第16章節中來驗證。

第8章 Iptables與Firewalld防火牆。第8章 Iptables與Firewalld防火牆。

圖8-8 開啓防火牆的SNAT(僞裝)技術

劉遄老師儘量做“剛剛講過的實驗”,這樣以便於讓同學們直觀的看到不同工具實現相同功能時候的區別,例如圖8-9和圖8-10所示可以把所有向本機888端口請求的流量轉發到22端口上,然後讓防火牆配置策略當前及重啓後都生效。另外firewall-config圖形管理工具真的非常實用,很多原本複雜的長命令被用圖形化按鈕替代,設置規則也變得簡單了,日常工作中真的非常實用。所以有必要再次跟讀者們講清配置防火牆策略的原則——只要能實現需求的功能,無論用文本管理工具還是圖形管理工具都是可以的

第8章 Iptables與Firewalld防火牆。第8章 Iptables與Firewalld防火牆。

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

第8章 Iptables與Firewalld防火牆。第8章 Iptables與Firewalld防火牆。

圖8-10 讓防火牆永久生效策略配置信息立即生效

在Firewalld中的“富規則”代表着更細緻、更詳細的策略配置方法,咱們可以針對某個系統服務、端口號、來源地址、目的地址等諸多元素進行有針對性的策略配置,富規則策略的優先級是在策略中最高的。例如如圖8-11所示可以讓192.168.10.20的主機能夠訪問到本機的1234端口號。

第8章 Iptables與Firewalld防火牆。第8章 Iptables與Firewalld防火牆。

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

當然~如果生產環境中有多塊網卡在同時提供着服務(這種情況很常見),自然對內網和對外網的網卡要選擇的防火牆策略區域也不應是一樣的,可以如圖8-12所示把網卡與防火牆策略zone區域做綁定,這樣對不同網卡來源的請求流量進行不同策略區域的有針對性監控,效果會更好哦~

第8章 Iptables與Firewalld防火牆。第8章 Iptables與Firewalld防火牆。
圖8-12 把網卡與防火牆zone區域做綁定
服務的訪問控制列表

Tcp_wrappers是紅帽RHEL7系統中默認已經啓用的一款流量監控程序,它能夠根據來訪主機地址與本機目標服務程序做允許或拒絕操作。換句話說,Linux系統中其實有兩個層面的防火牆,第一種是前面講到的基於TCP/IP協議的流量過濾防護工具,而Tcp_wrappers服務則是能夠對系統服務進行允許和禁止的防火牆,從而在更高層面保護了Linux系統的安全運行。控制列表文件修改後會立即生效,系統將會先檢查允許策略規則文件(/etc/hosts.allow),如果匹配到相應的允許策略則直接放行請求,如果沒有匹配則會去進一步匹配拒絕策略規則文件(/etc/hosts.deny)的內容,有匹配到相應的拒絕策略就會直接拒絕該請求流量,如果兩個文件全都沒有匹配到的話也會默認放行這次的請求流量。配置服務的參數並不複雜,如下表中就已經列出了幾乎所有常見的情況:

客戶端類型 示例 滿足示例的客戶端列表
單一主機 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服務前有兩點原則必須要提前講清楚,第一,在寫禁止項目的時候一定要寫上的是服務名稱,而不是某種協議的名稱,第二,推薦先來編寫拒絕規則,這樣可以比較直觀的看到相應的效果。例如先來通過拒絕策略文件禁止下所有訪問本機sshd服務的請求數據吧(無需修改原有的註釋信息):

[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.
[email protected]'s password: 
Last login: Wed May 4 07:56:29 2017
[root@linuxprobe ~]# 
發佈了66 篇原創文章 · 獲贊 25 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章