iT邦幫忙

2025 iThome 鐵人賽

DAY 23
0
Security

Izumi從零開始的30日WEB馬拉松系列 第 23

Day23-認識防火牆

  • 分享至 

  • xImage
  •  

今天來到第二十三天了,距離完賽只剩一周了,到這裡我們也學了不少東西了,恭喜各位! 今天我們要來學的主題是防火牆,學會防火牆可以幫助我們保護主機跟網路防止惡意流量進入,以及控制資料流跟阻止內網外洩,更重要的是,很多標準(PCI-DSS、ISO27001)都會要求要有防火牆。

防火牆是什麼?

我們可以將防火牆想像成一種「流量的過濾器」,位於主機或網路的邊界,會依照規則來決定封包的處置方式
,有允許、拒絕跟丟棄三種方式,而我們常見的防火牆類型有幾種類型,這邊介紹其中三種,第一種是裝在單一主機的(例如我們電腦上的Windows防火牆),叫Host-based Firewall,第二種是Network Firewall,這是一種放在網路邊界的專用設備(例如Cisco ASA),第三種則是更進階的Next-Gen Firewall (NGFW),這是更進階的防火牆,能夠檢查應用層的流量。

基本的概念

首先我們要來介紹無狀態(Stateless)與有狀態(Stateful)的差別

  • Stateless(無狀態):只依單一封包的 header(src/dst IP, src/dst port, protocol)決定允許/拒絕。速度快但功能較少。
  • Stateful(有狀態):追蹤TCP/UDP連線的state(new, established, related),允許回應流量而不需開放回傳port。實務上多數防火牆是stateful(Linux的conntrack)

接著要來講一些在這方面會比較常看到的關鍵詞

  • Packet filter:基於3層/4層資訊過濾(IP/port/proto)
  • NAT(Network Address Translation):改寫封包來源/目的IP(例如Masquerade)
  • Proxy/App-layer firewall:在應用層終止與檢查(HTTP代理、WAF)
  • NGFW:結合DPI、用戶識別、IPS等

還有兩個關於Linux的小內容,一個是Netfilter另一個則是conntrack

  • Linux使用netfilter框架在kernel做封包過濾
  • conntrack:追蹤每個連線的狀態,用於stateful decisions

實務常用的Linux工具

  • ntfables:現代Linux的預設,替代iptables。在語法上更現代,效能也更好,統一IPv4/IPv6

  • iptables:傳統但仍廣泛使用的工具有iptables(IPv4)/ip6tables(IPv6)/arptables/ebtables

  • ufw與firewalld:ufw(Ubuntu)與firewalld(CentOS)包裝底層工具,適合快速部署

Linux 防火牆核心流程

這部分可以說是最重要也最核心的地方之一,因為沒有正確理解封包流向的話可能會將規則寫錯,把自己給擋了

  • 簡化後的封包流向
    1.Inbound(從外到本機):網卡→PREROUTING(nat)→raw/conntrack→INPUT(若目標是本機)→application
    2.Forward(路由通過主機):PREROUTING → FORWARD → POSTROUTING
    3.Outbound(本機發出):OUTPUT→POSTROUTING
    注意!實際操作時nat表以及filter表可能會有些許的差異

基本策略與設計原則

  • 最小權限/白名單原則
    1.預設拒絕incoming(deny by default),只允許必要port(SSH/HTTPS/HTTP)
    2.出站預設允許,但對內網敏感環境可反向設為deny(只允許必要外連)

  • 分層設計
    1.外部邊界firewall:只允許到DMZ的HTTP/HTTPS/SSH(其他丟棄)
    2.DMZ firewall:允許來自外部的Web流量,但限制到內網管理介面
    3.Host-based firewall:在伺服器上再收緊(只允許管理IP連SSH)

  • Logging與Alerting
    1.開啟日誌(但要注意log volume),把拒絕事件送到集中化系統(ELK/Graylog/Splunk)
    2.設定log rate-limiting(避免 DOS log flooding)

使用ufw製作基本的防火牆

這邊選用ufw是因為Ubuntu常用並且是iptables的簡化版,對於我們這種初學比較容易上手

  • 步驟一.安裝與啟用

使用指令:

sudo apt update
sudo apt install ufw -y
sudo ufw enable
sudo ufw status verbose

https://ithelp.ithome.com.tw/upload/images/20251003/20178008IIkrIiqWXn.png

  • 步驟二.設定預設規則

使用指令:

sudo ufw default deny incoming
sudo ufw default allow outgoing

https://ithelp.ithome.com.tw/upload/images/20251003/20178008cNzTLBHwRp.png
這樣設定會預設阻擋所有外部進來的連線,並允許主機對外連線

  • 步驟三.開放需要的服務

使用指令:

sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https

https://ithelp.ithome.com.tw/upload/images/20251003/201780081yz0ARysEQ.png
allow ssh允許我們遠端管理伺服器
allow http/https允許Web server對外提供服務

  • 步驟四.測試規則

使用指令:

sudo ufw status numbered

這樣會列出目前所有規則
https://ithelp.ithome.com.tw/upload/images/20251003/20178008jCMCc88pzT.png
接著使用指令:

sudo python3 -m http.server 22

最後在使用指令:

nc -vz 127.0.0.1 22

來測試是否能連線,根據我們的設定結果,防火牆應該要會是允許,如圖所示:
https://ithelp.ithome.com.tw/upload/images/20251003/20178008PpkW4GFAk6.png

以上就是我們今天的實作內容,最後如果有需要刪除規則,可以使用指令:

sudo ufw delete <編號>

今日小結

今天我們學習了防火牆相關的知識與概念,並學習如何建立簡單的防火牆


上一篇
Day22-DNS實作
下一篇
Day24-認識UDP/QUIC
系列文
Izumi從零開始的30日WEB馬拉松24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言