UFW,即Uncomplicated Firewall,是基于iptables實作的防火牆管理工具,旨在簡化配置防火牆的過程,是以實際上UFW修改的是iptables的規則。雖然iptables是一個堅實而靈活的工具,但初學者很難學習如何使用它來正确配置防火牆。如果您希望開始保護您的網絡,并且您不确定使用哪種工具,UFW可能是您的正确選擇。
本文測試環境為Ubuntu 16.04,其他系統可做參考。
0x01. 溫馨提示
如果是遠端操作的話,請做好定時防火牆失效,防止自己連接配接不上。
每10分鐘關閉防火牆
$ crontab -e
#*/10 * * * * /data/shell/stop_ufw.sh
非常簡單的代碼
$ cat /data/shell/stop_ufw.sh
#!/bin/bash
/usr/sbin/ufw disable
0x02. 環境要求
Ubuntu系統預設已經安裝了UFW,如果沒有ufw,可以手動安裝:
$ sudo apt-get update
$ sudo apt-get install ufw
0x03. 基礎配置
允許UFW管理IPV6
如果您的Ubuntu伺服器網絡支援IPv6,請確定UFW配置為支援IPv6,以便除了IPv4之外還将管理IPv6的防火牆規則。
sudo vim /etc/default/ufw
確定你的IPV6選項為yes即可:
IPV6=yes
設定預設規則
UFW預設情況下允許所有的出站連接配接,拒絕所有的入站連接配接,是以這裡首先将UFW設定為預設規則:
$ sudo ufw default deny incoming
$ sudo ufw default allow outgoing
ufw default也允許使用reject參數
允許SSH連接配接
一旦啟用UFW之後,如果沒有允許SSH連接配接,将無法再通過SSH遠端通路主機,是以在開啟防火牆之前要确認SSH連接配接已經設定為允許:
$ sudo ufw allow ssh
這裡建立一條規則,允許ssh連接配接,其實是允許22端口的連接配接,等價于:
$ sudo ufw allow 22
UFW通過/etc/services知道ssh服務使用的預設端口為22,如果你的SSH服務使用的端口不是22,則應該修改為相應 的端口号。
檢視防火牆狀态
通過以下指令檢視防火牆狀态:
$ sudo ufw status verbose
也可以不帶verbose,當防火牆處于關閉狀态時隻會顯示inactive
可以檢視剛剛添加的防火牆規則:
0x04. 啟用/禁用UFW
啟用UFW指令:
$ sudo ufw enable
該指令預設會将UFW設定為開機啟動,如果發現重新開機後UFW并沒有自動啟動,可以手動設定UFW服務開機自動啟動:
$ sudo systemctl start ufw
$ sudo systemctl enable ufw
記得檢視防火牆目前的狀态:
$ sudo ufw status
Status: active
To Action From
-- ------ ----
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
禁用UFW指令:(該指令會禁用防火牆并關閉其開機自動啟動)
$ sudo ufw disable
0x05. 啟用/禁用防火牆日志
啟用防火牆日志:
$ sudo ufw logging on
禁用防火牆日志:
$ sudo ufw logging off
可以指定日志級别sudo ufw logging low|medium|high
日志檔案在/var/log/ufw.log
内容形如:
Oct 11 11:51:31 store42 kernel: [45088.074036] [UFW BLOCK] IN=eno1 OUT= MAC=80:18:44:e1:ae:68:00:0f:e2:b1:01:01:08:00 SRC=60.169.78.143 DST=183.60.192.48 LEN=40 TOS=0x00 PREC=0x00 TTL=244 ID=1991 PROTO=TCP SPT=44007 DPT=8080 WINDOW=1024 RES=0x00 SYN URGP=0
其中前面列出了主機防火牆日志的日期、時間、主機名,後面的内容意思是
[UFW BLOCK]:表示事件描述的開始以及是何種事件。在此例中,它表示阻止了連接配接。
IN:如果它包含一個值,那麼代表該事件是傳入事件
OUT:如果它包含一個值,那麼代表事件是傳出事件
MAC:目的地和源 MAC 位址的組合
SRC:IP資料包的源IP
DST:目的地的IP
LEN:資料包長度
TTL:資料 TTL,或稱為time to live。
PROTO:資料包的協定
SPT:資料包的源端口
DPT:目标端口
WINDOW:發送方可以接收的資料包的大小
SYN URGP:訓示是否需要三次握手。 0 表示不需要。
0x06. 允許連接配接
預設情況下ufw的allow不加in允許連接配接是指允許入站連接配接,如果要指定允許出站,可以加上out,如:
$ sudo ufw allow in port #允許port入站
$ sudo ufw allow out port #允許port出站
允許指定端口的協定
通過剛才設定ssh的規則,可以知道直接allow就是允許連接配接
允許HTTP 80端口的所有連接配接:
$ sudo ufw allow http
等價于:
$ sudo ufw allow 80
允許指定範圍内的端口協定
例如,X11的連接配接端口範圍是6000-6007:
$ sudo ufw allow 6000:6007/tcp
$ sudo ufw allow 6000:6007/udp
允許指定IP的連接配接
$ sudo ufw allow from 192.168.1.100
允許192.168.1.100通路指定端口(22端口):
$ sudo ufw allow from 192.168.1.100 to any port 22
允許子網的連接配接
允許IP段192.168.1.1到192.168.1.254的所有連接配接
$ sudo ufw allow from 192.168.1.0/24
允許IP段192.168.1.0/24 通路指定端口(22端口)
$ sudo ufw allow from 192.168.1.0/24 to any port 22
指定允許通過某個網卡的連接配接
假設這裡允許eth0的80端口連接配接:
$ sudo ufw allow in on eth0 to any port 80
0x07. 拒絕連接配接
與允許連接配接一樣,隻需要将相應的allow換成deny即可,如拒絕http端口的所有連接配接:
$ sudo ufw deny http
等價于:
$ sudo ufw deny 80
拒絕指定ip的連接配接:
$ sudo ufw deny from 192.168.1.100
0x08. 删除規則
UFW有兩種方式删除防火牆規則,既可以通過規則号删除,也可以通過實際規則删除,通過規則号删除更容易。
通過規則号删除
首先檢視所有規則的規則号:
$ sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 80/tcp ALLOW IN Anywhere
[ 2] 443/tcp ALLOW IN Anywhere
[ 3] 22/tcp ALLOW IN Anywhere
[ 4] Anywhere ALLOW IN 192.168.1.0/24
然後直接delete即可,例如删除https(443)的連接配接規則:
$ sudo ufw delete 2
通過規則删除
删除allow http規則:
$ sudo ufw delete allow 80
0x09. 重置防火牆規則
$ sudo ufw reset
該指令将禁用UFW,并且删除所有已經定義的規則,不過預設該指令會對已經設定的規則進行備份
0x10. 備份/還原規則
UFW的所有規則檔案都在路徑/etc/ufw/,其中before.rules規則為UFW在運作使用者自定義的規則之前運作的規則,相應的before6.rules對應IPV6。after.rules為UFW啟用使用者自定義規則之後運作的規則。user.rules即為使用者自定義的規則。
/etc/default/ufw檔案為UFW的配置檔案。
是以可以通過直接備份這些配置檔案的方式來備份防火牆規則,需要備份的檔案有:
/etc/ufw/.rules
/lib/ufw/.rules
/etc/default/ufw # 這個配置檔案如果沒有修改過,可以不備份
修改配置檔案之後通過以下指令重新加載配置檔案:
$ sudo ufw reload
0x11. 其他
批量禁止IP
$ while read line; do sudo ufw deny from $line; done < file.txt
file.txt裡面是一個需要禁止的IP清單
參考:
1.How To Set Up a Firewall with UFW on Ubuntu
2.How to Configure a Firewall with UFW
http://notes.maxwi.com/2017/01/19/linux-command-tools-ufw/