防火牆:iptables、ufw、TCP_Wrappers、SELinux/AppArmor
防火牆:iptables、ufw、TCP_Wrappers、SELinux/AppArmor
![]() |
網路封包進入主機的流程 |
防火牆簡介
預設的 Linux 防火牆就有兩個機制,這兩個機制都是獨立存在的。
- 第一層是封包過濾式的 netfilter 防火牆 ,使用iptables 這個程式。
- 另一個則是透過軟體控管的 TCP Wrappers 防火牆。
第一層防火牆:封包過濾 IP Filtering 或 Net Filter
就是 iptables 這個軟體所提供的防火牆功能。為何稱為封包過濾呢?因為他主要是分析 TCP/IP 的封包表頭來進行過濾的機制,主要分析的是 OSI 的第二、三、四層,主要控制的就是 MAC, IP, ICMP, TCP 與 UDP 的埠口與狀態 (SYN, ACK...) 等。
第二層防火牆:TCP Wrappers
這個功能也是針對 TCP 的 Header 進行再次的分析,同樣你可以設定一些機制來抵制某些 IP 或 Port ,好讓來源端的封包被丟棄或通過檢驗。
服務 (daemon) 的基本功能:
防火牆主要管理的是 MAC, IP, Port 等封包表頭方面的資訊,如果想要控管某些目錄可以進入, 某些目錄則無法使用的功能,那就得要透過權限以及伺服器軟體提供的相關功能了。
舉例來說,你可以在 httpd.conf 這個設定檔之內規範某些 IP 來源不能使用 httpd 這個服務來取得主機的資料, 那麼即使該 IP 通過前面兩層的過濾,他依舊無法取得主機的資源喔!
如果 httpd 這支程式本來就有問題的話,那麼 client 端將可直接利用 httpd 軟體的漏洞來入侵主機,而不需要取得主機內 root 的密碼!因此, 要小心這些啟動在網際網路上面的軟體喔!
SELinux(AppArmor) 對網路服務的細部權限控制:
簡單的說,SELinux 可以針對網路服務的權限來設定一些規則 (policy) ,讓程序能夠進行的功能有限, 因此即使使用者的檔案權限設定錯誤,以及程序有問題時,該程序能夠進行的動作還是被限制的,即使該程序使用的是 root 的權限也一樣。舉例來說,前一個步驟的 httpd 真的被 cracker 攻擊而讓對方取得 root 的使用權,由於 httpd 已經被 SELinux 控制在 /var/www/html 裡面,且能夠進行的功能已經被規範住了,因此 cracker 就無法使用該程序來進行系統的進一步破壞囉。現在這個 SELinux 一定要開啟喔!
AppArmor 是作為 SELinux 的替代品出現的,因為對 SELinux 的批評者認為它難以讓管理員設定和維護,在Ubuntu中,預設為AppArmor。
檔案系統權限:
最終網路封包其實是要向主機要求檔案系統的資料啦。 我們這裡假設你要使用 httpd 這支程式來取得系統的檔案資料,但 httpd 預設是由一個系統帳號名稱為 httpd 來啟動的,所以:你的網頁資料的權限當然就是要讓 httpd 這支程式可以讀取才行啊!如果你前面三關的設定都 OK ,最終權限設定錯誤,使用者依舊無法瀏覽你的網頁資料的。
良好的分析log登錄檔
方便管理者在未來的錯誤查詢與入侵偵測,良好的分析登錄檔的習慣是一定要建立的,尤其是 /var/log/messages 與 /var/log/secure 這些個檔案。
第一層防火牆:封包過濾 iptables、ufw
iptables 有點複雜 (請參考 : 有關 iptables的使用),Ubuntu 預設的防火牆 ufw 其實夠用的。這裡整理一些常用的 ufw 設定。
ufw 防火牆設置
ufw 的全名是 Uncomplicated Firewall,意思是不複雜的防火牆。它的指令不但好記,寫好的規則也淺顯易懂,不會像 iptables 的裹腳布又臭又長。
大部分的 Ubuntu 系統應該都已經裝好 ufw。如果你是 Debian,或是什麼特別瘦身版的 Ubuntu 的話,可以透過以下指令安裝:
- $sudo apt install ufw
開啟/關閉/重設防火牆-ufw
每次開機都會自動載入和啟用的,要注意的是,如果沒有特別的設定的話,ufw 在啟用後,預設是會關閉所有的連入要求的哩。
如果你是用 SSH 連線,別忘了要先 allow 自己的 SSH 連線。
- $sudo ufw enable # 啟用防火牆
- $sudo ufw disable # 停用防火牆
如果你把規則改爛了,想要重新來過的話,可以重設:
- $sudo ufw reset
防火牆預設規則
如果你想要規則嚴一點,可以預設封鎖所有通訊埠,再選擇性打開幾個 port;你也可以預設開放所有 port,然後再封鎖幾個 port。預設允許/封鎖的指令如下:
- $sudo ufw default allow #預設允許所有通訊埠
- $sudo ufw default deny #預設封鎖所有通訊埠
預設封鎖所有通訊埠,開啟預設提供服務的Port:
- sudo ufw allow 20 # ftp-data
- sudo ufw allow 21 # ftp
- sudo ufw allow 22 # ssh
- sudo ufw allow 80 # www
- sudo ufw allow 22/tcp #開啟 TCP 埠號 22 對外連線
- sudo ufw allow http
- sudo ufw allow https
允許/封鎖通訊埠(port)
如果你要允許 SSH port 的話,可以這樣下:
- $sudo ufw allow ssh
或是
- $sudo ufw allow 22
也可以允許或封鎖其他的 port:
- $sudo ufw allow 80 # 允許 80
- $sudo ufw allow 443 # 允許 443
- $sudo ufw deny 3389 # 封鎖 3389
- $sudo ufw deny 21 # 封鎖 21
甚至可以一次允許一個範圍的 port:
- $sudo ufw allow 6000:6007/tcp # 允許 TCP 6000~6007
- $sudo ufw allow 6000:6007/udp # 允許 UDP 6000~6007
來自特定 IP 的規則
上面的規則是針對所有 IP,如果你想要針對某些 IP 可以不受控管,你也可以這樣設定:
- $sudo ufw allow from 192.168.11.10 # 允許 192.168.11.10 的所有連線
- $sudo ufw allow from 192.168.11.0/24 # 允許 192.168.11.1~192.168.11.255 的所有連線
- $sudo ufw deny from 192.168.11.4 # 封鎖 192.168.11.4 的所有連線
如果你只是不想讓某個小明偷偷連到你的 SSH Port,你也可以針對他封鎖:
- $sudo ufw deny from 192.168.11.7 to any port 22
查看目前設了什麼規則
列出服務使用埠號詳情
- $sudo ufw app list
推薦使用這個指令來看目前設了什麼規則:
- $sudo ufw status
- $sudo ufw status numbered //(這個指令會幫你把規則前面加上編號)
- $udo ufw status verbose
如果你突然不喜歡某個規則了,可以直接刪除它:
- $sudo ufw delete 3
那個規則就不見囉!
ufw 是否自動啟動
編輯檔案 /etc/ufw/ufw.conf
- # set to yes to start on boot
- ENABLED=yes /* yes 為開啟,反之 no 則未開啟 */
ufw 規則儲存
- /var/lib/ufw/user.rules
啟用日誌記錄
如果想知道防火牆到底有沒有用或是規則有沒有達到效果的話,可以用下面的指令來啟用日誌功能,在啟用後,ufw 會把記錄寫到 /var/log/ufw.log 日誌檔。
- $sudo ufw logging on
第二層防火牆:TCP Wrappers
主要是2個設定檔
- /etc/hosts.deny , 設定服務阻擋的來源 IP
- 預設就全部服務都不提供了! 僅對 hosts.allow 中的設定對象開放
- ALL: ALL : deny
- /etc/hosts.allow 設定服務允許通過的來源 IP
- # 針對某個 IP 開放全部服務
- ALL: 221.169.40.120/32 : allow
- # 開放 ssh 服務 給特定網段
- sshd: 140.137.0.0/16 : allow
判定順序
- /etc/hosts.allow: 通過
- /etc/hosts.deny: 擋掉
- 兩個檔案規則都不符合: 通過
規則格式 ( hosts.allow, hosts.deny 通用 )
多個來源可用空格做區別。
網域表示法不支援遮罩 bit 數值表示( ex: 192.168.1.0/24 要用 /255.255.255.0)
{ 服務名稱 }: {IP, hostname, 網域}
範例1 : 本機全部的服務都接受, rsync 接受網域 192.168.1.0/24 與 10.0.0.100 其餘皆拒絕
- /etc/hosts.allow
- ALL: 127.0.0.1
- rsync: 192.168.1.0/255.255.255.0 10.0.0.100
- /etc/hosts.deny
- rsync: ALL
範例2 : 僅允許10.1.1.1、10.1.1.2的機器telnet、ftp,其他服務皆拒絕
- /etc/hosts.deny
- ALL: ALL : deny
- /etc/hosts.allow
- in.telnetd: 10.1.1.1 10.1.1.2 : allow
- in.ftpd: 10.1.1.1 10.1.1.2 : allow
優點與限制
可以用 hostname 設定。
限制
iptables 與 tcp wrapper 的作用 layer
參考資料
特色、摘要,Feature、Summary:
關鍵字、標籤,Keyword、Tag:
- Ubuntu,Linux,Security,
留言
張貼留言
Aron阿龍,謝謝您的留言互動!