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

Posted in :

Linux 上設定防火牆iptables 有些功能其實用不到,例如 nat, forward等等的, 而且語法有點複雜,另一套防火牆 ufw (Uncomplicated Firewall ),相對於 iptables 來說,ufw 是真的簡單很多了!

ufw其實只是一個 iptables 的前端設定程式,最後的規則都還是會走 iptables ,而且比較複雜的功能還是要直接透過 iptables 才有辦法做到!

如果想看 ufw 設定完的 iptables 結果只要用這個命令就可以看到了:

iptables -L -n

Ubuntu 14.04 有內建 ufw,Debian要自行安裝,透過 apt-get 就可以了:

apt-get install ufw

在 centos 安裝:

yum install ufw

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


指令用法:

Usage: ufw COMMAND

Commands:
 enable enables the firewall
 disable disables the firewall
 default ARG set default policy
 logging LEVEL set logging to LEVEL
 allow ARGS add allow rule
 deny ARGS add deny rule
 reject ARGS add reject rule
 limit ARGS add limit rule
 delete RULE|NUM delete RULE
 insert NUM RULE insert RULE at NUM
 route RULE add route RULE
 route delete RULE|NUM delete route RULE
 route insert NUM RULE insert route RULE at NUM
 reload reload firewall
 reset reset firewall
 status show firewall status
 status numbered show firewall status as numbered list of RULES
 status verbose show verbose firewall status
 show ARG show firewall report
 version display version information

Application profile commands:
 app list list application profiles
 app info PROFILE show information on PROFILE
 app update PROFILE update PROFILE
 app default ARG set default application policy

啟用/停用

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 也沒有少

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

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

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


圖形化介面的 ufw : gufw

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

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

 

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *