在 Fedora 命令列下玩轉防火牆

2020-04-12 12:30:00

網路防火牆,顧名思義:為了阻止不需要的網路連線而設定的防護性屏障。在與外界建立連線或是提供網路服務時常常會用到。例如,在學校或是咖啡廳裡使用筆記型電腦時,你一定不想某個陌生人窺探你的電腦。

每個 Fedora 系統都內建了一款防火牆。這是 Linux 核心網路功能的一部分。本文介紹如何通過 firewall-cmd 命令修改防火牆的設定。

網路基礎

本文並不教授計算機網路的所有知識,但還是會簡單介紹一些網路基礎。

網路中的所有計算機都有一個 IP 地址,可以把它想象成一個郵箱地址,有了郵箱地址,郵件才知道發往何處。每台計算機還會擁有一組,埠號範圍從 0 到 65535。同樣的,你可以把這些埠想象成用來連線郵箱地址的連線點。

通常情況下,埠會是一個標準埠號或是根據應用程式的應答要求選定的一個埠範圍。例如,一台 Web 伺服器通常會保留 80 埠用於 HTTP 通訊,443 埠用於 HTTPS。小於 1024 的埠主要用於系統或常見用途,1024-49151 埠是已經註冊的,49152 及以上埠多為臨時使用(只限短時間使用)。

網際網路傳輸中最常見的兩個協定,TCPUDP。當要傳輸的資料很重要,不能有丟包時,就使用 TCP 協定,如果封包沒有按順序到達,還需要重組為正確的順序。UDP 協定則更多用於對時間敏感的服務,為了保證時效性,有時允許丟失部分資料。

系統中執行的應用,例如 Web 伺服器,會保留一些埠(例如上文提到的 80 和 443)。在網路傳輸過程中,主機會為傳輸的兩端建立一個連結,一端是源地址和源埠,另一端是目的地址和目的埠。

網路防火牆就是基於地址、埠及其他標準的一組規則集,來對網路資料的傳輸進行遮蔽或阻斷的。通過 firewall-cmd 命令,我們就可以檢視或修改防火牆的工作設定。

防火牆域(zone)

為了驗證防火牆是否開啟,使用 firewall-cmd 命令,輸入時要加上 sudo。(通常,在執行了 PolicyKit 的環境中,你也可以不加 sudo

$ sudo firewall-cmd --staterunning

firewalld 服務支援任意數量的域。每個域都可以擁有獨立的設定和防護規則。一台 Fedora 工作站的外部介面(例如 WIFI 或有線網絡卡)其預設域為 FedoraWorkstation

要看有哪些域是啟用狀態,可以使用 -–get-active-zones 選項。在本範例中,有兩個網絡卡,有線乙太網卡 wlp2s0 和虛擬(libvirt)橋接網絡卡 virbr0

$ sudo firewall-cmd --get-active-zonesFedoraWorkstation  interfaces: wlp2s0libvirt  interfaces: virbr0

如果想看看預設域是什麼,或是直接查詢所有域:

$ sudo firewall-cmd --get-default-zoneFedoraWorkstation$ sudo firewall-cmd --get-zonesFedoraServer FedoraWorkstation block dmz drop external home internal libvirt public trusted work

查詢預設域中防火牆放行了哪些系統,使用 -–list-services 選項。下例給出了一個客製化系統的查詢結果,你可以看到與常見的結果有些不同。

$ sudo firewall-cmd --list-servicesdhcpv6-client mdns samba-client ssh

該系統對外開啟了四個服務。每個服務都對應一個常見埠。例如 ssh 服務對應 22 埠。

如果要檢視當前域中防火牆還開啟了哪些埠,可以使用 --list-ports 選項。當然,你也可以隨時對其他域進行查詢:

$ sudo firewall-cmd --list-ports --zone=FedoraWorkstation1025-65535/udp 1025-65535/tcp

結果表明,從 1025 到 65535 埠(包含 UDP 和 TCP)預設都是開啟的。

修改域、埠及服務

以上的設定都是預先設計好的防火牆策略。是為了確保新手使用者安裝的應用都能夠正常存取網路。如果你確定自己心裡有數,想要一個保護性更強的策略,可以將介面放入 FedoraServer 域,明確禁止所有埠的存取。(警告:如果你的伺服器之前是聯網狀態,這麼做可能會導致連線中斷,那你就得到機房裡去修改更多的設定項!)

$ sudo firewall-cmd --change-interface=<ifname> --zone=FedoraServersuccess

本文並不討論如何制定防火牆策略,Fedora 社群裡已經有很多討論了。你大可以按照自身需要來修改設定。

如果你想要開放某個服務的常見埠,可以將該服務加入預設域(或使用 --zone 指定一個不同的域)。還可以一次性將其加入多個域。下例開放了 HTTP 和 HTTPS 的常見埠 80、443:

$ sudo firewall-cmd --add-service=http --add-service=httpssuccess

並非所有的服務都有預設埠,不過大部分都是有的。使用 -–get-services 選項可以檢視完整列表。

如果你想指定某個特定埠號,可以直接用數位和協定進行設定。(多數情況下,-–add-service-–add-port 這兩個選項是合在一起使用的)下例開啟的是 UDP 協定的網路啟動服務:

$ sudo firewall-cmd --add-port=67/udpsuccess

重要:如果想要在系統重新啟動或是 firewalld 服務重新啟動後,設定仍然生效,必須在命令中加上 -–permanent 選項。本文中的例子只是臨時修改了設定,下次遇到系統重新啟動或是 firewalld 服務重新啟動,這些設定就失效了。

以上只是 firewall-cmd 和 firewalld 服務諸多功能中的一小部分。firewalld 專案的主頁還有更多資訊值得你去探索和嘗試。