LNMP架構 - firewalld 防火牆配置
操作系統:macOS 10.12
虛擬機軟體:VistualBox 5.2.0虛擬機系統:CentOS 7.4.1708 64bit
防火牆簡介
我們建立好網站並成功部署之後需要配置伺服器的防火牆才能讓其他人訪問到你的主機並讀取上面的文件(也即瀏覽你設置好的網頁文件)。在我小時候初次接觸互聯網聽到「防火牆」這個名詞感覺它是一個起阻斷作用的牆,就是可以阻斷任何非法的鏈接進入我的電腦;後來了解了一些防火牆的概念之後又覺得它是一個過濾器,會放行友善的鏈接並把不友善的鏈接全部過濾掉。
直到我看到這篇文章
你真的理解防火牆嗎 - Excelib才豁然開朗,文中將防火牆比喻為門衛,我們給門衛一個指令,比如「到 705 房間的全部放行,到 706 房間的全部阻攔」,那麼如果有人要造訪 705 的話門衛就會把其送到 705,如果有人要造訪 706 房間就會被攔住。所以防火牆其實並不能幫我們攔截不友善鏈接,如果有人帶著刀氣勢洶洶的跑過來跟門衛說我要去 705 房間,門衛也會將其放行,因為他接到的指令是「到 705 房間的全部放行」。
上面的比喻中所用的房間號(705 房間)放到防火牆上其實就是我們常說的埠號,我們配置防火牆的規則其實就是配置這些埠號的規則,也就是哪個房間讓進哪個房間不讓進。
CentOS7 中使用 firewalld 作為默認的防火牆軟體,替代了 CentOS6 中的 iptables,在我看來開發者自然有它的道理,很多人用不習慣 firewalld 會卸載掉重新安裝 iptables,我覺得很得不償失。因為 firewalld 真的非常好用,而且我覺得跟著版本走總是沒錯的,信息技術瞬息萬變,一項技術總有過時的時候。當然無論是 firewalld 還是 iptables,規劃的都是底層的 netfilter。話不多說,我們下面講解一下 firewalld 的配置方法。
首先列一下常用的埠號列表(知乎不支持表格顯示,真是蛋疼啊…):
應用:埠號
FTP:21HTTP:80HTTPS:443IMAP:143MongoDB:27017MySQL / MariaDB:3306NAMESERVER:42
POP3:110SFTP:115SMTP:25SOCKS:1080SSH:22TELNET:23
查看默認規則
查看 firewalld 是否開啟可以輸入
firewall-cmd --staten
如果結果是 running
,即為開啟;否則會返回 not running
。
如果 firewalld 沒有開啟,則可以通過
systemctl start firewalldn
來開啟 firewalld。
然後我們看一下默認的 firewalld 規則,輸入
firewall-cmd --list-alln
這裡要提一個 firewalld 中的概念,就是 service
,剛剛說過防火牆主要是管理埠的(也就是下圖中的 ports
),但是 firewalld 中新增了一個概念,就是 service
,這是一個很棒的概念,就好像 DNS 伺服器一樣,通過你輸入的域名轉到指定的 IP 地址。還是用我們剛剛說過的門衛來比喻,service
相當於門衛有一張表格,上面記錄了各個部門的房間號,如果你到了門衛那裡說我要去設計部,門衛就會在表格上查詢,設計部在 705 房間,然後就會把你帶到 705 房間,而不用我們再去思考我要去的部門房間號是多少,下圖中可以看到我並沒有開啟 SSH 的 22 號埠,但是我依舊可以用 SSH 鏈接到我的虛擬機。因為 firewalld 默認開啟了 SSH 的 service
,即 22 號埠。
firewalld 默認提供了 80+ 個服務分組,我們可以輸入
firewall-cmd --get-servicesn
去查詢支持服務的防火牆規則
這樣比較不容易看出來都有什麼服務,我們可以用
firewall-cmd --get-services | tr " " "n"n
將結果中的空格替換為換行符
添加自定義規則
如果系統內置的防火牆規則中沒有我需要的防火牆規則,而我又想自己添加怎麼辦?或者我想建立自己的服務規則,一次開啟或關閉多個埠又怎麼辦?用 service
去管理的好處就在這裡,我們可以建立自己的規則,同時開啟或關閉大量的埠,這在以前可能要輸入大量的命令,但現在只要自己建立一套規則就可以了,具體的建立方法如下,
# 拷貝 /usr/lib/firewalld/services/ssh.xml 至 /etc/firewalld/servicesncp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/servicesnn# 進入 /etc/firewalld/services 文件夾ncd /etc/firewalld/servicesnn# 重命名 ssh.xml 為 abc.xmlnmv ssh.xml abc.xmln
然後輸入
vi abc.xmln
我們將上面的 SSH
更改為我們的服務名 ABC
,下面的 port="22"
修改為我們需要管理的埠,比如 1234
,其中的 protocol
為埠所使用的協議,這個會在之後講解,這裡暫且保持為 tcp
就好。
保存好我們的 abc.xml 文件之後,重新載入防火牆配置
firewall-cmd --reloadn
然後再次獲取支持的服務
firewall-cmd --get-servicesn
會發現我們新建的服務已經在列表中了。
開啟或關閉規則
當我們需要開啟新的規則時我們輸入
firewall-cmd --add-service=abcn
就可以開啟 abc 服務埠號 1234 了。
我們可以通過
firewall-cmd --list-servicesn
查看已啟動的服務
service
的好處在於我們可以在同一個服務下同時添加多個埠,來一次性控制多個埠的開啟或關閉,只要在我們的 abc.xml 文件中添加
<port protocol="tcp" port="5678" />n
就可以同時控制 1234 埠和 5678 埠了。
如果需要移除生效的服務規則請使用
firewall-cmd --remove-service=abcn
使規則永久生效
剛剛我們使用命令添加的服務會在防火牆重載配置文件或重啟後失效,如果希望我們的規則永久生效我們需要使用 --permanent
參數,即
firewall-cmd --add-service=abc --permanentnfirewall-cmd --add-port=80/tcp --permanentn
需要注意的是,如果不添加 --permanent
,那麼配置是即時生效的,如果添加 --permanent
則需要重載或重啟後配置才會生效。另外如果需要永久生效,不只是添加規則需要添加此參數,移除規則時也同樣需要添加,否則已經移除的規則會在重載或重啟後被 firewalld 重新添加回啟用的規則列表中。
添加或刪除埠
如果我們需要添加的埠不在默認的規則列表中,而我們只是單純的想控制某個埠的開啟或關閉,又不想新建規則(因為確實還有點麻煩的),可以使用
# 開啟1234埠nfirewall-cmd --add-port=1234/tcpnn# 移除1234埠nfirewall-cmd --remove-port=1234/tcpn
快速的開啟或關閉埠。
查詢規則或埠開啟情況
除了
firewall-cmd --list-servicesnfirewall-cmd --list-portsn
可以查看所有開啟的規則或埠外,我們還可以通過
firewall-cmd --query-service=httpnfirewall-cmd --query-port=80/tcpn
查看單個規則或埠的開啟情況。
防火牆規則的作用域
最後我們來說一下 作用域 zone
的概念,firewalld 默認提供了九個不同的作用域,我們可以通過命令
firewall-cmd --get-zonesn
來列出所有的作用域,
這些作用域從完全不信任到完全信任的排序是
drop < block < public < external < dmz < work < home < internal < trustedn
關於這些區域的具體解釋參見
fedora 官方文檔不過我們不需要太過糾結這些作用域的名字,因為作用域的配置是可以修改的。建站的話使用 public 作用域就可以,也就是除了我們放行的埠外,所有的埠請求都會被拒絕。
所有的作用域都會相應的在 /usr/lib/firewalld/zones/
中有一個 xml 的配置文件,我們也可以建立自己的作用域,但是一般沒有必要這麼做,具體的建立或修改的方法參見
我就不贅述了。
推薦閱讀:
※區域網和防火牆
※windows防火牆對和第三方防火牆比,功能上有哪些區別?
※下一代防火牆(NGFW)與UTM有什麼本質上的區別?
※老外來中國,不能上facebook,google,twitter,TA們會怎麼樣?