Uncomplicated Firewall
來自項目主頁:
- Ufw(即 Uncomplicated Firewall 的縮寫)是一個管理網絡防火牆的程序。它提供了一個命令行界面,並旨在簡單(uncomplicated)易用。
nft
接受 iptables 語法(例如在 /etc/ufw/before.rules
中),因此使用 UFW 管理規則的用戶無需學習怎麼對 iptables 或者 nftables 進行底層調用。安裝[編輯 | 編輯原始碼]
啟動並啟用 ufw.service
使其開機自啟。注意,如果 iptables.service
(或者其 ipv6 部分)也被啟用了,ufw.service
將不會生效。
基本配置[編輯 | 編輯原始碼]
以下是一個非常簡單的配置示例,它將會默認拒絕所有連接,允許來自 192.168.0.1-192.168.0.255 局域網內的所有連接,允許所有目標為 Deluge(一個 BitTorrent 客戶端)的連接,並啟用了來自任何地方的 SSH 連接速率限制:
# ufw default deny # ufw allow from 192.168.0.0/24 # ufw allow Deluge # ufw limit ssh
要想允許一個端口而不是任何地方進行連接,請參考下面的例子。這三條命令分別允許端口 51312 的 UDP 和 TCP 連接,允許端口 51313 的 UDP 連接,和允許範圍從 51312 到 51314 端口的連接:
# ufw allow 51312 # ufw allow 51312/udp # ufw allow 51312:51314
僅當首次安裝後第一次使用 UFW 時需要執行:
# ufw enable
ufw.service
已經被啟用。最後,使用以下命令確認更改已被應用:
# ufw status
Status: active To Action From -- ------ ---- Anywhere ALLOW 192.168.0.0/24 Deluge ALLOW Anywhere SSH LIMIT Anywhere
使用以下命令來查看額外信息(包括默認策略):
# ufw status verbose
但這依然限制於用戶指定的規則。為了查看所有設置的規則,可以使用:
# ufw show raw
或者手冊中列出的其他報告。由於這些報告也總結了流量情況,其輸出有些難以閱讀,為了方便閱讀,你可以使用另一種檢查傳入流量的方法:
# iptables -S | grep ACCEPT # ip6tables -S | grep ACCEPT
請注意,只要你還在使用 ufw
來管理 iptables
,就不要將後者啟用。
/etc/sysctl.d/*
中設置了特殊的網絡環境變量,請相應更新 /etc/ufw/sysctl.conf
中的內容(因為此配置會覆蓋默認配置)。轉發策略[編輯 | 編輯原始碼]
如果你需要使用 VPN(例如 OpenVPN 或 WireGuard),可以將 /etc/default/ufw
中的 DEFAULT_FORWARD_POLICY 變量從 "DROP" 調整到 "ACCEPT",以便無論用戶如何設置如何都能轉發所有數據包。要針對特定接口(例如 wg0)進行轉發,用戶可以在 *filter 塊中添加以下行:
/etc/ufw/before.rules
# End required lines -A ufw-before-forward -i wg0 -j ACCEPT -A ufw-before-forward -o wg0 -j ACCEPT
你可能還需要取消以下行的註釋:
/etc/ufw/sysctl.conf
net/ipv4/ip_forward=1 net/ipv6/conf/default/forwarding=1 net/ipv6/conf/all/forwarding=1
添加其他應用[編輯 | 編輯原始碼]
軟件包還提供了一些常見守護進程和程序的默認端口配置。可以通過查看 /etc/ufw/applications.d
目錄下的文件或使用如下指令查看:
# ufw app list
如果用戶正在使用非標準端口運行任何應用程式,建議創建 /etc/ufw/applications.d/custom
文件,並按照默認配置做模板添加所需的數據。
例如,使用自定義的 TCP 端口範圍 20202-20205 進行 deluge 下載:
[Deluge-my] title=Deluge description=Deluge BitTorrent client ports=20202:20205/tcp
如果需要為同一應用程式定義 TCP 和 UDP 端口,只需使用豎線進行分隔,如下所示:該應用程式打開 TCP 端口 10000-10002 和 UDP 端口 10003:
ports=10000:10002/tcp|10003/udp
還可以使用逗號來定義端口。此示例打開 TCP 端口 10000-10002(包括端口 10000 和 10002)以及 UDP 端口 10003 和 10009:
ports=10000:10002/tcp|10003,10009/udp
刪除應用[編輯 | 編輯原始碼]
根據上面的 Deluge/Deluge-my 示例,以下操作將刪除標準的 Deluge 規則,並用上面示例中的 Deluge-my 規則替換它們:
# ufw delete allow Deluge # ufw allow Deluge-my
通過 status 指令查詢結果:
# ufw status
Status: active To Action From -- ------ ---- Anywhere ALLOW 192.168.0.0/24 SSH ALLOW Anywhere Deluge-my ALLOW Anywhere
IP位址黑名單[編輯 | 編輯原始碼]
將 IP 地址添加到黑名單可能是一個可取的做法,可以簡單地編輯 /etc/ufw/before.rules
文件,在文件底部在 "COMMIT" 的上方插入一個 iptables DROP 行來輕鬆實現。
/etc/ufw/before.rules
... ## blacklist section # block just 199.115.117.99 -A ufw-before-input -s 199.115.117.99 -j DROP # block 184.105.*.* -A ufw-before-input -s 184.105.0.0/16 -j DROP # don't delete the 'COMMIT' line or these rules won't be processed COMMIT
連接速率限制[編輯 | 編輯原始碼]
ufw 有能力拒絕來自在過去 30 秒內嘗試建立 6 次或更多連接的 IP 地址的連接。用戶應該考慮在 SSH 之類的服務中使用這個選項。
利用上述基本配置,要啟用速率限制,我們只需用 limit 參數替換 allow 參數。然後新規則將取代先前的規則。
# ufw limit SSH
Rule updated
# ufw status
Status: active To Action From -- ------ ---- Anywhere ALLOW 192.168.0.0/24 SSH LIMIT Anywhere Deluge-my ALLOW Anywhere
用戶規則[編輯 | 編輯原始碼]
所有的用戶規則都儲存在 etc/ufw/user.rules
和 etc/ufw/user6.rules
中,分別用於 IPv4 與 IPv6。
技巧和竅門[編輯 | 編輯原始碼]
禁用遠程 ping[編輯 | 編輯原始碼]
在以下文件中將 ACCEPT
改為 DROP
:
/etc/ufw/before.rules
# ok icmp codes ... -A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT
如果你正在使用 IPv6, 請一同更改 /etc/ufw/before6.rules
中的規則。
禁用 UFW 日誌[編輯 | 編輯原始碼]
禁用 UFW 日誌可以讓 UFW 停止填充內核(dmesg)和消息日誌:
# ufw logging off
UFW 與 Docker[編輯 | 編輯原始碼]
Docke 在默認狀態下會編寫 iptables 規則並忽視 ufw 規則,這可能會造成一些安全隱患。一種解決方案是使用 https://github.com/chaifeng/ufw-docker 。
ufw-docker install
來自動修復 iptables 規則。這個腳本也能幫你管理 Docker 相關的 ufw 規則,詳細參見 ufw-docker help
。
GUI 前端[編輯 | 編輯原始碼]
如果你在使用 KDE Plasma,可以安裝 plasma-firewall包,然後直接在 Wi-Fi & Networking > Firewall 中調整防火牆配置。
Gufw[編輯 | 編輯原始碼]
gufw包 是一個用於 Ufw 的 GTK 前端,旨在使 Linux 防火牆的管理儘可能簡單易用。它具有常見端口和 p2p 應用程式的預設設置。其依賴於軟件包 python包,ufw包 以及 GTK 支持。
參考[編輯 | 編輯原始碼]
- Ubuntu UFW 文檔
- ufw(8)
- 使用 ipsets 為 ufw 添加屏蔽列表:https://github.com/poddmo/ufw-blocklist