# W8 Firewall + iptable ### 什麼是防火牆? > 為了防護內網跟外網的屏障 > 管理黑白名單 ### 防火牆類型 | 防火牆類型 | OSI 層級 | 作用重點 / 功能簡化 | |---|---|---| | 無狀態防火牆 (Stateless Firewall) | L3 ~ L4 網路 / 傳輸層 | 依 IP / Port 過濾封包,不追蹤連線狀態 | | 具狀態防火牆 (Stateful Firewall) | L3 ~ L4 網路 / 傳輸層 | 過濾封包 + 追蹤連線狀態,阻擋非法連線 | | Web 應用防火牆 (WAF) | L7 應用層 | 偵測 HTTP/HTTPS 流量,阻止 Web 攻擊與漏洞利用 | | Proxy | L7 應用層 | 代理應用層請求、代為傳送流量,隔離內外網,控制使用者或保護伺服器 | Netfilter >Linux核心中的封包安全框架 >*Hook是處理流程中設定的檢查點,用來攔截、檢查或處理封包。 iptables > 屬於netfilters的UI介面 table(依功能分類)、Chain(指定在特定hook點觸發)、rules(規則) ## iptables的五大table整理 fliter > 封包過濾 nat > 修改封包來源或port號 mangle >不常用 >用來修改封包表頭 raw > 主要用來控制哪些封包需要用來進行連線追蹤 security > 給封包加上安全標記 TTL (封包有一個跳點,如果扣到剩0,就會被丟掉 iptables 預先定義的五個chain 1. PREROUTING 封包剛進入系統 2. INPUT 系統判斷是給本機的封包 3. FORWARD 過濾要轉送的封包 4. OUTPUT 系統自己產生的封包要送出去 5. POSTROUTING 封包準備要離開系統 | 預設的五個 chain | 時機 | 對應的 Netfilter hook 名稱 | |---|---|---| | PREROUTING | 封包剛進入系統(還沒決定要送給誰) | `NF_INET_PRE_ROUTING` | | INPUT | 系統判斷是給「本機」的封包 | `NF_INET_LOCAL_IN` | | FORWARD | 系統判斷要「轉發」給別台機器 | `NF_INET_FORWARD` | | OUTPUT | 系統自己產生的封包要送出去 | `NF_INET_LOCAL_OUT` | | POSTROUTING | 封包準備要離開系統 | `NF_INET_POST_ROUTING` | ICMP echo request (type=8) NAT概念 > 網路位置轉換 :::info #### 為什麼要有NAT? IPV4的網路不夠用 ::: * SNAT來源 * DNAT目的 fliter table >INPUT+FORWARD+OUTPUT * INPUT - 針對「目的地是本機」的封包。 >有人從外部要SSH到你的主機 * FORWARD - 針對「需要轉送(路由)」的封包 >主機作為路由器,把封包從eth0轉發到eth1 * OUTPUT - 針對「由本機產生、要送出去」的封包 >自己執行 ping 8.8.8.8 時發出的封包 nat table PREROUTING+POSTOUTING * Prerouting:封包剛進主機時,路由判斷前 * Postrouting:封包準備送出的最後一刻 Policy - INPUT OUTPUT FORWARD 預設為 accept > 檢視: `sudo iptables -L` ### Target | Target | 用途 / 行為 | 說明 | |---|---|---| | ACCEPT | 允許封包 | 封包通過防火牆 | | DROP | 丟棄封包 | 不回應發送端,直接丟棄封包 | | REJECT | 拒絕封包 | 回應回傳 RST 封包,告知封包被拒絕 | | SNAT | 修改來源位址 | 改變封包來源 IP,用於內網上網 | | DNAT | 修改目的位址 | 改變封包目的 IP,用於轉送流量 | | MASQUERADE | 動態修改來源位址 | 自動獲取網卡 IP | | REDIRECT | 封包導向本機 | 將封包導向指定的 port | | LOG | 記錄封包 | 記錄封包至系統日誌 | | 其他 chain 的名稱 | 轉換到指定 chain | | ### IPTables常用指令參數 > 通常規則處發後即結束判斷 ### Rule 操作 * -L ---list 顯示所有規則 * -A / ---append 將規則附加至規則鏈的最後面 ``` #在 INPUT chain 附加允許 SSH 的規則 sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT ``` * -R / ---replace 取代指定位置的規則(需加規則號碼) ``` #將 INPUT chain 第二條規則替換成封鎖 HTTP sudo iptables -R INPUT -p tcp --dport 80 -j DROP ``` * -D / ---delete 刪除指定規則(可用規則號碼或完整規則內容) ``` #刪除 INPUT chain 第三條規則 sudo iptables -D INPUT 3 #或刪除符合條件的規則 sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT ``` * -F / ---flush 清空指定規則鏈內的所有規則 ``` #清空 INPUT chain 所有規則 sudo iptables -F INPUT ``` * -t (table) 指定table,預設為filter iptable 儲存規則 使用iptables-save儲存規則 1. 2. 3.還原、套用規則(restore、apply)