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