如何在Ubuntu中用UFW配置防火墻
UFW,即簡單防火墻(uncomplicated firewall),是一個 Arch Linux、Debian 或 Ubuntu 中管理防火墻規則的前端。 UFW 通過命令行使用(盡管它有可用的 GUI),它的目的是使防火墻配置簡單(即不復雜(uncomplicated))。
開始之前
1、 熟悉我們的入門指南,并完成設置服務器主機名和時區的步驟。
2、 本指南將盡可能使用 sudo。 在完成保護你的服務器指南的章節,創建一個標準用戶帳戶,強化 SSH 訪問和移除不必要的網絡服務。 但不要跟著創建防火墻部分 - 本指南是介紹使用 UFW 的,它對于 iptables 而言是另外一種控制防火墻的方法。
3、 更新系統
Arch Linux
- sudo pacman -Syu
Debian / Ubuntu
- sudo apt-get update && sudo apt-get upgrade
安裝 UFW
UFW 默認包含在 Ubuntu 中,但在 Arch 和 Debian 中需要安裝。 Debian 將自動啟用 UFW 的 systemd 單元,并使其在重新啟動時啟動,但 Arch 不會。 這與告訴 UFW 啟用防火墻規則不同,因為使用 systemd 或者 upstart 啟用 UFW 僅僅是告知 init 系統打開 UFW 守護程序。
默認情況下,UFW 的規則集為空,因此即使守護程序正在運行,也不會強制執行任何防火墻規則。 強制執行防火墻規則集的部分在下面。
Arch Linux
1、 安裝 UFW:
- sudo pacman -S ufw
2、 啟動并啟用 UFW 的 systemd 單元:
- sudo systemctl start ufw
- sudo systemctl enable ufw
Debian / Ubuntu
1、 安裝 UFW
- sudo apt-get install ufw
使用 UFW 管理防火墻規則
設置默認規則
大多數系統只需要打開少量的端口接受傳入連接,并且關閉所有剩余的端口。 從一個簡單的規則基礎開始,ufw default命令可以用于設置對傳入和傳出連接的默認響應動作。 要拒絕所有傳入并允許所有傳出連接,那么運行:
- sudo ufw default allow outgoing
- sudo ufw default deny incoming
ufw default 也允許使用 reject 參數。
警告:
除非明確設置允許規則,否則配置默認 deny 或 reject 規則會鎖定你的服務器。確保在應用默認 deny 或 reject 規則之前,已按照下面的部分配置了 SSH 和其他關鍵服務的允許規則。
添加規則
可以有兩種方式添加規則:用端口號或者服務名表示。
要允許 SSH 的 22 端口的傳入和傳出連接,你可以運行:
- sudo ufw allow ssh
你也可以運行:
- sudo ufw allow 22
相似的,要在特定端口(比如 111)上 deny 流量,你需要運行:
- sudo ufw deny 111
為了更好地調整你的規則,你也可以允許基于 TCP 或者 UDP 的包。下面例子會允許 80 端口的 TCP 包:
- sudo ufw allow 80/tcp
- sudo ufw allow http/tcp
這個會允許 1725 端口上的 UDP 包:
- sudo ufw allow 1725/udp
高級規則
除了基于端口的允許或阻止,UFW 還允許您按照 IP 地址、子網和 IP 地址/子網/端口的組合來允許/阻止。
允許從一個 IP 地址連接:
- sudo ufw allow from 123.45.67.89
允許特定子網的連接:
- sudo ufw allow from 123.45.67.89/24
允許特定 IP/ 端口的組合:
- sudo ufw allow from 123.45.67.89 to any port 22 proto tcp
proto tcp 可以刪除或者根據你的需求改成 proto udp,所有例子的 allow 都可以根據需要變成 deny。
刪除規則
要刪除一條規則,在規則的前面加上 delete。如果你希望不再允許 HTTP 流量,你可以運行:
- sudo ufw delete allow 80
刪除規則同樣可以使用服務名。
編輯 UFW 的配置文件
雖然可以通過命令行添加簡單的規則,但仍有可能需要添加或刪除更高級或特定的規則。 在運行通過終端輸入的規則之前,UFW 將運行一個文件 before.rules,它允許回環接口、ping 和 DHCP 等服務。要添加或改變這些規則,編輯 /etc/ufw/before.rules 這個文件。 同一目錄中的 before6.rules 文件用于 IPv6 。
還存在一個 after.rule 和 after6.rule 文件,用于添加在 UFW 運行你通過命令行輸入的規則之后需要添加的任何規則。
還有一個配置文件位于 /etc/default/ufw。 從此處可以禁用或啟用 IPv6,可以設置默認規則,并可以設置 UFW 以管理內置防火墻鏈。
UFW 狀態
你可以在任何時候使用命令:sudo ufw status 查看 UFW 的狀態。這會顯示所有規則列表,以及 UFW 是否處于激活狀態:
- Status: active
- To Action From
- -- ------ ----
- 22 ALLOW Anywhere
- 80/tcp ALLOW Anywhere
- 443 ALLOW Anywhere
- 22 (v6) ALLOW Anywhere (v6)
- 80/tcp (v6) ALLOW Anywhere (v6)
- 443 (v6) ALLOW Anywhere (v6)
啟用防火墻
隨著你選擇規則完成,你初始運行 ufw status 可能會輸出 Status: inactive。 啟用 UFW 并強制執行防火墻規則:
- sudo ufw enable
相似地,禁用 UFW 規則:
- sudo ufw disable
UFW 會繼續運行,并且在下次啟動時會再次啟動。
日志記錄
你可以用下面的命令啟動日志記錄:
- sudo ufw logging on
可以通過運行 sudo ufw logging low|medium|high 設計日志級別,可以選擇 low、 medium 或者 high。默認級別是 low。
常規日志類似于下面這樣,位于 /var/logs/ufw:
- Sep 16 15:08:14 <hostname> kernel: [UFW BLOCK] IN=eth0 OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:00:00 SRC=123.45.67.89 DST=987.65.43.21 LEN=40 TOS=0x00 PREC=0x00 TTL=249 ID=8475 PROTO=TCP SPT=48247 DPT=22 WINDOW=1024 RES=0x00 SYN URGP=0
前面的值列出了你的服務器的日期、時間、主機名。剩下的重要信息包括:
- [UFW BLOCK]:這是記錄事件的描述開始的位置。在此例中,它表示阻止了連接。
- IN:如果它包含一個值,那么代表該事件是傳入事件
- OUT:如果它包含一個值,那么代表事件是傳出事件
- MAC:目的地和源 MAC 地址的組合
- SRC:包源的 IP
- DST:包目的地的 IP
- LEN:數據包長度
- TTL:數據包 TTL,或稱為 time to live。 在找到目的地之前,它將在路由器之間跳躍,直到它過期。
- PROTO:數據包的協議
- SPT:包的源端口
- DPT:包的目標端口
- WINDOW:發送方可以接收的數據包的大小
- SYN URGP:指示是否需要三次握手。 0 表示不需要。