UFW
(Uncomplicated Firewall) 是一個(gè)非常容易上手的 iptables
類防火墻配置工具,這個(gè)工具可以對出入服務(wù)的網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行分割揍庄、過濾愧怜、轉(zhuǎn)發(fā)等等細(xì)微的控制,進(jìn)而實(shí)現(xiàn)諸如防火墻颗祝、 NAT
等功能所踊。它簡化了 iptable
那復(fù)雜的配置過程泌枪。我們都知道 iptable
非常強(qiáng)大、靈活污筷,但是對于初學(xué)者來學(xué)習(xí)如何使用它正確的配置防火墻是比較難的工闺,但是你又想保護(hù)你的網(wǎng)絡(luò)乍赫,UFW
將會(huì)是你最好的選擇瓣蛀。
下面我將會(huì)解釋如何在 Ubuntu 14.04
中使用 UFW
安裝、配置防火墻雷厂。
使用前提
在你使用這片教材之前惋增,我希望你有一個(gè)獨(dú)立的 no-root
超級管理員用戶 - 擁有 root
的所有權(quán)限。你可以查看我這篇文章 讓你的服務(wù)器更安全 - 初始化服務(wù)器配置 中創(chuàng)建用戶相關(guān)步驟改鲫。
一般來說 UFW
是默認(rèn)會(huì)被安裝的诈皿,假如你的系統(tǒng)中沒有安裝,你可以使用 apt-get
來安裝像棘。
$ sudo apt-get install ufw
使用 IPv6
如果你的 Ubuntu
服務(wù)器已啟用 IPv6
稽亏,為了確保 UFW
能支持 IPv6
協(xié)議。
打開 UFW
的相關(guān)配置缕题,使用你最喜歡的編輯器截歉,這里我使用 vim
:
$ vim /etc/default/ufw
然后,確認(rèn) IPv6
是否設(shè)置成 yes
烟零,如果沒有則設(shè)置為 yes
瘪松,大致如下:
...
IPV6=yes
...
退出并保存咸作,當(dāng) UFW
開啟時(shí),它將會(huì)同時(shí)支持 IPv4
和 IPv6
的配置規(guī)則宵睦。
查看 UFW 狀態(tài)和配置規(guī)則
在任何時(shí)間记罚,你都可以檢查它的狀態(tài)和配置規(guī)則,如下:
$ sudo ufw status verbose
默認(rèn)情況下壳嚎,UFW
并沒有開啟桐智,它將會(huì)輸出如下結(jié)果:
# Output:
Status: inactive
假如你已經(jīng)開啟了防火墻,它將會(huì)輸出狀態(tài)為 active
烟馅,并列出你所配置的規(guī)則酵使。例如:你允許來自任何地方的 SSH
連接,將將會(huì)輸出如下結(jié)果:
# Output
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
像這樣通過 status
就可以檢查你的防火墻狀態(tài)和配置了焙糟。
注意:在開啟防火墻之前口渔,你需要確保你允許了 SSH 連接,否則當(dāng)你關(guān)閉遠(yuǎn)程連接后穿撮,你就無法再連上了缺脉。博主自己就曾用這招坑了自己!:joy:
設(shè)置默認(rèn)規(guī)則
當(dāng)你需要開始配置你的防火墻規(guī)則時(shí)悦穿,首先攻礼,你需要設(shè)置默認(rèn)規(guī)則:拒絕所有流入連接,允許流出連接栗柒。意思是礁扮,不允許任何人連接你的主機(jī),允許主機(jī)內(nèi)的任何應(yīng)用訪問外部網(wǎng)絡(luò)瞬沦。
$ sudo ufw default deny incoming
$ sudo ufw default allow outgoing
開啟 SSH 連接
上面我們已經(jīng)設(shè)置了默認(rèn)不接受任何外來連接太伊,同樣也包括了 SSH
使用的 22
端口。所以逛钻,為了我們能通過 SSH
來操作主機(jī)僚焦,所以我們需要配置允許 SSH
連接到我們的主機(jī)上。
通過如下命令來配置:
$ sudo ufw allow ssh
這個(gè)配置將會(huì)允許所有 22
端口上的連接曙痘,默認(rèn) 22
端口是被 SSH
監(jiān)聽的芳悲。UFW
知道什么是 ssh
,因?yàn)樗?/etc/services
中已經(jīng)被定義好了边坤。
當(dāng)然我們也可以指定允許 22
端口的所有連接:
$ sudo ufw allow 22
這個(gè)和上面一個(gè)命令的作用是一樣的名扛。
開啟 UFW
上面已經(jīng)允許 SSH
連接,我們就可以放心的開啟防火墻了茧痒,使用如下命令:
$ sudo ufw enable
在這個(gè)過程中肮韧,你將會(huì)收到一條警告信息(command may disrupt existing ssh connections.
),需要你手動(dòng)確認(rèn),輸入 y
按回車即可惹苗。
:smile: 太棒了殿较,我們已經(jīng)開啟了防火墻,你可以再一次通過 sudo ufw status verbose
來查看桩蓉。
配置其他規(guī)則
HTTP/HTTPS
當(dāng)我們部署 WEB
引用服務(wù)器時(shí)淋纲,我們需要使用 80
或 443
端口來接受請求,這是我們需要開啟這兩個(gè)端口院究,操作如下:
$ sudo ufw allow http
$ sudo ufw allow https
或者洽瞬,你可以指定端口:
$ sudo ufw allow 80
$ sudo ufw allow 443
FTP
FTP
連接一般用于非加密文件傳輸,它默認(rèn)監(jiān)聽 21
端口业汰,也許你永遠(yuǎn)都不會(huì)用到伙窃。
$ sudo ufw allow ftp
或者,你可以指定端口:
$ sudo ufw allow 21/tcp
指定端口范圍
你可以指定一個(gè)端口范圍样漆,來配置防火墻策略为障,當(dāng)有些服務(wù)需要使用多個(gè)端口時(shí),這個(gè)就起到了作用放祟。
如鳍怨,為了允許所有 X11
連接,他們使用的端口范圍是 6000
~ 6007
跪妥,你可以這樣配置:
$ sudo ufw allow 6000:6007/tcp
$ sudo ufw allow 6000:6007/udp
指定端口范圍時(shí)鞋喇,你必須指定協(xié)議類型(
TCP
或UDP
)。
指定 IP 地址
使用 UFW
工作的時(shí)候眉撵,你可以指定 IP
地址侦香,例如:假如你想允許來自某一個(gè) IP
所有連接,你可以指定 from
這個(gè) IP
地址纽疟。
$ sudo ufw allow from 192.168.66.213
上面的配置將會(huì)允許 192.168.66.213
連接到我們主機(jī)的任何開放了的端口罐韩。
我們還可以指定只允許某個(gè) IP
到主機(jī)某一個(gè)端口的連接,拒絕某個(gè) IP
到主機(jī)其他所有端口的連接仰挣,我們可以這樣做:
$ sudo ufw allow from 192.168.66.213 to any port 80
上面配置中伴逸,我們只允許 192.168.66.213
連接到我們的 80
端口缠沈。
配置子網(wǎng)
當(dāng)你需要允許子網(wǎng)內(nèi)所有的 IP
膘壶,你可以 CIDR
的格式來配置,例如:當(dāng)你需要允許 IP
地址從 192.168.1.1
到 192.168.1.254
內(nèi)所有 IP
的連接時(shí)洲愤,你可以這樣配置:
$ sudo ufw allow from 192.168.1.1/24
當(dāng)然颓芭,像上面一樣,我們也可以同時(shí)指定端口號(hào):
$ sudo ufw allow from 192.168.1.1/24 to any port 22
上面配置中柬赐,我們允許 192.168.1.1/24
內(nèi)的所有主機(jī)通過 SSH
連接我們的主機(jī)亡问。
指定網(wǎng)絡(luò)接口
如果您想創(chuàng)建只適用于特定網(wǎng)絡(luò)接口的防火墻規(guī)則,您可以通過指定 allow in on
加上網(wǎng)絡(luò)接口的名稱 來配置規(guī)則。
在配置之前你可以先查找所有的網(wǎng)絡(luò)接口州藕,再配置:
$ ip addr
# Output Excerpt:
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state
...
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default
...
上面列舉了網(wǎng)絡(luò)接口的一些信息束世,他們通常叫做 eth0
或 eth1
之類的名字。
假如你的 eth0
為公網(wǎng)地址床玻,你同事需要向外開放 80
端口毁涉,你可以如下操作:
$ sudo ufw allow in on eth0 to any port 80
上面配置中,你的服務(wù)器將會(huì)接受來自于公網(wǎng)的 HTTP 請求锈死。
另外贫堰,假如你想你的 MySQL
服務(wù)器(監(jiān)聽 3306
)只接受通過內(nèi)網(wǎng)網(wǎng)卡 eth1
的請求,你可以這樣:
$ sudo ufw allow in on eth1 to any port 3306
如上配置中待牵,只有在用一個(gè)內(nèi)網(wǎng)中的服務(wù)器才能連接你的 MySQL
服務(wù)器其屏。
添加拒絕連接規(guī)則
假如你沒有修改過我們上面設(shè)置過的默認(rèn)規(guī)則,它將會(huì)拒絕所有的外來連接缨该,通常情況下偎行,這樣大大的簡化了你配置一系列的防火墻規(guī)則,比如要求你創(chuàng)建指定端口啊贰拿,指定 IP
啊等等睦优。但是,如果你想拒絕某個(gè) IP
源或者某個(gè)網(wǎng)段的特定連接壮不;也許你知道攻擊源就來自于某個(gè) IP
或某個(gè)網(wǎng)段汗盘;再者,你想把默認(rèn)外接規(guī)則(incomming rule) 設(shè)置為 allow询一,這是你就需要指定某些拒絕規(guī)則了隐孽。
配置 拒絕規(guī)則 ,更我們上面配置 允許規(guī)則 是一樣的方式健蕊,只不過將 allow
改為 deny
菱阵。
如:拒絕所有 HTTP 連接,即:拒絕所有連接 80
端口缩功。
sudo ufw deny http
當(dāng)然晴及,也可以指定端口號(hào):
sudo ufw deny 80
拒絕某一個(gè) 192.168.1.10
通過 SSH
連接到我們的主機(jī)上:
$ sudo ufw deny from 192.168.1.10 to any port 22
如果你想書寫更多的 拒絕規(guī)則 ,請參考之前描述的 允許規(guī)則 書寫方式嫡锌,將 allow
改為 deny
即可虑稼。
現(xiàn)在我們知道如何添加 允許規(guī)則 和 拒絕規(guī)則,但是我們還不知道如何刪除規(guī)則势木,沒關(guān)系蛛倦,我們再往下看。
刪除規(guī)則
眾所周知啦桌,如何刪除一條防火墻規(guī)則和如何創(chuàng)建一條防火墻規(guī)則一樣重要溯壶,UFW
提供了兩種路徑刪除他們:
指定規(guī)則序號(hào)刪除
每一個(gè)規(guī)則在創(chuàng)建時(shí)都會(huì)分配一個(gè)序號(hào),你可以將它理解為數(shù)據(jù)庫的自增 ID
吧,可以通過他來進(jìn)行更方便的操作且改,你可以通過如下方式查看序號(hào):
sudo ufw status numbered
Numbered Output:
Status: active
To Action From
-- ------ ----
[ 1] 22 ALLOW IN 15.15.15.0/24
[ 2] 80 ALLOW IN Anywhere
假如你想刪除第 2
條規(guī)則验烧,拒絕所有指向 80
端口的連接,如下操作:
$ sudo ufw delete 2
注意:如果你啟用了 IPv6 規(guī)則又跛,這同時(shí)也將刪除相應(yīng)的 IPv6 規(guī)則噪窘。
指定實(shí)際規(guī)則刪除
如果你不想通過 規(guī)則序號(hào) 來刪除,你可以指定 創(chuàng)建時(shí)的參數(shù)格式 來刪除效扫,例如:當(dāng)你使用 sudo ufw allow http
創(chuàng)建的規(guī)則時(shí)倔监,你可以通過如下方式刪除:
$ sudo ufw delete allow http
同樣你可以指定端口號(hào)來替代服務(wù)名:
$ sudo ufw delete allow 80
注意:這種方式將會(huì)同時(shí)刪除相應(yīng)的 IPv4 和 IPv6規(guī)則。
關(guān)閉 UFW
現(xiàn)在菌仁,由于某些我們不想開啟防火墻了浩习,我們可以關(guān)閉它:
$ sudo ufw disable
重置 UFW 的配置
將入你配置了好多規(guī)則,但是你現(xiàn)在需要重新配置济丘,拋棄之前的配置規(guī)則谱秽,你可以這么做:
$ sudo ufw reset
這個(gè)命令將會(huì)刪除你之前配置的所有規(guī)則,但是默認(rèn)規(guī)則將會(huì)被保留摹迷。
總結(jié)
服務(wù)器安全一直都是一個(gè)重要的話題疟赊,開啟防火墻使我們保護(hù)服務(wù)器安全的重要手段之一,所以峡碉,無論什么情況下近哟,我們都應(yīng)該為服務(wù)器開啟防火墻。當(dāng)然鲫寄,開放 SSH
也是必不可少的吉执,與此同時(shí),你可以允許一些連接到您的服務(wù)器地来,同時(shí)并限制一些不必要的連接戳玫,這樣您的服務(wù)器才會(huì)更加的安全的提供服務(wù)。
想了解更多的 UFW
防火墻配置未斑,你可以參考這篇文章:UFW Essentials: Common Firewall Rules and Commands