在 Fedora 命令行下玩轉防火牆
網路防火牆,顧名思義:為了阻止不需要的網路連接而設置的防護性屏障。在與外界建立連接或是提供網路服務時常常會用到。例如,在學校或是咖啡廳里使用筆記本電腦時,你一定不想某個陌生人窺探你的電腦。
每個 Fedora 系統都內置了一款防火牆。這是 Linux 內核網路功能的一部分。本文介紹如何通過 firewall-cmd
命令修改防火牆的配置。
網路基礎
本文並不教授計算機網路的所有知識,但還是會簡單介紹一些網路基礎。
網路中的所有計算機都有一個 IP 地址,可以把它想像成一個郵箱地址,有了郵箱地址,郵件才知道發往何處。每台計算機還會擁有一組埠,埠號範圍從 0 到 65535。同樣的,你可以把這些埠想像成用來連接郵箱地址的連接點。
通常情況下,埠會是一個標準埠號或是根據應用程序的應答要求選定的一個埠範圍。例如,一台 Web 伺服器通常會保留 80 埠用於 HTTP 通信,443 埠用於 HTTPS。小於 1024 的埠主要用於系統或常見用途,1024-49151 埠是已經註冊的,49152 及以上埠多為臨時使用(只限短時間使用)。
互聯網傳輸中最常見的兩個協議,TCP 和 UDP。當要傳輸的數據很重要,不能有丟包時,就使用 TCP 協議,如果數據包沒有按順序到達,還需要重組為正確的順序。UDP 協議則更多用於對時間敏感的服務,為了保證時效性,有時允許丟失部分數據。
系統中運行的應用,例如 Web 伺服器,會保留一些埠(例如上文提到的 80 和 443)。在網路傳輸過程中,主機會為傳輸的兩端建立一個鏈接,一端是源地址和源埠,另一端是目的地址和目的埠。
網路防火牆就是基於地址、埠及其他標準的一組規則集,來對網路數據的傳輸進行屏蔽或阻斷的。通過 firewall-cmd
命令,我們就可以查看或修改防火牆的工作配置。
防火牆域(zone)
為了驗證防火牆是否開啟,使用 firewall-cmd
命令,輸入時要加上 sudo。(通常,在運行了 PolicyKit 的環境中,你也可以不加 sudo
)
$ sudo firewall-cmd --state
running
firewalld 服務支持任意數量的域。每個域都可以擁有獨立的配置和防護規則。一台 Fedora 工作站的外部介面(例如 WIFI 或有線網卡)其默認域為 FedoraWorkstation
。
要看有哪些域是激活狀態,可以使用 -–get-active-zones
選項。在本示例中,有兩個網卡,有線乙太網卡 wlp2s0
和虛擬(libvirt)橋接網卡 virbr0
:
$ sudo firewall-cmd --get-active-zones
FedoraWorkstation
interfaces: wlp2s0
libvirt
interfaces: virbr0
如果想看看默認域是什麼,或是直接查詢所有域:
$ sudo firewall-cmd --get-default-zone
FedoraWorkstation
$ sudo firewall-cmd --get-zones
FedoraServer FedoraWorkstation block dmz drop external home internal libvirt public trusted work
查詢默認域中防火牆放行了哪些系統,使用 -–list-services
選項。下例給出了一個定製系統的查詢結果,你可以看到與常見的結果有些不同。
$ sudo firewall-cmd --list-services
dhcpv6-client mdns samba-client ssh
該系統對外開啟了四個服務。每個服務都對應一個常見埠。例如 ssh
服務對應 22 埠。
如果要查看當前域中防火牆還開啟了哪些埠,可以使用 --list-ports
選項。當然,你也可以隨時對其他域進行查詢:
$ sudo firewall-cmd --list-ports --zone=FedoraWorkstation
1025-65535/udp 1025-65535/tcp
結果表明,從 1025 到 65535 埠(包含 UDP 和 TCP)默認都是開啟的。
修改域、埠及服務
以上的配置都是預先設計好的防火牆策略。是為了確保新手用戶安裝的應用都能夠正常訪問網路。如果你確定自己心裡有數,想要一個保護性更強的策略,可以將介面放入 FedoraServer
域,明確禁止所有埠的訪問。(警告:如果你的伺服器之前是聯網狀態,這麼做可能會導致連接中斷,那你就得到機房裡去修改更多的配置項!)
$ sudo firewall-cmd --change-interface=<ifname> --zone=FedoraServer
success
本文並不討論如何制定防火牆策略,Fedora 社區里已經有很多討論了。你大可以按照自身需要來修改配置。
如果你想要開放某個服務的常見埠,可以將該服務加入默認域(或使用 --zone
指定一個不同的域)。還可以一次性將其加入多個域。下例開放了 HTTP 和 HTTPS 的常見埠 80、443:
$ sudo firewall-cmd --add-service=http --add-service=https
success
並非所有的服務都有默認埠,不過大部分都是有的。使用 -–get-services
選項可以查看完整列表。
如果你想指定某個特定埠號,可以直接用數字和協議進行配置。(多數情況下,-–add-service
和 -–add-port
這兩個選項是合在一起使用的)下例開啟的是 UDP 協議的網路啟動服務:
$ sudo firewall-cmd --add-port=67/udp
success
重要:如果想要在系統重啟或是 firewalld 服務重啟後,配置仍然生效,必須在命令中加上 -–permanent
選項。本文中的例子只是臨時修改了配置,下次遇到系統重啟或是 firewalld 服務重啟,這些配置就失效了。
以上只是 firewall-cmd
和 firewalld 服務諸多功能中的一小部分。firewalld 項目的主頁還有更多信息值得你去探索和嘗試。
via: https://fedoramagazine.org/control-the-firewall-at-the-command-line/
作者:Paul W. Frields 選題:lujun9972 譯者:tinyeyeser 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive