在Fedora命令行下玩轉(zhuǎn)防火墻
網(wǎng)絡(luò)防火墻,顧名思義:為了阻止不需要的網(wǎng)絡(luò)連接而設(shè)置的防護(hù)性屏障。在與外界建立連接或是提供網(wǎng)絡(luò)服務(wù)時(shí)常常會用到。例如,在學(xué)?;蚴强Х葟d里使用筆記本電腦時(shí),你一定不想某個(gè)陌生人窺探你的電腦。
每個(gè) Fedora 系統(tǒng)都內(nèi)置了一款防火墻。這是 Linux 內(nèi)核網(wǎng)絡(luò)功能的一部分。本文介紹如何通過 firewall-cmd
命令修改防火墻的配置。
網(wǎng)絡(luò)基礎(chǔ)
本文并不教授計(jì)算機(jī)網(wǎng)絡(luò)的所有知識,但還是會簡單介紹一些網(wǎng)絡(luò)基礎(chǔ)。
網(wǎng)絡(luò)中的所有計(jì)算機(jī)都有一個(gè) IP 地址,可以把它想象成一個(gè)郵箱地址,有了郵箱地址,郵件才知道發(fā)往何處。每臺計(jì)算機(jī)還會擁有一組端口,端口號范圍從 0 到 65535。同樣的,你可以把這些端口想象成用來連接郵箱地址的連接點(diǎn)。
通常情況下,端口會是一個(gè)標(biāo)準(zhǔn)端口號或是根據(jù)應(yīng)用程序的應(yīng)答要求選定的一個(gè)端口范圍。例如,一臺 Web 服務(wù)器通常會保留 80 端口用于 HTTP 通信,443 端口用于 HTTPS。小于 1024 的端口主要用于系統(tǒng)或常見用途,1024-49151 端口是已經(jīng)注冊的,49152 及以上端口多為臨時(shí)使用(只限短時(shí)間使用)。
互聯(lián)網(wǎng)傳輸中最常見的兩個(gè)協(xié)議,TCP 和 UDP。當(dāng)要傳輸?shù)臄?shù)據(jù)很重要,不能有丟包時(shí),就使用 TCP 協(xié)議,如果數(shù)據(jù)包沒有按順序到達(dá),還需要重組為正確的順序。UDP 協(xié)議則更多用于對時(shí)間敏感的服務(wù),為了保證時(shí)效性,有時(shí)允許丟失部分?jǐn)?shù)據(jù)。
系統(tǒng)中運(yùn)行的應(yīng)用,例如 Web 服務(wù)器,會保留一些端口(例如上文提到的 80 和 443)。在網(wǎng)絡(luò)傳輸過程中,主機(jī)會為傳輸?shù)膬啥私⒁粋€(gè)鏈接,一端是源地址和源端口,另一端是目的地址和目的端口。
網(wǎng)絡(luò)防火墻就是基于地址、端口及其他標(biāo)準(zhǔn)的一組規(guī)則集,來對網(wǎng)絡(luò)數(shù)據(jù)的傳輸進(jìn)行屏蔽或阻斷的。通過 firewall-cmd
命令,我們就可以查看或修改防火墻的工作配置。
防火墻域(zone)
為了驗(yàn)證防火墻是否開啟,使用 firewall-cmd
命令,輸入時(shí)要加上 sudo。(通常,在運(yùn)行了 PolicyKit 的環(huán)境中,你也可以不加 sudo
)
$ sudo firewall-cmd --state
running
firewalld 服務(wù)支持任意數(shù)量的域。每個(gè)域都可以擁有獨(dú)立的配置和防護(hù)規(guī)則。一臺 Fedora 工作站的外部接口(例如 WIFI 或有線網(wǎng)卡)其默認(rèn)域?yàn)?FedoraWorkstation
。
要看有哪些域是激活狀態(tài),可以使用 -–get-active-zones
選項(xiàng)。在本示例中,有兩個(gè)網(wǎng)卡,有線以太網(wǎng)卡 wlp2s0
和虛擬(libvirt)橋接網(wǎng)卡 virbr0
:
$ sudo firewall-cmd --get-active-zones
FedoraWorkstation
interfaces: wlp2s0
libvirt
interfaces: virbr0
如果想看看默認(rèn)域是什么,或是直接查詢所有域:
$ sudo firewall-cmd --get-default-zone
FedoraWorkstation
$ sudo firewall-cmd --get-zones
FedoraServer FedoraWorkstation block dmz drop external home internal libvirt public trusted work
查詢默認(rèn)域中防火墻放行了哪些系統(tǒng),使用 -–list-services
選項(xiàng)。下例給出了一個(gè)定制系統(tǒng)的查詢結(jié)果,你可以看到與常見的結(jié)果有些不同。
$ sudo firewall-cmd --list-services
dhcpv6-client mdns samba-client ssh
該系統(tǒng)對外開啟了四個(gè)服務(wù)。每個(gè)服務(wù)都對應(yīng)一個(gè)常見端口。例如 ssh
服務(wù)對應(yīng) 22 端口。
如果要查看當(dāng)前域中防火墻還開啟了哪些端口,可以使用 --list-ports
選項(xiàng)。當(dāng)然,你也可以隨時(shí)對其他域進(jìn)行查詢:
$ sudo firewall-cmd --list-ports --zone=FedoraWorkstation
1025-65535/udp 1025-65535/tcp
結(jié)果表明,從 1025 到 65535 端口(包含 UDP 和 TCP)默認(rèn)都是開啟的。
修改域、端口及服務(wù)
以上的配置都是預(yù)先設(shè)計(jì)好的防火墻策略。是為了確保新手用戶安裝的應(yīng)用都能夠正常訪問網(wǎng)絡(luò)。如果你確定自己心里有數(shù),想要一個(gè)保護(hù)性更強(qiáng)的策略,可以將接口放入 FedoraServer
域,明確禁止所有端口的訪問。(警告:如果你的服務(wù)器之前是聯(lián)網(wǎng)狀態(tài),這么做可能會導(dǎo)致連接中斷,那你就得到機(jī)房里去修改更多的配置項(xiàng)?。?/p>
$ sudo firewall-cmd --change-interface=<ifname> --zone=FedoraServer
success
本文并不討論如何制定防火墻策略,F(xiàn)edora 社區(qū)里已經(jīng)有很多討論了。你大可以按照自身需要來修改配置。
如果你想要開放某個(gè)服務(wù)的常見端口,可以將該服務(wù)加入默認(rèn)域(或使用 --zone
指定一個(gè)不同的域)。還可以一次性將其加入多個(gè)域。下例開放了 HTTP 和 HTTPS 的常見端口 80、443:
$ sudo firewall-cmd --add-service=http --add-service=https
success
并非所有的服務(wù)都有默認(rèn)端口,不過大部分都是有的。使用 -–get-services
選項(xiàng)可以查看完整列表。
如果你想指定某個(gè)特定端口號,可以直接用數(shù)字和協(xié)議進(jìn)行配置。(多數(shù)情況下,-–add-service
和 -–add-port
這兩個(gè)選項(xiàng)是合在一起使用的)下例開啟的是 UDP 協(xié)議的網(wǎng)絡(luò)啟動(dòng)服務(wù):
$ sudo firewall-cmd --add-port=67/udp
success
重要:如果想要在系統(tǒng)重啟或是 firewalld 服務(wù)重啟后,配置仍然生效,必須在命令中加上 -–permanent
選項(xiàng)。本文中的例子只是臨時(shí)修改了配置,下次遇到系統(tǒng)重啟或是 firewalld 服務(wù)重啟,這些配置就失效了。
以上只是 firewall-cmd
和 firewalld 服務(wù)諸多功能中的一小部分。firewalld 項(xiàng)目的主頁還有更多信息值得你去探索和嘗試。