使用人性化的 Linux 防火牆 CFW 阻止 DDOS 攻擊
概括
CFW(Cyber Firewall)是一個人性化的 Linux 防火牆。它旨在協助阻止拒絕服務攻擊(DDoS),同時能控制 Linux 系統埠的開關。CFW 基於 Linux 原生基礎設施運行,擁有良好的軟體兼容性。
該軟體基於 iptables 和 ipset,使用 Python 開發,使用時建議關閉發行版自帶的防火牆(如 firewalld、ufw)避免衝突。
通過 CFW,你將能夠:
- 通過自定義的規則自動封禁互聯網中的惡意 IP,以防止拒絕服務攻擊
- 保護 Linux 的所有埠遭受 DDoS 攻擊,而不僅僅是 Web 應用
- 獲得良好的軟體兼容性,原生支持 Nginx、Caddy 等伺服器
- 支持配合 CDN 使用,使用 CDN 時請將 CDN 的 IP 段設置為 CFW 白名單
- 控制開啟或關閉 Linux 系統的 TCP/UDP 埠
- 獲得友好的命令行互動式體驗
背景
Web 應用程序運行在複雜的互聯網中,隨時可能面臨惡意攻擊,導致拒絕服務現象。為了封禁這些不友好的 IP,CFW 正是為此而誕生。
CFW 的靈感最初來自寶塔面板的 Nginx 防火牆。然而,使用 Nginx 防火牆的過程中遇到諸多不順。該防火牆僅針對 Web 應用(通常是 80 和 443 埠)防禦 CC 攻擊,無法保護 Linux 伺服器的其他埠。同時,該防火牆需要按月付費,並始終捆綁寶塔生態(最新的寶塔面板甚至需要登錄綁定手機實名制的賬號),從而限制了軟體自由度。我們想在純凈的 Linux 中運行防火牆,並對所有埠生效,於是自己開發了一個。
由於 CFW 基於 iptables 和 ipset,不免會與發行版自帶的防火牆(如 firewalld、ufw)衝突,我們增加了 CFW 對埠開關的控制。
實現
CFW 通過 ss -Hntu | awk '{print $5,$6}'
命令獲取當前伺服器的所有連接。客戶端的請求若超過設定並發數,該 IP 將被 iptables 封禁,並存儲在 ipset 數據結構中。
CFW 通過調用 iptables
命令實現 Linux 埠的開關。
安裝
請先確保系統擁有以下依賴。
對於 Debian、Ubuntu 等:
sudo apt install -y curl ipset python3 git net-tools
對於 CentOS 等:
sudo yum install -y curl ipset python3 git net-tools
安裝好系統依賴後,輸入以下命令安裝 CFW:
sudo curl https://raw.githubusercontent.com/Cyberbolt/cfw/main/install.py | python3
你也可以下載該腳本閱讀,以了解該腳本所進行的工作後再執行上述命令。
完成安裝後,使用 source ~/.bashrc
激活 CFW 的環境變數。(或者新打開一個 shell 環境,自動激活環境變數。)
在 Linux 終端輸入 systemctl status cfw
,顯示 active (running)
字樣說明 CFW 已成功運行,同時會在伺服器重啟時自動運行。
卸載
sudo curl https://raw.githubusercontent.com/Cyberbolt/cfw/main/uninstall.py | python3
配置
配置文件在 /etc/cfw/config.yaml
中,修改配置文件後運行 systemctl restart cfw
即可生效。
配置文件參數說明:
# CFW 運行埠
port: 6680
# CFW 檢測連接的頻率,單位:秒。此處默認 5 秒一次。
frequency: 5
# 允許每個 IP 連接的最大並發數,超過將被 CFW 封禁。
max_num: 100
# 解封 IP 的時間。此處默認 IP 被封禁後 600 秒將自動解封。若此處值為 0,則永久封禁。
unblock_time: 600
# 數據備份時間,單位:秒。
backup_time: 60
# IPv4 白名單路徑。寫在文本文件中,一行一個 IP,支持子網掩碼。)本地地址、內網地址默認在該文件中)
whitelist: /etc/cfw/ip_list/whitelist.txt
# IPv4 黑名單路徑。寫在文本文件中,一行一個 IP,支持子網掩碼。
blacklist: /etc/cfw/ip_list/blacklist.txt
# IPv6 白名單路徑。寫在文本文件中,一行一個 IP。
whitelist6: /etc/cfw/ip_list/whitelist6.txt
# IPv6 黑名單路徑。寫在文本文件中,一行一個 IP。
blacklist6: /etc/cfw/ip_list/blacklist6.txt
# 日誌文件的路徑
log_file_path: /etc/cfw/log/log.csv
# 日誌文件的最大行數。(達到最大行數後將自動滾動。若此處值為 0,則不限制最大行數)
log_max_lines: 10000000
命令
命令中 []
表示變數。
運行
- 停止 CFW:
systemctl stop cfw
- 啟動 CFW:
systemctl start cfw
- 重啟 CFW:
systemctl restart cfw
IP 黑名單管理
- 手動封禁單個 IPv4 地址:
cfw block [ip]
- 手動解封單個 IPv4 地址:
cfw unblock [ip]
- 查看 IPv4 黑名單:
cfw blacklist
- 手動封禁單個 IPv6 地址:
cfw block6 [ip]
- 手動解封單個 IPv6 地址:
cfw unblock6 [ip]
- 查看 IPv6 黑名單:
cfw blacklist6
Linux 埠操作
- 放行 IPv4 埠:
cfw allow [port]
- 阻止 IPv4 埠:
cfw deny [port]
- 單獨放行 IPv4 TCP 埠:
cfw allow [port]/tcp
,示例如cfw allow 69.162.81.155/tcp
- 單獨阻止 IPv4 TCP 埠:
cfw deny [port]/tcp
,示例如cfw deny 69.162.81.155/tcp
- IPv4 UDP 埠操作同理
- 查看所有放行的 IPv4 埠:
cfw status
- 放行 IPv6 埠:
cfw allow6 [port]
- 阻止 IPv6 埠:
cfw deny6 [port]
- 單獨放行 IPv6 TCP 埠:
cfw allow6 [port]/tcp
,示例如cfw allow6 69.162.81.155/tcp
- 單獨阻止 IPv6 TCP 埠:
cfw deny6 [port]/tcp
,示例如cfw deny6 69.162.81.155/tcp
- IPv6 UDP 埠操作同理
- 查看所有放行的 IPv6 埠:
cfw status6
日誌操作
動態查詢日誌 cfw log [num]
。[num]
為查詢日誌的條數,查詢結果將按時間倒序。
相關鏈接
- GitHub: https://github.com/Cyberbolt/cfw
- 電光筆記: https://www.cyberlight.xyz/
- Potato Blog: https://www.liuya.love/
更多
如果你在使用中遇到任何問題,歡迎在 https://github.com/Cyberbolt/cfw/issues 處留言。有了你的幫助,CFW 才能日漸壯大。
總結
CFW 可以防止一定程度的 DDoS 攻擊,同時能控制開啟或關閉 Linux 系統的 TCP/UDP 埠,很好地幫助我們解決惡意 IP 入侵的問題。但是不要做不切實際的想像,認為 CFW 可以抵禦大型 DDoS 攻擊。DDoS 攻擊的規模往往與成本是正相關的,必要時提升網路帶寬才能解決問題的根本。
作者簡介:
Cyberbolt:一個自由的 Python 開發者。
本文由貢獻者投稿至 Linux 中國公開投稿計劃,採用 CC-BY-SA 協議 發布,Linux中國 榮譽推出
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive