Linux伺服器 Linux伺服器

網站伺服器建置與管理 - RockyLinux 9

網站伺服器建置與管理 > 課程內容 > 第 4 堂課 - 認識與建置防火牆

第 4 堂課 - 認識與建置防火牆

上次更新日期 2022/09/28

上週的課程雖然完成了內部區域網路的建置,我們也預先使用 firewalld 使用預設的方式, 給予內部 LAN 的用戶端先上網~但是,事實上整個 IP 轉遞 (NAT) 的機制,以及 netfilter 的機制, 大家應該還不是很清楚。這一章,我們就來了解設定一下 router 的 NAT 功能,也了解一下保護服務的防火牆系統!

學習目標

  • 了解 Linux iptables 防火牆機制
  • 熟悉 iptables 的觀察與設定語法
  • 實際設定 Linux 伺服器本機防火牆
  • 實際設定 Linux NAT 防火牆,含 SNAT 與 DNAT
  • 了解 firewalld 的領域相關性
  • 4.1: 什麼是防火牆
  • 4.2: RockyLinux 9 的防火牆機制
  • 4.3: iptables 的表格 (table) 與鏈 (chain)
  • 4.4: NAT 網路位址轉換表格
  • 4.5: 簡易的 firewalld 服務介紹
  • 4.6: 課後練習

4.1: 什麼是防火牆

什麼是防火牆呢?基本上,防火牆的主要功能就是:

  • 切割被信任(如子網域)與不被信任(如 Internet)的網段 (用 IP 判斷,為 Layer 3 的方法);
  • 劃分出可提供 Internet 的服務與必須受保護的服務 (用 IP 與 port 處理,為 Layer 3/4 的方法);
  • 分析出可接受與不可接受的封包狀態 (許多狀態封包,有點屬於防火牆的外掛功能);

而依據達成上述功能的方法不同,基本上有分為軟體防火牆以及封包過濾式防火牆:

  • 封包過濾式火牆:在 RHEL 衍生系統上面使用 Netfilter 核心防火牆機制來控制 layer2, layer3, layer4 以及某些外掛的封包過濾行為, 主要是分析訊框或封包的表頭資料來判斷是否放行該封包的一種方式;
  • 軟體式防火牆:例如某些防毒、防木馬軟體內建的軟體過濾機制,或者是類似代理伺服器 (Proxy) 的功能,也都能算是某種特殊的軟體防火牆。

無論何種防火牆,大多是設定一堆流程與規則,讓封包要進入到本機前,需要通過這些規則的順序,以達到放行或者是拒絕的程序。

  • 封包過濾型防火牆

開始了解 netfilter 之前,這裡先告知一下,其實早期 (事實上,目前還是存在的!) 有用比較簡單的方式,那就是使用 tcp_wrapper 的方式來抵擋服務的進出! 只要修改 /etc/hosts.deny 與 /etc/hosts.allow 即可!這種方式主要透過一個名為 tcpd 的軟體來控管~但由於現在的 netfilter 的功能太強大, 因此目前很少人使用 tcp wrapper 了!

不過,萬一你接手一台舊 server (意思就是,原先不是你建置的,可能是實驗室或是公司的老機器),然後怎麼處理 netfilter 的機制都無法順利達成某些任務, 甚至於關閉 netfilter 都還有防火牆的管制時,記得去 /etc/hosts.allow 及 /etc/hosts.deny 瞧一瞧是否有異狀 (基本上,目前這兩個檔案的內容應該都是空的才對!)

基本上,封包過濾的防火牆就是根據封包的分析資料 "比對" 你預先定義的規則內容,若封包資料與規則內容相同則進行動作,否則就繼續下一條規則的比對!』 重點在那個『比對與分析順序』上。以底下的過濾流程圖示來解釋:

iptables
  1. 你要先制定一些規則,例如底下的規則順序 (有順序之分喔!)
    1. 放行本機的網路界面 (lo, 就是 localhost 那片網卡)
    2. 放行 ICMP 這個封包檢測的功能 (例如 ping 就是其中一種 icmp 封包)
    3. 放行本機自己的回應封包 (就是本機自己向外要求的封包回應訊息,例如去 centos 官網後,官網回傳的訊息)
    4. 放行區域網路連線到自己本機的 ssh 服務要求。
    5. 放行來源為區域網路的所有要求
    6. 拒絕全部的連線
    7. 放行整個 Internet 連線到自己本機的 www 服務要求。
  2. 當有任何網路來源對你這部系統發起連線時,就需要通過上面四個流程,而只要有任何一個流程通過,後面的流程就不會被檢測 (重要的項目排在前面較佳)。
  3. 萬一發起連線的封包並沒有符合任何一條規則時,那系統就會使用預設政策 ( Policy ) 來決定該連線封包是否放行。
  4. 通常建議網路主機的預設政策為丟棄,亦即『關閉所有連線,開放特定服務』的設定機制較佳。
例題 4.1.A:請看 A 的幾個的流程,並且解析每條連線的通過與不通過的流程:
  1. 對自己『 ping localhost 』會通不會通?用到那條規則?
  2. 『 ssh localhost 』會通不會通?用到那條規則?
  3. 區網內用戶端對我『 ping localhost 』時?那 internet 的用戶呢?
  4. 區網內用戶端對我發起網路連線 (用瀏覽器連線我的 WWW 時)?那 internet 的用戶呢?
  5. 區網內用戶端『 ssh 我的IP 』時?那 internet 的用戶呢?
  6. 我主動連線到 www.google.com 去搜尋資料時?
  7. 區網內用戶端對我發起 FTP 連線 (用瀏覽器連線我的 FTP 服務時)?那 internet 的用戶呢?

要懂的如何解析~這樣才會理解防火牆的建置與修改喔!

4.2: RockyLinux 9 的防火牆機制

linux kernel 就是使用 iptables 這個 netfilter 的防火牆機制,由於是核心提供的防火牆,所以效能特別好。 RockyLinux 9 提供了兩個管理機制,一個直接使用 iptables 來管理,一個則透過 firewalld 這個服務來管理。但是 firewalld 需要透過專屬的 firewall-cmd 這個指令來管理,在正常一般的管理行為中, firewall-cmd 較為簡易,但若有特別的規則時,則需要使用到 firewall-cmd 的 rich rule 來管理! 其實學習 rich rule 才是王道!

不過,事實上,最終 firewalld 還是透過核心的 iptables 來達成防火牆控制。因此,在『學習防火牆機制』行為上,個人還是建議先摸一下 iptables 較佳。

例題 4.2.A:關於 firewalld 與 iptables 服務的啟動與關閉
  1. 以 systemctl 觀察目前使用的是 firewalld 還是 iptables 這兩個服務的那一個啟動了?
  2. 若沒有 iptables 這個服務,代表你的系統沒有安裝,請使用 yum 自己安裝好 iptables-nft-services 這個軟體
  3. 請關閉 firewalld 且重新開機不會啟動,請啟動 iptables 且重新開機會啟動。
  4. 如何確定 iptables 是啟動的了?
  • 會影響到防火牆的許多服務

因為虛擬化的環境中,虛擬系統需要透過本機對外連線,因此虛擬化軟體會主動的去修改實體機器的 iptables 防火牆。 不過,我們的上課環境已經就是虛擬機器,因此無須使用啟用虛擬化軟體,所以需要關閉這些軟體,避免防火牆規則一直被干擾影響。 另外,由於 Server 使用的是最小安裝,且 client 端的虛擬化軟體已經事先被鳥哥拿掉了,所以底下單純瞧瞧就好!

例題 4.2.B:先檢查有沒有 libvirtd 以及 virsh 的指令,若有這幾個指令存在,底下的練習才會生效!否則就無須進行底下的練習
  1. 使用 virsh net-list 查看是否有一個名為 default 的網路資訊?
  2. 使用 virsh net-destroy default 刪除掉這個特別的網路卡
  3. 使用 virsh net-undefine default 讓這個虛擬網路裝置不會再被啟動。
  4. 透過 systemctl 的方式關閉 libvirtd 這個特別的虛擬系統服務。
  5. 請重新開機,這樣就能夠避免虛擬化造成的防火牆被修改的問題了。

先處理好服務,等一下才有辦法繼續玩下去!

4.3: iptables 的表格 (table) 與鏈 (chain)

iptables 預設提供好多種特殊的 IP 管理表格 (所以稱為 ip tables 嘛!),基本上有三個比較常見的表格存在:

  • filter 表格:針對伺服器本機的管理行為
  • nat 表格:針對透過伺服器作為 router 之用的網路管理行為 (如 IP 分享器等)
  • mangle 表格:與特殊的封包路由旗標有關
iptables
  • iptables 針對本機的工作鏈 (chain)

針對本機的防火牆表格是 filter (過濾) 這個表格,filter 共有三個預設的鏈,分別是 INPUT, OUTPUT, FORWARD,功能如下:

  • INPUT 任何進入本機使用本機服務的封包 (包括從伺服器端回傳的回應資訊),都會經過這個鏈
  • OUTPUT 從本機主動發出的封包,包括回應給用戶端的訊息,都會經過這個鏈
  • FORWARD 沒有進入本機,但是透過本機轉遞 (例如本機為路由器的角色時) 的封包,就會經過這個鏈

一般來說,在單純的伺服器環境下 (沒有開放讓其他用戶使用本機的 ssh 等本地端服務),只要管制 INPUT 鏈即可,OUTPUT 及 FORWARD 都可以直接放行。

  • iptable 指令語法 - 觀察

使用 iptables-save 觀察防火牆的規則與順序:

[root@localhost ~]# iptables-save [-t table]
[root@localhost ~]# iptables-save -t filter; iptables-save -t nat
# Generated by iptables-save v1.8.4 on Mon Oct 12 21:49:46 2020
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [120:14633]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Mon Oct 12 21:49:46 2020
# Generated by iptables-save v1.8.4 on Mon Oct 12 21:49:46 2020
*nat
:PREROUTING ACCEPT [12:2787]
:INPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [2:136]
:OUTPUT ACCEPT [2:136]
COMMIT
# Completed on Mon Oct 12 21:49:46 2020

上表當中,出現 # 的都不用看,那僅是告知 iptables-save 的執行與輸出時間而已,至於 * 與 : 與 -A 開頭的就得要注意了:

  • 使用的表格:出現 *filter 代表使用的是 filter 這個表格
  • 使用的鏈:出現 :INPUT 代表 INPUT 的 chain ,而 ACCEPT 代表預設政策為接受,後續的 :OUTPUT, :FORWARD 都是類似的意思
  • 使用的規則:
    • -A INPUT 為 INPUT 的依順序的各個規則!因為 -A INPUT 共有 5 個,因此就是說,共有 5 個針對 INPUT chain 的規則之意。
    • -A FOWARD 僅有一條規則
    • -A OUTPUT 沒有出現,代表沒有 OUTPUT 定義規則,亦即 OUTPUT 完全使用預設政策的意思。
  • iptable 指令語法 - 清除鏈/規則,與定義預設政策

你要建立新的規則之前,最好將以前的規則全部刪除後,依序建立一條一條的規則順序,畢竟規則之間是有順序差別的!這點很重要! 清除鏈與規則需要一條一條來執行,無法一口氣執行完畢。此外,建議不要在遠端機器完整的清除鏈與規則,否則容易因為自己的不小心, 導致本機拒絕了自己的連線功能喔!

[root@localhost ~]# iptables -[F|X|Z] (清除規則|自訂鏈|統計資訊)
[root@localhost ~]# iptables -P [INPUT|OUTPUT|FORWARD] [ACCEPT|DROP]  (注意,是大寫的 P 喔!)
例題 4.2.A:依序進行如下的題目 (主要針對 filter 表格)
  1. 先針對三條鏈,全部給予 ACCEPT 的預設政策,設定完畢之後,請立刻觀察是否正確?
  2. 清除所有的規則、自訂鏈與統計資訊,完成後也請觀察是否正確?
  • iptable 指令語法 - 定義規則,針對 layer3 與 layer4 的方式

基本的語法有點像底下這樣:

[root@localhost ~]# iptables [-A INPUT] [-i lo|eth0|ens3] [-s IP/Netmask] [-d IP/Netmask] \
[-p tcp|udp [--sport ports] [--dport ports]] [-j ACCEPT|REJECT|DROP]

基本上,來源 (指的是客戶端) 通常使用 -s, --sport 來處理,目標 (指的是伺服器自己) 通常指的是 -d, --dport 就是了。

例題 4.3.A:依序設定好你的防火牆規則:
  1. 讓 lo 變成一個可信任的裝置 (任何連線連接到這個網卡,就直接放行的意思)
  2. 讓 icmp 封包變成可接受的封包類型
  3. 讓來自 Gateway IP 的來源變成是可信任的來源
  4. 讓來自內網的所有 IP 網段都成為可信任的來源
  5. 讓來自 172.16.0.0/16 的區段成為可信任的 ssh 連線來源 (意思是,其他來源沒有被放行)
  6. 讓你的伺服器變成 http 與 https 服務提供者 (可以分兩條規則撰寫)
  7. 全部的封包通通拒絕
  8. 上面的規則設定完畢後,讓你的 INPUT 規則變成 DROP,同時設定完畢之後請觀察設定是否生效了。
完成上述的功能之後,請思考在伺服器本機上:
  1. ping localhost 通不通?是那條連線的問題?
  2. ssh localhost 通不通?是那條連線的問題?
  3. culr http://www.google.com 通不通?是那條連線的問題?
  4. ping GatewayIP 通不通?是那條連線的問題?
  5. ping 168.95.1.1 通不通?是那條連線的問題?
  6. ping client 通不通?是那條連線的問題?
  7. ssh client 通不通?是那條連線的問題?
完成上述的功能之後,請思考在內部 client 的用戶端機器上:
  1. ping server 通不通?是那條連線的問題?
  2. ssh server 通不通?是那條連線的問題?
  3. curl http://server 通不通?是那條連線的問題?
  4. curl ftp://server 通不通?是那條連線的問題?
完成上述的功能之後,請思考在外部與同學可以互通的網路網段上:
  1. 『 ping 同學IP 』通不通?是那條連線的問題?
  2. 『 ssh 同學IP 』通不通?是那條連線的問題?
  3. 『 curl http://同學IP 』通不通?是那條連線的問題?
  4. 『 curl ftp://同學IP 』通不通?是那條連線的問題?
最後,請將上述的所有指令編輯成為一個 shell script 來加以執行探討!檔名就稱為 /root/firewall.sh 好了。
  • iptable 指令語法 - 針對網卡 layer2 與狀態封包的外掛模組

上個練習當中發生的最大問題,就是防火牆本身連出去的封包要回來,還得再一次進入 input 鏈去檢查!很有點麻煩! 如果避免,就得要透過回傳的封包含有 ACK 回應旗標來處理了!使用的是狀態 (state) 模組!僅須這樣進行:

[root@localhost ~]# iptables [-A INPUT] [-m state] [--state RELATED,ESTABLISHED] \
[-j ACCEPT|DROP|REJECT]
  • ESTABLISHED:已經連線成功的連線狀態;
  • RELATED:這個最常用!表示這個封包是與我們主機發送出去的封包有關

如果需要使用到 layer2 的管制網路卡,則可以使用底下的方式來處理:

[root@localhost ~]# iptables [-A INPUT] [[-m mac] [--mac-source aa:bb:cc:dd:ee:ff]] \
[-j ACCEPT|REJECT|DROP]
例題 4.3.B:修改 /root/firewall.sh 檔案,增/刪防火牆資料如下:
  1. 讓狀態回應規則成為在 lo 信任裝置後的規則 (超級重要的規則喔!)
  2. 嘗試找到 192.168.254.200 這部機器的 MAC,並將這部機器加入成為信任來源,這個規則請寫在拒絕全部封包的前一條規則。
  3. 最終讓這樣的規則儲存下來,並且重新啟動 iptables 服務,看看有沒有正常顯示出這些規則?

這就是防火牆建置的基礎功,好好練練功吧!

4.4: NAT 網路位址轉換表格

NAT 的全名是 Network Address Translation,字面上的意思是『網路位址的轉換』。由字面上的意思我們來想一想, TCP/IP 的網路封包不是有 IP 位址嗎?那 IP 位址不是有來源與目的嗎?我們的 iptables 指令就能夠修改 IP 封包的表頭資料, 連目標或來源的 IP 位址都可以修改呢!甚至連 TCP 封包表頭的 port number 也能修改!真是有趣!

但是整個 NAT 要能工作,需要核心的 ip forward 有啟動才行!

例題 4.4.A:啟動你的 ip forward 核心功能
  1. 先觀察 /proc/sys/net/ipv4/ip_forward 這個檔案的內容
  2. 修改 /etc/sysctl.conf ,加入一行『 net.ipv4.ip_forward = 1 』
  3. 使用 sysctl -p 來載入這個設定
  4. 重複觀察第一步,看看有沒有順利生效?(1 是有生效, 0 是未生效)

先來看一張圖,了解一下 nat 表格在 filter 表格的相關性:

iptables

當中的鏈意義為:

  • PREROUTING:在進行路由判斷之前所要進行的規則(DNAT/REDIRECT)
  • POSTROUTING:在進行路由判斷之後所要進行的規則(SNAT/MASQUERADE)
  • OUTPUT:與發送出去的封包有關

那 NAT 表格要幹麻用呢?最簡單的想法,一個是 IP 分享器的功能,一個是當我把 server 架設在 LAN 裡面時, 從外面來的連線就得要透過 port mapping 才行!這時就得要 NAT 的協助了!

  • SNAT:修改來源 (source)

當你想要成為 IP 分享器時,那麼所有從內部 LAN 要出去到 Internet 的封包,都要將『出去的那個 IP 改為 server 的對外 IP』, 這改的就是『來源』位址,因此稱為 SNAT!圖示如下:

iptables

當封包經過 SNAT 的偽裝之後,該偽裝的資料會紀錄到記憶體當中,當從 Internet 回來後,該回應封包會透過剛剛的紀錄, 從 PREROUTING 處,就直接自動改回原本的 IP,然後再往後送這樣。如下所示:

iptables

至於 SNAT 的基本語法為:

[root@localhost ~]# iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE

[root@localhost ~]# iptables -t nat -A POSTROUTING -o ens3 -j SNAT --to-source 192.168.1.100
  • DNAT:修改目標 (destination)

當你的 server 是架設在內網,就需要 DNAT 的協助了!

iptables

假設的情況說明如下:

  1. 外部主機想要連接到目的端的 WWW 服務,則必須要連接到我們的 NAT 伺服器上頭;
  2. 我們的 NAT 伺服器已經設定好要分析出 port 80 的封包,所以當 NAT 伺服器接到這個封包後, 會將目標 IP 由 public IP 改成 192.168.1.210 ,且將該封包相關資訊記錄下來,等待內部伺服器的回應;
  3. 上述的封包在經過路由後,來到 private 介面處,然後透過內部的 LAN 傳送到 192.168.1.210 上頭!
  4. 192.186.1.210 會回應資料給 61.xx.xx.xx ,這個回應當然會傳送到 192.168.1.2 上頭去;
  5. 經過路由判斷後,來到 NAT Postrouting 的鏈,然後透過剛剛第二步驟的記錄,將來源 IP 由 192.168.1.210 改為 public IP 後,就可以傳送出去了!

至於 DNAT 的基本語法為:

[root@localhost ~]# iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 80 \
-j DNAT --to-destination 192.168.100.10:80 

[root@localhost ~]# iptables -t nat -A PREROUTING -p tcp  --dport 80 -j REDIRECT --to-ports 8080

上面第一條是轉到後面的其他主機上,第二條則是透過 redirect 的方式轉到本機上面的某個埠口而已~比較簡單!

例題 4.4.B:建立你 server 成為 IP 分享器的 nat server 任務
  1. 加入清除 PREROUTING, POSTROUTING 的規則功能
  2. 加入你的內網進行偽裝 (MASQUERADE) 讓封包傳輸的功能
  3. 執行 firewall.sh 之後,查詢是否正常?
執行完畢之後,開始處理用戶端功能
  1. 開啟用戶端硬碟,然後依據傳統的網路 debug 流程,確認網路終於通了!
  2. 修改 yum 伺服器,使用 ksu 的 yum 伺服器作為來源
  3. 全系統更新,同時在每日 3 點全系統更新

基本上,將 SNAT 設定妥當後,我們的內網就可以順利連接到 Internet 上囉!

例題 4.4.C:讓你的區網用戶端電腦也能架設網站,修改 /root/firewall.sh,讓它可以具有如下功能:
  1. 只要想連接到本機的 port 888 的,全部重導向到 port 80 上
  2. 只要是來自外部來源 (ens3) 且想要連線到 port 8080 的,就導向到 client 那台的 port 80 上!

4.5: 簡易的 firewalld 服務介紹

在 RHCSA 的課程上面我們就講過 firewalld 這個防火牆的服務,這個 firewalld 在使用上比起 iptables 要簡單許多, 而且也不需要懂得許多特殊的概念,更有甚者, firewalld 已經預設建立的幾個領域 (zone) 的概念,來讓使用者挑選, 要讓那張網卡的資料加入哪個領域,該領域就有特定的預設規則,這樣就很容易設計防火牆。只是對於 NAT 的概念來說, 鳥哥自己認為,傳統的 iptables 概念還是比較清晰,用來講解封包的轉換會比較好。firewalld 太容易了!許多概念反而不容易講清楚啊!呵呵!

我們上面談到的 iptables 有幾個特色,包括:

  • 有內部的信任區域網路 (LAN),亦即在 team0 上面的連線,都算 LAN 的連線,該連線應該是可信任的,因此我們才會有該網域的設計
  • 有外部網域與內部網域的設計,因此我們會有需要用到核心的 IP forward 功能,以及使用到 SNAT 或 DNAT 的功能規則
  • 可能有不信任的網域,因此,可將該網域整個拒絕 (block) 掉。

要完成上面的功能,我們都是透過修改 /root/firewall.sh 來處理,如果是 firewalld 的話,他可以設計規定某些網卡帶入哪個領域, 就可以直接達成上述的功能!很簡單!預設 firewalld 會有底下的幾個領域,提供預設的規則給管理員選擇:

[root@localhost ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work

firewalld 提供上述的領域,上述的領域大致的說明是這樣的:

  • drop (丟棄領域):最低信任的領域,加入此領域的網路卡,其預設的連線封包進入政策為 DROP,只有對外 (OUTPUT 鏈) 為放行。
  • block (攔阻領域):與 drop 領域類似,但是將預設政策改為 REJECT,所以會回應用戶拒絕連線。
  • public (公開領域):是 firewalld 預設的領域,為不信任領域政策,在 Internet 上面比較常使用這種領域, 你無法信任所有的連線,但是,可能因為伺服器的需要,因此需要放行某些服務之意。
  • external (外部領域):如果有使用到 NAT 的機制,而且該網卡在 NAT 機制為對外 (亦即我們上面的介紹中,屬於 ens3 那個界面的意思) 時, 就可以使用 external 領域的意思。任何經過 external 的網卡往外的封包,基本上都預設會被偽裝 (masquerade)
  • internal (內部領域):跟 external 搭配,在 NAT 的機制中,屬於內部網路的那一邊 (亦即我們使用的 team0 那個網卡與網域界面), 大部分的連線是可信任的。
  • dmz (非軍事區):主要放置需要被隔離的重要系統,這些系統基本上是不能被一般用戶直接存取的,只有特殊的人員能夠存取這些領域的電腦。 因為系統放在這裡主要是需要被隔離的區域,因此就稱為非軍事區 (所以管制最嚴格)
  • work (工作領域):用來上班工作用的電腦,等於是辦公室裡面的桌機那樣的概念,所以旁邊都是同事,因此大部分的連線是可信任的, 而且可能還需要額外放行某些服務就是了。
  • home (家用領域):等於放在家裡的桌機,那大部分家裡的連線都放行,因此也是屬於可信任度比較高的領域。
  • trusted (可信任領域):任何連線到此領域的連線都放行!

如果你需要知道某個領域預設的規則,例如你想要知道 trusted, block 與 work 這三個領域的規則時,可以這樣查閱:

[root@localhost ~]# firewall-cmd --info-zone=trusted
trusted
  target: ACCEPT
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

[root@localhost ~]# firewall-cmd --info-zone=block
block
  target: %%REJECT%%
  icmp-block-inversion: no
.....

[root@localhost ~]# firewall-cmd --info-zone=work
work
  target: default
  icmp-block-inversion: no
.....

很明顯可以看到目標策略的差異!那目前我們使用的是那一個領域?而該領域的規則目前為何呢?可以這樣做:

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

[root@localhost ~]# firewall-cmd --get-active-zones
public
  interfaces: ens3

[root@localhost ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

因為我們的用戶端該是屬於工作場所的領域,所以推薦可以使用 work 這個領域,現在,請將動作中的領域改為 work,且觀察其規則項目:

[root@localhost ~]# firewall-cmd --set-default-zone=work

[root@localhost ~]# firewall-cmd --get-active-zones
work
  interfaces: ens3

[root@localhost ~]# firewall-cmd --list-all
work (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

基本上,跟 public 領域規則不會差太多,只是方便我們管理而已。現在,我們需要加入信任領域,就是內部網路那張卡的領域! 同時加入 http 的服務連線需求,因此你需要透過『 man firewalld.richlanguage 』去找到 Example 6 那個項目,就知道如何設計了。 至於一般設定 firewalld 時,建議直接使用 --permanent 將設定加入設定檔之後,再以 --reload 載入較佳。例如,要加入 NTP 網路校時協定時, 可以這樣做:

[root@localhost ~]# firewall-cmd --permanent --add-service=ntp

[root@localhost ~]# firewall-cmd --reload

[root@localhost ~]# firewall-cmd --list-services
cockpit dhcpv6-client ntp ssh
例題 4.5.A:讓你的 client 端使用 firewalld 防火牆機制
  1. 切換活動領域到 work 這個領域當中,並將該領域的規則進行部份修改:
    • 增加 http 服務的連線需求
    • 以 rich rule 的功能,放行內部網路 (10..../24) 成為信任網域的連線 (看 man page 來設計)
    • 上述資料加入時,最好直接加入設定檔,然後再以 firewall-cmd --reload 來重新載入較佳。
  2. 安裝 httpd 服務,同時到 /var/www/html 建立 index.html 檔案,內容為『 I amd client.lan*.dic.ksu 』
  3. 使用類似 curl http://localhost 看看 WWW 服務是否正常?
接下來詢問你的朋友群,或告知你的朋友群,讓他們在他們的用戶端電腦上面執行類似 curl http://192.168.254.*:8080/ ,能不能看到你用戶端的顯示?

4.6: 課後練習

  1. (50%)實作題:啟動 Server 作業硬碟 - unit04
    1. 網路參數的設定,請依據底下的方式來設定好你的網路環境:
      1. 建立 ens3 為外部的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
        • IPv4 的 IP位址: 172.18.255.*/24 ,其中 * 為老師規定的 IP 尾數
        • gateway 為 172.18.255.254
        • DNS 為 172.16.200.254 以及 168.95.1.1
      2. 使用 teamd 的機制建立內部區域網路的備援功能:
        • team 的界面使用 team0 卡號,且連線名稱請命名為 team0
        • team 使用 activebackup 備援功能,不要使用 loadbalance
        • team 的實體網卡 (team slave) 請使用 ens7 及 ens8 ,且其連線名稱名稱亦請命名為 ens7, ens8
        • team0 網路參數為: 172.19.*.254/24,不需要 gateway
      3. 主機名稱指定為: server*.example.dic
      4. 最終你的主機名稱與 IP 的對應為:
        server*.example.dic	172.18.255.*		別名為 server*
        server254.example.dic	172.18.255.254		別名為 server254
        server.lan*.example.dic	172.19.*.254		別名為 server
        client.lan*.example.dic	172.19.*.1		別名為 client
        
    2. 基本的伺服器作業系統設定行為:
      1. 依據底下的說明,選擇距離我們最近的成大網站來作為 yum server 的來源:
        成大 ccns 網站: https://mirror.ccns.ncku.edu.tw/howto/#rocky-linux
        請記得修改過設定檔,應該要將清單清除 (yum clean all) 較佳。
      2. 安裝相關的軟體,至少須安裝 vim-enhanced, bash-completion, net-tools, bind-utils, kernel
      3. 全系統自動升級,且每天凌晨 3 點也會自動升級一次。(請寫入 /etc/crontab 為主)
      4. 將 SELinux 修改成為 Enforcing 模式,且未來每次開機都自動為 Enforcing 才行
    3. 實際設定好本機防火牆
      1. 請關閉 firewalld 服務,並且自行安裝、啟動 iptables 服務
      2. 將預設的規則轉存到 /root/firewall.sh 這個檔案內
      3. 修改上述 firewall.sh 腳本,讓內容有點像底下這樣:
        1. 首先將全部的規則刪除 (應該有三條指令)
        2. 設定好預設政策,讓 INPUT 成為 DROP 而 OUTPUT 與 FORWARD 成為 ACCEPT
        3. 針對 INPUT 前三條規則為 (1)回應封包 (2)放行 lo 界面 (3)放行 icmp 封包
        4. 放行你自己的內部區域網路那個網域的連線要求 (針對 LAN 的信任設定)
        5. 讓 ssh 只對外部的區網放行,不會對 Internet 放行 (對 ssh 連線做限制較佳)
        6. 讓 http 針對整個 Internet 放行 (一般公開的服務設計)
        7. 最後讓確定的規則轉存到 /etc/sysconfig/iptables 這個設定檔
      4. 重新啟動 iptables 服務,然後觀察規則是否正確
    4. 實際設定好 Server 的路由功能
      1. 讓核心支援 IP 轉遞的功能,並且每次重新開機都可以自動生效
      2. 修改 /root/firewall.sh ,在該檔案加入清除 nat 表格的規則與自訂鏈的設定
      3. 增加規則:讓來自內部網路的封包,在路由判斷後,並預計由 ens3 對外網卡出去的封包,全部偽裝成為 ens3 的 IP 位址 (一般在數據機上面的就是 public IP)
      4. 在 /etc/sysconfig/iptables-config 當中增加 nf_nat_ftp 及 nf_conntrack_ftp 模組功能
      5. 上述功能在開機後依舊能夠順利啟動
    5. 針對 NAT 的設定行為:
      1. 將由 ens3 進入的封包,若要連線到本機 port 2323 時,重新導向到本機的 port 22 上。所以,當用戶端執行 ssh -p 2323 root@your_server_ip 時,確實可以使用 ssh 服務。
      2. 讓由 ens3 進入的封包,想要連線到本機 port 888 時,重新導向到 172.19.*.1 的 port 80 上面去。
  2. (20%)實作題:啟動 client 作業硬碟
    1. 網路參數的設定,請依據底下的方式來設定好:
      1. 建立 ens3 的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
        • IPv4 的 IP位址: 172.19.*.1/24 ,其中 * 為老師規定的 IP 尾數
        • gateway 為 172.19.*.254
        • DNS 為 172.16.200.254 以及 168.95.1.1
      2. 主機名稱指定為: client.lan*.example.dic
      3. 最終你的主機名稱與 IP 的對應為:
        server*.example.dic	172.18.255.*		別名為 server*
        server254.example.dic	172.18.255.254		別名為 server254
        server.lan*.example.dic	172.19.*.254		別名為 server
        client.lan*.example.dic	172.19.*.1		別名為 client
        
    2. 實際設定好本機防火牆
      1. 預設請使用 firewalld 防火牆服務,不要使用 iptables 服務!
      2. 請將預設的領域 (zone) 改為 work 領域,且 ens3 為其管理之界面網卡
      3. 預計放行的服務主要有 ssh 與 http 兩個服務,其他還可能有預設會啟用的 dhcp 用戶端服務。
      4. 查詢 rich rule (man firewalld.richlanguage),確認來自本機同一個 LAN 網段的封包,通通給予放行。
      5. 上述放行的防火牆服務,在下次重新開機後,依舊會存在才行
    3. 啟動內部服務
      1. 安裝名為 httpd 的軟體,同時設定啟動、開機啟動 httpd 這個服處等任務
      2. 撰寫 /var/www/html/index.html 的檔案,內容只須兩行,你的姓名與學號即可。
  3. (30%)簡易問答題: 從具有 GUI 及中文的用戶端 Linux ,使用『 ssh root@172.19.*.254 』登入你的 Server ,之後建立 /root/ans.txt 的檔案,並將底下各題目的答案寫入你 server 當中!
    1. 一般所謂的防火牆,依據達成方式的不同,主要分為那兩種基本的防火牆?
    2. RockyLinux 9 預設提供那兩種『防火牆服務』呢?
    3. 承上,那達成該種防火牆服務的指令又個別為何呢?
    4. RockyLinux 9 防火牆使用 Netfilter ,該機制提供的預設表格中,上課用到的是那兩個?個別針對哪種主機 (本機或後端主機) 來進行封包的過濾與重導向?
    5. 針對 Linux 本機的封包進出來說, Netfilter 主要提供的是那一個表格 (table) 的那兩個鏈 (chain) 來管理的?
    6. 那一個指令可以觀察 Netfilter 的預設政策、各鏈的流向與防火牆的規則順序?
    7. 承上,那一個檔案主要就是在紀錄這些設定的?
    8. 針對 ssh 來說,底下的錯誤要怎麼改善?寫下改善後的語法:
      iptables -A INPUT -s 192.168.0.0/16 --dport 22 -j ACCEPT
    9. 在 iptables 的動作中, REJECT 與 DROP 有什麼差別?
    10. 啟動核心的 IP 轉遞功能時,(1)需要修改哪個設定檔? (2)實際上變更的是那一個核心檔案的值?
    11. 所謂的 IP 分享器的 IP 偽裝功能,只要是修改那一個 Netfilter 的表格與鏈?
    12. 所謂的 port mapping 的功能,主要是修改那一個 Netfilter 的表格與鏈?
    13. 承上面兩題,哪個被稱為 SNAT 或 DNAT 呢?
  4. 上傳成績
    1. 請將 Server/Client 的硬碟通通啟動,並且確認兩者間的連線沒有問題;
    2. 在 Server 硬碟上面登入,然後用 root 的身份執行 vbird_server_check_unit ,並依據提示資料填寫你的學號與 IP 尾數
    3. 該程式會偵測你的系統,並且通知你哪個部份可能有問題,你需要持續觀察或者重新處理的部份會交代妥當。
    4. 若一切沒問題,螢幕就會出現如下的字樣,然後你就能夠使用 links 去檢查你的檔案是否有順利的上傳了!
    5. Please use links http://172.18.255.250/upload/unit04 to check your filename

  • 2020/10/14:修改成為 CentOS8 的版本,並且加入了比較多的 firewalld 機制介紹。
  • 2022/09/28:修改 iptables-services 變成 iptables-nft-services,同時修改完畢作業硬碟