Ubuntu based GNU/Linux 上的防火牆 (ufw) 基本設定

早期在 Linux 上設定防火牆多事透過 iptables 這隻程式在下規則,不過說真的,對於新手或是要求很基本的使用者來說,iptables 有些功能其實用不到,例如 nat, forward等等的, 而且語法有點複雜,我自己也是常常要邊翻 man page 、筆記邊操作,後來有了令一套全名叫作 Uncomplicated Firewall 的 ufw,意思就是簡單的、不複雜的防火牆,相對於 iptables 來說,ufw 是真的簡單很多了!ufw其實只是一個 iptables 的前端設定程式,最後的規則都還是會走 iptables ,而且比較複雜的功能還是要直接透過 iptables 才有辦法做到!如果想看 ufw 設定完的 iptables 結果只要用這個命令就可以看到了:iptables -L -n

今天來講一下 ufw 的"基本“使用方式,Ubuntu 14.04 有內建 ufw,Debian要自行安裝,透過 apt-get 就可以了:
$ sudo apt-get install ufw

接下來示範的操作都在 Ubuntu 14.04 上面進行,不同的系統可以會略有出入。

ufw 預設是停用的,要啟用 ufw 的話命令如下,關鍵字分別是 enable 和 disable,也就是啟用和停用,因為需要 root 權限,所以命令前面會加上 sudo:
$ sudo ufw enable
Firewall is active and enabled on system startup

同理,停用 ufw:
$ sudo ufw disable
Firewall stopped and disabled on system startup

要確認 ufw 已經啟用,可以看一下 ufw 的 status:

已啟用:
$ sudo ufw status
Status: active

未啟用:
$ sudo ufw status
Status: inactive

那防火牆的允許跟禁止規則怎麼下呢?
關鍵字是 allow 跟 deny,allow 表示允許,deny 表示拒絕

先講怎麼設定防火牆預設行為,也就是對於沒有手動設定規則的連線該怎麼處理

比較安全的設定方式,建議把預設連入設定為 deny ,也就是沒有手動設定允許通過的連線就會被擋下來:
$ sudo ufw default deny

明確一點的指令是這樣:
$ sudo ufw default deny incoming

如果沒有特別指名 incoming (連入) / outgoing (連出), ufw 就會認為你在對連入的連線下規則!

相反的,預設允許所有連入連線通過就是:
$ sudo ufw default allow

預設行為這部份在 ufw status 看不到結果,但是我們加上 verbose 請 ufw 列出詳細資訊就看的到了:
$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

那怎麼對連接埠或服務設定規則?

基本語法如下,port可以換成服務名稱:
ufw <allow/deny> <port>

也就是跟 ufw 說你要允許或是拒絕某個連接埠或是服務就可以了,例如架設部落格的話就可以這樣下,ufw 知道 http 預設是使用 80 port:
(關於 port / serveice 的對應可以參考 /etc/services)
$ sudo ufw allow http

ufw 回應:
Rule added
Rule added (v6)

設定好了之後一樣可以透過 ufw status 確認:
$ sudo ufw status
Status: active

To Action From
— —— —-
80 ALLOW Anywhere
80 (v6) ALLOW Anywhere (v6)

想要禁止 ssh 連線連入就可以:
$ sudo ufw deny ssh

如果要進一步指定套用規則在 tcp 或 udp 連線的話可以這樣下:
$ sudo ufw allow http/tcp
$ sudo ufw allow http/udp

要補充的是,這邊的規則預設都是"連入“的行為, ufw 其實可以在 deny / allow 後面接上 in / out 來表示連入或連出,如果你不想要你的電腦可以夠過標準的 http / https port 連線到期他網站,可以參考這樣的範例:

$ ufw deny out http
$ ufw deny out https

如果要刪除剛剛設定的規則呢?或是要修改?

ufw 刪除規則的方法很簡單,就是在原本的規則前面加上 delete (刪除) 這個關鍵字:
$ sudo ufw delete allow http/tcp

ufw 回應:
Rule deleted
Rule deleted (v6)

至於修改的話,就是把舊的刪掉再加入新規則囉~

接下來講針對連線 ip 設定

語法為:
ufw allow / deny from / to ip

這邊的 from / to 就跟剛剛的 in / out 有點像了,在IP的表示部份是支援網路遮罩的,例如我想要讓所有區域網路內的來源可以任意的存取這台系統上的服務可以這樣做:
(內網IP範圍請參考wiki)
$ sudo ufw allow from 10.0.0.0/8
$ sudo ufw allow from 172.16.0.0/12
$ sudo ufw allow from 192.168.0.0/16

如果我想要禁止從 192.168.1.123 這個 IP 來的連線
$ sudo ufw deny from 192.168.1.123

也可以加上 port 的條件:
$ sudo ufw deny from 192.168.1.1 port 22

假設我對外只有一個IP 192.168.1.1,而我要禁止這個IP連線到其他主機 http / https 預設的 80 / 443 port,除了剛剛的範例(ufw deny out http),也可以這樣做:
$ sudo ufw deny from 192.168.1.1 to any port 80
$ sudo ufw deny from 192.168.1.1 to any port 443

這邊用了一個關鍵字 any ,表示這個規則是用於到任何要連出的IP,同樣我們也可以用這個語法來禁止所有連入的 ssh 連線,來達到跟前面範例 ufw deny ssh 一樣的效果:
$ sudo ufw deny from any to 192.168.1.1 port 22

如果同一台主機綁了多個不同 IP,但我只想禁止外部連入其中一個IP,不要全部禁止,可以同時使用 from 跟 to 的規則

例如我只想禁止 IP 192.168.1.1 到我的 192.168.1.104 IP 的連線:
$ sudo ufw deny from 192.168.1.1 to 192.168.1.104

那這邊刪除的方法都一樣,就是在 ufw 後面加上 delete 這個關鍵字,後面接原本的規則即可
$ sudo ufw delete deny from 192.168.1.1 to 192.168.1.104

比較簡單刪除規則的方法

如果規則一多,又忘記原本下了什麼規則,要怎麼刪除規則呢?

一個方法是直接重設 ufw ,那樣會把所有規則通通清掉:
$ sudo ufw reset

Resetting all rules to installed defaults. Proceed with operation (y|n)? y
Backing up 'after.rules' to '/etc/ufw/after.rules.20160114_215851'
Backing up 'after6.rules' to '/etc/ufw/after6.rules.20160114_215851'
Backing up 'before6.rules' to '/etc/ufw/before6.rules.20160114_215851'
Backing up 'before.rules' to '/etc/ufw/before.rules.20160114_215851'
Backing up 'user6.rules' to '/lib/ufw/user6.rules.20160114_215851'
Backing up 'user.rules' to '/lib/ufw/user.rules.20160114_215851'

令一個方法是,讓 ufw 告訴我們規則的編號,在 ufw status 後面加上 numbered
$ sudo ufw status numbered

Status: active

To Action From
— —— —-
[ 1] 22 DENY OUT Anywhere
[ 2] 80 DENY IN Anywhere
[ 3] 443 DENY IN 192.168.1.123
[ 4] 23/tcp DENY IN Anywhere
[ 5] 22 (v6) DENY IN Anywhere (v6)
[ 6] 80 (v6) DENY IN Anywhere (v6)
[ 7] 443 (v6) DENY IN Anywhere (v6)
[ 8] 23/tcp (v6) DENY IN Anywhere (v6)

那個 1, 2, 3, … 8 就是規則的編號,要刪除某一條規則只要這樣就可以了:
$ sudo ufw delete 2

Deleting:
deny 80
Proceed with operation (y|n)? y
Rule deleted

最後講一下 ufw 的 logging 功能

常見防火牆會提供的日誌功能 ufw 也沒有少

啟用日誌功能:
$ sudo ufw logging on

停用日誌功能:
$ sudo ufw logging off

日誌預設會存在 /var/log/ufw.log ,如果覺得預設提供的資訊不夠多,也可以調高日誌的層級, ufw 日誌層級有 low、medium、high、full 四種,預設為 low ,從左到右分別愈驅詳細,但日誌就會佔用愈大的磁碟空間,平實建議使用 low 或 medium 即可, 有遇到攻擊或特別情況再進行調整。

說了這麼多,如果還是覺得太複雜 … 建議參考 gufw
圖形化介面的 ufw ,畫面長這樣:
gufw

一樣透過 apt-get 就可以安裝了:
$ sudo apt-get install gufw

使用上會更在簡單一點,不用打命令XD

最後補充一下,ufw 的功能其實比我想像中還多、還強大,我因為當作自己的筆記在寫,所以滿雜亂的,建議大家可以多去了解其他功能、翻官方文件,我這邊也只有提到幾個重點功能,其實 ufw 的拒絕連線其實有分reject、deny兩種,我這邊只有提到 deny,deny 的行為是只接把不允許的網路封包丟掉不處理 (drop),所以對方不會知道發生了什麼事,而 reject 雖然同樣不允許連線,但卻會回傳封包讓對方知道無法連線,且你的主機還在線上,只是連不上而已, 另外 ufw 同樣有支援 limit 的功能,可以用來防禦簡單的 DOS 攻擊,剩下的功能,就留給大家去發覺囉!

請參考
https://help.ubuntu.com/community/UFW
http://manpages.ubuntu.com/manpages/trusty/man8/ufw.8.html

1 則迴響於《Ubuntu based GNU/Linux 上的防火牆 (ufw) 基本設定

  1. 通告: God Of Network - Rickyiii

發表迴響