掌握防火牆的工做原理,以及如何設置防火牆來提升 Linux 的安全性html
全部人都據說過防火牆(哪怕僅僅是在網絡犯罪片裏看到過相關的情節設定),不少人也知道他們的計算機裏極可能正運行着防火牆,可是不多有人明白在必要的時候如何駕馭防火牆。linux
防火牆被用來攔截那些不請自來的網絡流量,然而不一樣網絡須要的安全級別也不盡相同。好比說,和在外面一家咖啡館裏使用公共 WiFi 相比,你在家裏的時候能夠更加信任網絡裏的其它計算機和設備。你或許但願計算機可以區分能夠信任和不可信任的網絡,不過最好仍是應該學會本身去管理(或者至少是覈實)你的安全設置。git
網絡裏不一樣設備之間的通訊是經過一種叫作端口的網關實現的。這裏的端口指的並非像 USB 端口 或者 HDMI 端口這樣的物理鏈接。在網絡術語中,端口是一個純粹的虛擬概念,用來表示某種類型的數據到達或離開一臺計算機時候所走的路徑。其實也能夠換個名字來稱呼,好比叫「鏈接」或者「門口」,不過 早在 1981 年的時候 它們就被稱做端口了,這個叫法也沿用至今。其實端口這個東西沒有任何特別之處,只是一種用來指代一個可能會發生數據傳輸的地址的方式。github
1972 年,發佈了一份 端口號列表(那時候的端口被稱爲「套接字」),而且今後演化爲一組衆所周知的標準端口號,幫助管理特定類型的網絡流量。好比說,你天天訪問網站的時候都會使用 80 和 443 端口,由於互聯網上的絕大多數人都贊成(或者是默認)數據從 web 服務器上傳輸的時候是經過這兩個端口的。若是想要驗證這一點,你能夠在使用瀏覽器訪問網站的時候在 URL 後面加上一個非標準的端口號碼。好比說,訪問 example.com:42
的請求會被拒絕,由於 example.com 在 42 端口上並不提供網站服務。web
若是你是經過 80 端口訪問同一個網站,就能夠(不出所料地)正常訪問了。你能夠在 URL 後面加上 :80
來指定使用 80 端口,不過因爲 80 端口是 HTTP 訪問的標準端口,因此你的瀏覽器其實已經默認在使用 80 端口了。瀏覽器
當一臺計算機(好比說 web 服務器)準備在指定端口接收網絡流量的時候,保持該端口向網絡流量開放是一種能夠接受的(也是必要的)行爲。可是不須要接收流量的端口若是也處在開放狀態就比較危險了,這就是須要用防火牆解決的問題。安全
有不少種配置防火牆的方式,這篇文章介紹 firewalld。在桌面環境下它被集成在網絡管理器裏,在終端裏則是集成在 firewall-cmd
裏。不少 Linux 發行版都預裝了這些工具。若是你的發行版裏沒有,你能夠把這篇文章當成是管理防火牆的通用性建議,在你所使用的防火牆軟件裏使用相似的方法,或者你也能夠選擇安裝 firewalld
。ruby
好比說在 Ubuntu 上,你必須啓用 universe 軟件倉庫,關閉默認的 ufw
防火牆,而後再安裝 firewalld
:bash
$ sudo systemctl disable ufw
$ sudo add-apt-repository universe
$ sudo apt install firewalld
複製代碼
Fedora、CentOS、RHEL、OpenSUSE,以及其它不少發行版默認就包含了 firewalld
。服務器
不管你使用哪一個發行版,若是但願防火牆發揮做用,就必須保持它在開啓狀態,而且設置成開機自動加載。你應該儘量減小在防火牆維護工做上所花費的精力。
$ sudo systemctl enable --now firewalld
複製代碼
或許你天天都會鏈接到不少不一樣的網絡。在工做的時候使用的是一個網絡,在咖啡館裏是另外一個,在家裏又是另外一個。你的計算機能夠判斷出哪個網絡的使用頻率比較高,可是它並不知道哪個是你信任的網絡。
一個防火牆的區域裏包含了端口開放和關閉的預設規則。你能夠經過使用區域來選擇一個對當前網絡最適用的策略。
你能夠打開網絡管理器裏的鏈接編輯器(能夠在應用菜單裏找到),或者是使用 nm-connection-editor &
命令以獲取全部可用區域的列表。
在網絡鏈接列表中,雙擊你如今所使用的網絡。
在出現的網絡配置窗口中,點擊「通用」標籤頁。
在「通用」面板中,點擊「防火牆區域」旁邊的下拉菜單以獲取全部可用區域的列表。
也可使用下面的終端命令以獲取一樣的列表:
$ sudo firewall-cmd --get-zones
複製代碼
每一個區域的名稱已經能夠透露出設計者建立這個區域的意圖,不過你也可使用下面這個終端命令獲取任何一個區域的詳細信息:
$ sudo firewall-cmd --zone work --list-all
work
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh dhcpv6-client
ports:
protocols:
[...]
複製代碼
在這個例子中,work
區域的配置是容許接收 SSH 和 DHCPv6-client 的流量,可是拒絕接收其餘任何用戶沒有明確請求的流量。(換句話說,work
區域並不會在你瀏覽網站的時候攔截 HTTP 響應流量,可是 會 攔截一個針對你計算機上 80 端口的 HTTP 請求。)
你能夠依次查看每個區域,弄清楚它們分別都容許什麼樣的流量。比較常見的有:
work
:這個區域應該在你很是信任的網絡上使用。它容許 SSH、DHCPv6 和 mDNS,而且還能夠添加更多容許的項目。該區域很是適合做爲一個基礎配置,而後在此之上根據平常辦公的需求自定義一個工做環境。public
: 用在你不信任的網絡上。這個區域的配置和工做區域是同樣的,可是你不該該再繼續添加其它任何容許項目。drop
: 全部傳入鏈接都會被丟棄,而且不會有任何響應。在不完全關閉網絡的條件下,這已是最接近隱形模式的配置了,由於只容許傳出網絡鏈接(不過隨便一個端口掃描器就能夠經過傳出流量檢測到你的計算機,因此這個區域並非一個隱形裝置)。若是你在使用公共 WiFi,這個區域能夠說是最安全的選擇;若是你以爲當前的網絡比較危險,這個區域也必定是最好的選擇。block
: 全部傳入鏈接都會被拒絕,可是會返回一個消息說明所請求的端口被禁用了。只有你主動發起的網絡鏈接是被容許的。這是一個友好版的 drop
區域,由於雖然仍是沒有任何一個端口容許傳入流量,可是說明了會拒絕接收任何不是本機主動發起的鏈接。home
: 在你信任網絡裏的其它計算機的狀況下使用這個區域。該區域只會容許你所選擇的傳入鏈接,可是你能夠根據需求添加更多的容許項目。internal
: 和工做區域相似,該區域適用於內部網絡,你應該在基本信任網絡裏的計算機的狀況下使用。你能夠根據需求開放更多的端口和服務,同時保持和工做區域不一樣的一套規則。trusted
: 接受全部的網絡鏈接。適合在故障排除的狀況下或者是在你絕對信任的網絡上使用。你能夠爲你的任何一個網絡鏈接都指定一個區域,而且對於同一個網絡的不一樣鏈接方式(好比以太網、WiFi 等等)也能夠指定不一樣的區域。
選擇你想要的區域,點擊「保存」按鈕提交修改。
養成爲網絡鏈接指定區域的習慣的最好辦法是從你最經常使用的網絡開始。爲你的家庭網絡指定家庭區域,爲工做網絡指定工做區域,爲你最喜歡的圖書館或者咖啡館的網絡指定公關區域。
一旦你爲全部經常使用的網絡都指定了一個區域,在以後加入新的網絡的時候(不管是一個新的咖啡館仍是你朋友家的網絡),試圖也爲它指定一個區域吧。這樣能夠很好地讓你意識到不一樣的網絡的安全性是不同的,你並不會僅僅由於使用了 Linux 而比任何人更加安全。
每次你加入一個新的網絡的時候,firewalld
並不會提示你進行選擇,而是會指定一個默認區域。你能夠在終端裏輸入下面這個命令來獲取你的默認區域:
$ sudo firewall-cmd --get-default
public
複製代碼
在這個例子裏,默認區域是 public
區域。你應該保證該區域有很是嚴格的限制規則,這樣在將它指定到未知網絡中的時候才比較安全。或者你也能夠設置你本身的默認區域。
好比說,若是你是一個比較多疑的人,或者須要常常接觸不可信任的網絡的話,你能夠設置一個很是嚴格的默認區域:
$ sudo firewall-cmd --set-default-zone drop
success
$ sudo firewall-cmd --get-default
drop
複製代碼
這樣一來,任何你新加入的網絡都會被指定使用 drop
區域,除非你手動將它制定爲另外一個沒有這麼嚴格的區域。
Firewalld 的開發者們並非想讓他們設定的區域可以適應世界上全部不一樣的網絡和全部級別的信任程度。你能夠直接使用這些區域,也能夠在它們基礎上進行個性化配置。
你能夠根據本身所須要進行的網絡活動決定開放或關閉哪些端口,這並不須要對防火牆有多深的理解。
在你的防火牆上添加許可的最簡單的方式就是添加預設服務。嚴格來說,你的防火牆並不懂什麼是「服務」,由於它只知道端口號碼和使用協議的類型。不過在標準和傳統的基礎之上,防火牆能夠爲你提供一套端口和協議的組合。
好比說,若是你是一個 web 開發者而且但願你的計算機對本地網絡開放(這樣你的同事就能夠看到你正在搭建的網站了),能夠添加 http
和 https
服務。若是你是一名遊戲玩家,而且在爲你的遊戲公會運行開源的 murmur 語音聊天服務器,那麼你能夠添加 murmur
服務。還有其它不少可用的服務,你可使用下面這個命令查看:
$ sudo firewall-cmd --get-services
amanda-client amanda-k5-client bacula bacula-client \
bgp bitcoin bitcoin-rpc ceph cfengine condor-collector \
ctdb dhcp dhcpv6 dhcpv6-client dns elasticsearch \
freeipa-ldap freeipa-ldaps ftp [...]
複製代碼
若是你找到了一個本身須要的服務,能夠將它添加到當前的防火牆配置中,好比說:
$ sudo firewall-cmd --add-service murmur
複製代碼
這個命令 在你的默認區域裏 添加了指定服務所須要的全部端口和協議,不過在重啓計算機或者防火牆以後就會失效。若是想讓你的修改永久有效,可使用 --permanent
標誌:
$ sudo firewall-cmd --add-service murmur --permanent
複製代碼
你也能夠將這個命令用於一個非默認區域:
$ sudo firewall-cmd --add-service murmur --permanent --zone home
複製代碼
有時候你但願容許的流量並不在 firewalld
定義的服務之中。也許你想在一個非標準的端口上運行一個常規服務,或者就是想隨意開放一個端口。
舉例來講,也許你正在運行開源的 虛擬桌遊 軟件 MapTool。因爲 MapTool 服務器應該使用哪一個端口這件事情並無一個行業標準,因此你能夠自行決定使用哪一個端口,而後在防火牆上「開一個洞」,讓它容許該端口上的流量。
實現方式和添加服務差很少:
$ sudo firewall-cmd --add-port 51234/tcp
複製代碼
這個命令 在你的默認區域 裏將 51234 端口向 TCP 傳入鏈接開放,不過在重啓計算機或者防火牆以後就會失效。若是想讓你的修改永久有效,可使用 --permanent
標誌:
$ sudo firewall-cmd --add-port 51234/tcp --permanent
複製代碼
你也能夠將這個命令用於一個非默認區域:
$ sudo firewall-cmd --add-port 51234/tcp --permanent --zone home
複製代碼
在路由器的防火牆上設置容許流量和在本機上設置的方式是不一樣的。你的路由器可能會爲它的內嵌防火牆提供一個不一樣的配置界面(原理上是相同的),不過這就超出本文範圍了。
若是你再也不須要某項服務或者某個端口了,而且設置的時候沒有使用 --permanent
標誌的話,那麼能夠經過重啓防火牆來清除修改。
若是你已經將修改設置爲永久生效了,可使用 --remove-port
或者 --remove-service
標誌來清除:
$ sudo firewall-cmd --remove-port 51234/tcp --permanent
複製代碼
你能夠經過在命令中指定一個區域以將端口或者服務從一個非默認區域中移除。
$ sudo firewall-cmd --remove-service murmur --permanent --zone home
複製代碼
你能夠隨意使用 firewalld
默認提供的這些區域,不過也徹底能夠建立本身的區域。好比若是但願有一個針對遊戲的特別區域,你能夠建立一個,而後只有在玩兒遊戲的時候切換到該區域。
若是想要建立一個新的空白區域,你能夠建立一個名爲 game
的新區域,而後從新加載防火牆規則,這樣你的新區域就啓用了:
$ sudo firewall-cmd --new-zone game --permanent
success
$ sudo firewall-cmd --reload
複製代碼
一旦建立好而且處於啓用狀態,你就能夠經過添加玩遊戲時所須要的服務和端口來實現個性化定製了。
從今天起開始思考你的防火牆策略吧。不用着急,能夠試着慢慢搭建一些合理的默認規則。你也許須要花上一段時間才能習慣於思考防火牆的配置問題,以及弄清楚你使用了哪些網絡服務,不過不管是處在什麼樣的環境裏,只要稍加探索你就可讓本身的 Linux 工做站變得更爲強大。
via: opensource.com/article/19/…
做者:Seth Kenlon 選題:lujun9972 譯者:chen-ni 校對:wxy