網站伺服器建置與管理上課補充教材


Chapter 04:系統防火牆原理與實際設定
  1. 什麼是主機系統的防火牆
    1. 基本上分為兩種,軟體的防火牆 (例如 proxy 或者是防毒、防木馬軟體所提供的軟體過濾機制), 一種是封包過濾,亦即直接過濾 layer2, layer3, layer4 等訊框或封包表頭資訊等封包過濾的機制。
    2. 無論何種防火牆,大多是設定一堆流程與規則,讓封包要進入到本機前,需要通過這些規則的順序,以達到放行或者是拒絕的程序。
  2. 封包過濾型防火牆
    1. 你要先制定一些規則,例如底下的規則順序 (有順序之分喔!)
      1. 放行本機的網路界面 (lo, 就是 localhost 那片網卡)
      2. 放行 ICMP 這個封包檢測的功能 (例如 ping 就是其中一種 icmp 封包)
      3. 放行本機自己的回應封包 (就是本機自己向外要求的封包回應訊息,例如去 centos 官網後,官網回傳的訊息)
      4. 放行區域網路連線到自己本機的 ssh 服務要求。
    2. 當有任何網路來源對你這部系統發起連線時,就需要通過上面四個流程,而只要有任何一個流程通過,後面的流程就不會被檢測 (重要的項目排在前面較佳)。
    3. 萬一發起連線的封包並沒有符合任何一條規則時,那系統就會使用預設政策 ( Policy ) 來決定該連線封包是否放行。
    4. 通常建議網路主機的預設政策為丟棄,亦即『關閉所有連線,開放特定服務』的設定機制較佳。
    5. 請看老師白板上面繪製的流程,並且解析每條連線的通過與不通過的流程:
      • 對自己『 ping localhost 』會通不會通?用到那條規則?
      • 『 ssh localhost 』會通不會通?用到那條規則?
      • 用戶端對我『 ping localhost 』時?
      • 用戶端對我發起網路連線 (用瀏覽器連線我的 WWW 時)?
      • 用戶端『 ssh 我的IP 』時?
      • 我連線到 www.google.com 去搜尋資料時?
  3. CentOS 7 使用的防火牆機制
    1. Linux kernel 就是使用 iptables 這個 netfilter 的防火牆機制,由於是核心提供的防火牆,所以效能特別好。
    2. CentOS 7 提供了兩個管理機制,一個直接使用 iptables 來管理,一個則透過 firewalld 這個服務來管理。但是 firewalld 需要透過專屬的 firewall-cmd 這個指令來管理,在正常一般的管理行為中, firewall-cmd 較為簡易,但若有特別的規則時,則需要使用到 firewall-cmd 的 rich rule 來管理! 其實學習 rich rule 才是王道!
    3. 事實上,最終 firewalld 還是透過核心的 iptables 來達成防火牆控制。因此,在學習防火牆機制行為上,個人還是建議先摸一下 iptables 較佳。
    4. 練習:
      • 以 systemctl 觀察目前使用的是 firewalld 還是 iptables 這兩個服務的那一個啟動了?
      • 若沒有 iptables 這個服務,代表你的系統沒有安裝,請使用 yum 自己安裝好 iptables-services 這個軟體
      • 請關閉 firewalld 且重新開機不會啟動,請啟動 iptables 且重新開機會啟動。
      • 如何確定 iptables 是啟動的了?
  4. 會影響到防火牆的許多服務
    1. 因為虛擬化的環境中,虛擬系統需要透過本機對外連線,因此虛擬化軟體會主動的去修改實體機器的 iptables 防火牆。
    2. 我們已經是虛擬機器,因此無須使用啟用虛擬化軟體,所以需要關閉這些軟體,避免防火牆規則一直被干擾影響。
    3. 練習:
      • 使用 virsh net-list 查看是否有一個名為 default 的網路資訊?
      • 使用 virsh net-destroy default 刪除掉這個特別的網路卡
      • 使用 virsh net-undefine default 讓這個虛擬網路裝置不會再被啟動。
      • 透過 systemctl 的方式關閉 libvirtd 這個特別的虛擬系統服務。
      • 請重新開機,這樣就能夠避免虛擬化造成的防火牆被修改的問題了。
  5. iptables 針對本機的工作鏈 (chain)
    1. 針對本機的防火牆表格是 filter (過濾) 這個表格
    2. filter 共有三個預設的鏈,分別是 INPUT, OUTPUT, FORWARD
    3. INPUT 任何進入本機使用本機服務的封包 (包括從伺服器端回傳的回應資訊),都會經過這個鏈
    4. OUTPUT 從本機主動發出的封包,包括回應給用戶端的訊息,都會經過這個鏈
    5. FORWARD 沒有進入本機,但是透過本機轉遞 (例如本機為路由器的角色時) 的封包,就會經過這個鏈
    6. 一般來說,在單純的伺服器環境下 (沒有開放讓其他用戶使用本機的 ssh 等本地端服務),只要管制 INPUT 鏈即可,OUTPUT 及 FORWARD 都可以直接放行。
  6. iptables 指令的應用
    1. 使用 iptables-save 觀察防火牆的規則與順序:
      # Generated by iptables-save v1.4.21 on Sat Oct  1 20:29:56 2016
      *filter
      :INPUT ACCEPT [0:0]
      :FORWARD ACCEPT [0:0]
      :OUTPUT ACCEPT [57:9348]
      -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
      -A INPUT -p icmp -j ACCEPT
      -A INPUT -i lo -j ACCEPT
      -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
      -A INPUT -j REJECT --reject-with icmp-host-prohibited
      -A FORWARD -j REJECT --reject-with icmp-host-prohibited
      COMMIT
      # Completed on Sat Oct  1 20:29:56 2016
      
      • 出現 *filter 代表使用的是 filter 這個表格
      • 出現 :INPUT 代表 INPUT 的 chain ,而 ACCEPT 代表預設政策為接受,後續的 :OUTPUT, :FORWARD 都是類似的意思
      • 出現 -A INPUT 為 INPUT 的依順序的各個規則!因為 -A INPUT 共有 5 個,因此就是說,共有 5 個針對 INPUT chain 的規則之意。
      • -A FOWARD 僅有一條規則
      • 沒有出現 -A OUTPUT 代表沒有 OUTPUT 定義規則,亦即 OUTPUT 完全使用預設政策的意思。
    2. 使用 iptables -[F|X|Z] 分別清除規則、清除自訂鏈、清除統計資訊
    3. 使用 iptables -P [INPUT|OUTPUT|FORWARD] [ACCEPT|DROP] 定義預設政策 (政策僅能有 ACCEPT 與 DROP 喔!)
    4. 可以使用底下的方式來處理一般 layer3, layer4 的防火牆規則:
      iptables [-A INPUT] [-i lo|eth0] [-s IP/Netmask] [-d IP/Netmask]
      [-p tcp|udp [--sport ports] [--dport ports]] [-j ACCEPT|REJECT|DROP]
    5. 如果需要使用到 layer2 的管制網路卡,則可以使用底下的方式來處理:
      iptables [-A INPUT] [[-m mac] [--mac-source aa:bb:cc:dd:ee:ff]] [-j ACCEPT|REJECT|DROP]
    6. 如果有需要用到回應封包的管制,則使用如下的狀態來處理:
      iptables [-A INPUT] [-m state] [--state RELATED,ESTABLISHED] [-j ACCEPT|DROP|REJECT]
      • ESTABLISHED:已經連線成功的連線狀態;
      • RELATED:這個最常用!表示這個封包是與我們主機發送出去的封包有關
    7. 練習,請進行底下的幾個防火牆規則的練習 (一定不要在遠端主機進行這些動作!)
      • 將 INPUT 的 policy 改成 DROP 並觀察
      • 檢查你的 gateway 的網卡卡號,將網卡卡號放行
      • 讓 ssh 只在兩段屬於你的區域網路放行
      • 將 https 針對 internet 全部放行
      • 將 172.16.255.1 直接拒絕
      • 上一條規則刪除
      • 將防火牆規則復原
  7. 實際設定好本機防火牆
    1. 將預設的規則轉存到 /root/firewall.sh 這個檔案內
    2. 首先將全部的規則刪除 (應該有三條指令)
    3. 設定好預設政策,讓 INPUT 成為 DROP 而 OUTPUT 與 FORWARD 成為 ACCEPT
    4. 針對 INPUT 前三條規則為 (1)回應封包 (2)放行 lo 界面 (3)放行 icmp 封包
    5. 放行你自己的內部區域網路那個網域的連線要求
    6. 讓 ssh 只對外部的區網放行,不會對 Internet 放行
    7. 讓 http 針對整個 Internet 放行
    8. 最後讓確定的規則轉存到 /etc/sysconfig/iptables 這個設定檔
    9. 重新啟動 iptables 服務,然後觀察規則是否正確
  8. 認識網路位址轉換 (Network Address Translation, NAT)
    1. 沒有透過本機的封包,就是透過 nat 這個 netfilter 表格所管理的
    2. 請看白板上面老師繪畫的 POSTROUTING, PREROUTING 與 filter 的 FORWARD 的相關性
    3. 當內網透過 gateway 連線到外面去,主要修改來源 IP,因此稱為 SNAT 是如何運作的?
    4. 當外網要直接連到內網的情況,主要則是透過 DNAT 來處理,了解一下如何運作?
    5. 但無論如何,要進行封包轉遞,都需要核心有支援才行!請查閱 /proc/sys/net/ipv4/ip_forward
    6. 練習:
      • 讓你的 Linux 永遠啟動核心轉遞的功能
    7. 練習:開始處理讓你的 Linux 成為 gateway 的能力。修改 firewall.sh 這個檔案,加入底下的功能
      • 加入清除 PREROUTING, POSTROUTING 的規則功能
      • 加入你的內網進行偽裝 (MASQUERADE) 讓封包傳輸的功能
      • 讓 port 555 轉遞到本機 (127.0.0.1) 的 port 80 上面。
      • 讓 port 666 轉遞到後端主機的 port 665 上面。
      • 執行 firewall.sh 之後,查詢是否正常?
    8. 練習:
      • 啟動另一個帳號的 Linux,啟動之後,以你的 server 為 gateway 來設計這部機器的網路
      • 同樣啟動 iptables 關閉 firewalld,然後僅加入基礎防火牆,但是放行內網的連線。
      • 透過前一章的方法,檢查這部電腦的網路是否正常?但最後請使用 ping 168.95.1.1 不要停止。
      • 在 server 上面,使用 tcpdump 這個指令觀察 ping 封包的流向,藉以了解 SNAT 的功能。
Top
HOME