[TOC] 今天要學的: - 拒絕讓 Internet 的封包進入主機的某些埠口 - 拒絕讓某些來源 IP 的封包進入 # Netfilter & iptables > 簡單來說 netfilter 的操作指令是 iptables 在玩 iptables 以前,我們必須先了解,那些我們所下的 iptables 防火牆規則:對封包進行過濾、封包處理、封包狀態變更、NAT...blablabla,這些工作其實是**核心 (kernel)** 層級的 Netfilter Framework 在處理的,而 iptables 只是一個使用者端的工具讓您方便對 Netfilter 操作而以 :::info nftables 幾乎取代了 iptables ,代碼重複度更少並且更容易擴展到新協議 ::: --- # Netfilter :::info - Linux 內建的封包過濾框架 - 由 Rusty Russell 在 1998 年開始主導開發 - Linux 2.4 版本時,正式取代舊的 ipchains - 目前 Linux 上主流的防火牆軟體,都是基於此框架去實作 - 主要提供以下功能 - 封包選擇跟過濾 - 網路位址轉譯 (NAT, Network Address Translation) - Packet mangling - Connection tracking ::: 當封包進到 Linux 的網路系統中時,會按照一定的順序去觸發這些 Hooks,Netfilter 主要提供以下 5 種 Hook 點: - `NF_IP_PRE_ROUTING`:接收到的封包第一個會碰到的 Hook - `NF_IP_LOCAL_IN`:經過路由判斷後,若目的地是本機,就會觸發這個 Hook - `NF_IP_FORWARD`:經過路由判斷後,若是需要轉發出去的封包(目的地不是本機),就會觸發這個 Hook - `NF_IP_LOCAL_OUT`:本機產生並要送往外部的封包,會觸發這個 Hook - `NF_IP_POST_ROUTING`:任何送往外部的封包 (包含轉發) 最終都會觸發的 Hook --- # iptables - iptables 是 Linux 的一種防火牆軟體 - 透過使用 iptables 提供的指令可以操作 Netfilter,進而實現防火牆的功能 - 都需要超級使用者權限 (`sudo`) 才能使用 ## iptables 的 Tables 和 Chains iptables 防火牆透過「表(tables)」來組織規則。這些表會根據規則所執行的決策類型來分類。例如,如果規則涉及網路位址轉換(NAT),則會放在 `nat` 表中;如果規則是用來決定是否允許封包繼續傳送到目的地,則可能會放在 `filter` 表中。 在每個 iptables 表中,規則進一步被組織在不同的「鏈(chains)」中。表是依據規則的主要用途來分類,而內建鏈則對應到觸發它們的 netfilter hook。鏈決定了規則會在封包處理流程中的何時被檢查。 chain 的名稱與對應的 netfilter hook 名稱一致: - PREROUTING:由 NF_IP_PRE_ROUTING 掛鉤觸發 - INPUT:由 NF_IP_LOCAL_IN 掛鉤觸發 - FORWARD:由 NF_IP_FORWARD 掛鉤觸發 - OUTPUT:由 NF_IP_LOCAL_OUT 掛鉤觸發 - POSTROUTING:由 NF_IP_POST_ROUTING 掛鉤觸發 ## iptables 哪些 Tables 可用? ### `filter` table 的 chains ![image](https://hackmd.io/_uploads/HyDqoN-Gkl.png) | chain | 用途 | |:--------- |:------------------ | | `INPUT` | 過濾**進入**的封包 | | `OUTPUT` | 過濾**送出**的封包 | | `FORWARD` | 過濾要轉送的封包 | ### `nat` table 的 chains ![image](https://hackmd.io/_uploads/S1C6AN-f1l.png) | chain | 用途 | |:------------- |:------------------------------------------------------------------------------------- | | `PREROUTING` | 在封包進入 routing decision 之前,對其進行目的地位址轉譯 (DNAT) | | `INPUT` | 因為已經過了 routing decision,所以僅能對封包進行本機的 port 轉發,僅在特殊情況使用 | | `OUTPUT` | 特殊情況下,修改本機生成封包的目的地位址 (DNAT),可用來做透明代理 (transparent proxy) | | `POSTROUTING` | 在封包離開系統後、發送到網路之前,對其進行來源地位址轉譯 (SNAT) | - mangle table:可以處理 INPUT、OUTPUT、FORWRD、PREROUTING、POSTROUTING 封包狀態,較少使用 mangle 這個表格 --- ## iptables 封包處理政策 (Policy) 及 目標 (Target) > Chain Traversal Order ```mermaid flowchart TB subgraph NF_INET_PRE_ROUTING nat_PREROUTING[nat: PREROUTING] end subgraph NF_INET_LOCAL_IN direction TB nat_INPUT[nat: INPUT] --> filter_INPUT[filter: INPUT] end subgraph NF_INET_FORWARD filter_FORWARD[filter: FORWARD] end subgraph NF_INET_LOCAL_OUT direction TB nat_OUTPUT[nat: OUTPUT] --> filter_OUTPUT[filter: OUTPUT] end subgraph NF_INET_POST_ROUTING nat_POSTROUTING[nat: POSTROUTING] end routing_decision_1{路由判斷} routing_decision_2{路由判斷} routing_decision_3{路由判斷} packet_in((封包進入)) local_process_1[[本機 process]] local_process_2[[本機 process]] packet_out((封包傳出)) packet_in --> NF_INET_PRE_ROUTING NF_INET_PRE_ROUTING --> routing_decision_1 routing_decision_1 -->|封包送往本機| NF_INET_LOCAL_IN routing_decision_1 -->|轉發封包| NF_INET_FORWARD NF_INET_LOCAL_IN --> |交給需要的本機資源| local_process_1 NF_INET_FORWARD --> |發送封包| NF_INET_POST_ROUTING local_process_2 --> |產生封包| routing_decision_2 routing_decision_2 --> NF_INET_LOCAL_OUT NF_INET_LOCAL_OUT --> routing_decision_3 routing_decision_3 --> |發送封包| NF_INET_POST_ROUTING NF_INET_POST_ROUTING --> packet_out ``` --- ### 進入 Linux 主機使用資源 | | | | -------- | -------- | | ![圖片](https://hackmd.io/_uploads/BJ-Dmsxs1e.png) | ![圖片](https://hackmd.io/_uploads/ryf14oesJx.png) | :::spoiler ```mermaid flowchart TB subgraph NF_INET_PRE_ROUTING nat_PREROUTING[nat: PREROUTING] end subgraph NF_INET_LOCAL_IN direction TB nat_INPUT[nat: INPUT] --> filter_INPUT[filter: INPUT] end routing_decision_1{路由判斷} packet_in((封包進入)) local_process_1[[本機 process]] packet_in --> NF_INET_PRE_ROUTING NF_INET_PRE_ROUTING --> routing_decision_1 routing_decision_1 -->|封包送往本機| NF_INET_LOCAL_IN NF_INET_LOCAL_IN --> |交給需要的本機資源| local_process_1 ``` 1. `NF_INET_PRE_ROUTING` - `nat` table `PREROUTING` chain 修改封包的目的位址 (e.g. IP, port),來達到**轉送封包**的功能 (DNAT) 2. 路由判斷後,若封包要**進入本機**就會進到這個 hook 3. `NF_INET_LOCAL_IN` - `nat` table 的 `INPUT` chain 是否針對進入本機的流量進行 port 轉發 - `filter` table 的 `INPUT` chain 判斷是否要允許封包進入本機 ::: --- ### 經由 Linux 主機的轉遞,沒有使用主機資源,而是向後端主機流動 | | | | -------- | -------- | | ![圖片](https://hackmd.io/_uploads/HyIwNjgsyx.png) | ![圖片](https://hackmd.io/_uploads/BJWY4ixiyg.png) | :::spoiler ```mermaid flowchart TB subgraph NF_INET_PRE_ROUTING nat_PREROUTING[nat: PREROUTING] end subgraph NF_INET_FORWARD filter_FORWARD[filter: FORWARD] end subgraph NF_INET_POST_ROUTING nat_POSTROUTING[nat: POSTROUTING] end routing_decision_1{路由判斷} packet_in((封包進入)) packet_out((封包傳出)) packet_in --> NF_INET_PRE_ROUTING NF_INET_PRE_ROUTING --> routing_decision_1 routing_decision_1 -->|轉發封包| NF_INET_FORWARD NF_INET_FORWARD --> |發送封包| NF_INET_POST_ROUTING NF_INET_POST_ROUTING --> packet_out ``` 1. `NF_INET_PRE_ROUTING` - `nat` table `PREROUTING` chain 修改封包的目的位址 (e.g. IP, port),來達到**轉送封包**的功能 (DNAT) 2. 路由判斷後,若封包要**轉發出去**就會進到這個 hook 3. `NF_INET_FORWARD` - `filter` table 的 `FORWARD` chain 判斷封包是否要允許封包轉發出去 4. `NF_INET_POST_ROUTING` - `nat` table 的 `POSTROUTING` chain 修改封包的來源地位址 (SNAT),來讓外部網路回傳的封包能夠正確找到系統的對外位址 ::: --- ### 由 Linux 本機發送出去 | | | | -------- | -------- | | ![圖片](https://hackmd.io/_uploads/BkvCVsgiJl.png) | ![圖片](https://hackmd.io/_uploads/H1xbrsxjyl.png) | :::spoiler ```mermaid flowchart TB subgraph NF_INET_LOCAL_OUT direction TB nat_OUTPUT[nat: OUTPUT] --> filter_OUTPUT[filter: OUTPUT] end routing_decision_2{路由判斷} routing_decision_3{路由判斷} local_process_2[[本機 process]] packet_out((封包傳出)) local_process_2 --> |產生封包| routing_decision_2 routing_decision_2 --> NF_INET_LOCAL_OUT NF_INET_LOCAL_OUT --> routing_decision_3 routing_decision_3 --> |發送封包| NF_INET_POST_ROUTING NF_INET_POST_ROUTING --> packet_out ``` 1. 本機產生的封包要從本機送出時會到這個 hook 2. `NF_INET_LOCAL_OUT` - `nat` table 的 `OUTPUT` chain 修改封包的目的地,但不常用 - `filter` table 的 `OUTPUT` chain 判斷封包是否可以送出 3. `NF_INET_POST_ROUTING` - `nat` table 的 `POSTROUTING` chain 修改封包的來源地位址 (SNAT),來讓外部網路回傳的封包能夠正確找到系統的對外位址 > 只要是要從本機送出的封包,最終都會碰到這個 hook ::: --- 事實上與本機最有關的其實是 filter 這個表格內的 INPUT 與 OUTPUT 這兩條鏈,如果你的 iptables 只是用來保護 Linux 主機本身的話,那 nat 的規則根本就不需要理他,直接設定為開放即可 不過,如果你的防火牆事實上是用來管制 LAN 內的其他主機的話,那麼你就必須要再針對 filter 的 FORWARD 這條鏈,還有 nat 的 PREROUTING, POSTROUTING 以及 OUTPUT 進行額外的規則訂定才行 --- ## 本機的 iptables 語法 理論上,當你安裝好 Linux 之後,系統應該會主動的幫你啟動一個陽春的防火牆規則 ### 列出 table `iptables [-t tables] [-L] [-nv]` - `-t` :後面接 table ,例如 nat 或 filter ,若省略此項目,則使用預設的 filter - `-L` :列出目前的 table 的規則 - `-n` 不嘗試把 IP 位址解析成域名,執行速度會較快 - `-v` 列出更多資訊 範例:列出 filter table 三條鏈的規則 ```bash= [root@www ~]# iptables -L -n Chain INPUT (policy ACCEPT) <==針對 INPUT 鏈,且預設政策為可接受 target prot opt source destination <==說明欄 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED <==第 1 條規則 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 <==第 2 條規則 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 <==第 3 條規則 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 <==以下類推 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) <==針對 FORWARD 鏈,且預設政策為可接受 target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) <==針對 OUTPUT 鏈,且預設政策為可接受 target prot opt source destination ``` 範例:列出 nat table 三條鏈的規則 ```bash= [root@www ~]# iptables -t nat -L -n Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination ``` - target:代表進行的動作, ACCEPT 是放行,而 REJECT 則是拒絕,此外,尚有 DROP (丟棄) 的項目! - prot:代表使用的封包協定,主要有 tcp, udp 及 icmp 三種封包格式; - opt:額外的選項說明 - source :代表此規則是針對哪個『來源 IP』進行限制? - destination :代表此規則是針對哪個『目標 IP』進行限制? ```bash= target prot opt source destination <==說明欄 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited 只要是封包狀態為 RELATED,ESTABLISHED 就予以接受 只要封包協定是 icmp 類型的,就予以放行 無論任何來源 (0.0.0.0/0) 且要去任何目標的封包,不論任何封包格式 (prot 為 all),通通都接受 只要是傳給 port 22 的主動式連線 tcp 封包就接受 全部的封包資訊通通拒絕 ``` :::success `iptables [-t tables] [-L] [-nv]` 一些好用的選項 - `-t` :後面接 table ,例如 nat 或 filter ,若省略此項目,則使用預設的 filter - `-L` :列出目前的 table 的規則 - `-n` 不嘗試把 IP 位址解析成域名,執行速度會較快 - `-v` 列出更多資訊 - `--line-numbers` 顯示 rule 的編號,在新增或是刪除時可能需要 ::: --- ### 修改 table 某個 chain 的 rules `iptables [-AI 鏈名] [-io 網路介面] [-p 協定] [-s 來源IP/網域] [-d 目標IP/網域] -j [ACCEPT|DROP|REJECT|LOG]` - `-A` :新增加一條規則,該規則增加在原本規則的最後面 - `-I` :插入一條規則。如果沒有指定此規則的順序,預設是插入變成第一條規則 - `-j` :後面接動作,主要的動作有接受 (ACCEPT)、丟棄 (DROP)、拒絕 (REJECT) 及記錄 (LOG) 範例:設定 lo 成為受信任的裝置,亦即進出 lo 的封包都予以接受 ```bash= [root@www ~]# iptables -A INPUT -i lo -j ACCEPT ``` 範例:只要是來自 192.168.100.10 就接受,但 192.168.100.230 這個惡意來源就丟棄 ```bash= [root@www ~]# iptables -A INPUT -i eth1 -s 192.168.100.10 -j ACCEPT [root@www ~]# iptables -A INPUT -i eth1 -s 192.168.100.230 -j DROP ``` --- ### 針對 port 設定 `iptables [-AI 鏈] [-io 網路介面] [-p tcp,udp] [-s 來源IP/網域] [--sport 埠口範圍] [-d 目標IP/網域] [--dport 埠口範圍] -j [ACCEPT|DROP|REJECT]` 事實上就是多了那個 --sport 及 --dport 這兩個玩意兒,重點在那個 port 上面啦! 不過你得要特別注意,因為僅有 tcp 與 udp 封包具有埠口,因此你想要使用 --dport, --sport 時,得要加上 -p tcp 或 -p udp 的參數才會成功喔! 範例:想要連線進入本機 port 21 的封包都抵擋掉: ```bash= [root@www ~]# iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP ``` 範例:想連到我這部主機的網芳 (upd port 137,138 tcp port 139,445) 就放行 ```bash= [root@www ~]# iptables -A INPUT -i eth0 -p udp --dport 137:138 -j ACCEPT [root@www ~]# iptables -A INPUT -i eth0 -p tcp --dport 139 -j ACCEPT [root@www ~]# iptables -A INPUT -i eth0 -p tcp --dport 445 -j ACCEPT ``` --- ### 刪除 rule 刪除 filter table OUTPUT chain 的第 1 個 rule ```bash= [root@www ~]# sudo iptables -t filter -D OUTPUT ``` 清空 filter table INPUT chain 所有的 rule ```bash= [root@www ~]# sudo iptables -t filter -F INPUT ``` --- ### 儲存 iptables 的設定 直接使用 `iptables` 的指令不會自動儲存在系統中,關機後就會消失,`iptables` 有提供幾個工具可以使用 #### `iptables-save` 儲存目前的 `iptables` 的設定 `iptables-save > 檔案路徑` #### `iptables-restore` 使用設定檔恢復 `iptables` 的設定 `iptables-restore < 檔案路徑` #### `iptables-apply` 用來測試新的 iptables 規則,套用新規則時若太長時間 (預設是 10 秒) 沒有回應就會自動恢復成舊的設定 `iptables-apply 檔案路徑` > 預設的路徑是: `/etc/network/iptables.up.rules` --- ## LAB DMZ :D ![image](https://hackmd.io/_uploads/BkHWdOfGyx.png) 功能要求 - 外網可以直接連線 DMZ,但不能直接連線 LAN - DMZ 可以直接連線外網,但不能直接連線 LAN - LAN 可以直接連線外網,也可以直接連線 DMZ 環境 - Firewall 主機上設定防火牆 - DMZ 中有一台對外開放的 Web Server 主機,80 port 上有 web service - LAN 中有一台不對外開放的 Student 主機 - 外網透過連線到 Firewall 主機的 8080 port,可以連線到 Web Server 主機的 80 port - INPUT、FORWARD、OUPUT 的 policy 都是 ACCEPT ### 準備環境 架四台虛擬機,網路介面卡都調內部網路,firewall 要三張對應到 lan, dmz, wan ![圖片](https://hackmd.io/_uploads/H1GpI77okg.png) **Firewall (NAT 主機)** 要先開啟 Linux 轉發封包的功能 1. `sudo vim /etc/sysctl.conf` 2. 把這行的註解取消 ``` # Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1 ``` 3. `sudo sysctl -p` **DMZ 和 LAN 的 default gateway (設成 Firewall 主機 IP)** 1. `sudo route del default` 2. `sudo route add default gw {Firewall IP}` ### 設定規則 - 外網能透過 Firewall 連到 DMZ 的 web server ```shell sudo iptables -t nat -A PREROUTING -i {外網網卡} -p tcp --dport 8080 -j DNAT --to {Web Server IP}:80 ``` - 同意該封包轉送 ```shell sudo iptables -A FORWARD -i {外網網卡} -d {Web Server IP} -p tcp --dport 80 -j ACCEPT ``` - DMZ 能夠連到外網 ```shell sudo iptables -I FORWARD -i {DMZ 網卡} -o {外網網卡} -j ACCEPT sudo iptables -t nat -I POSTROUTING -o {外網網卡} -j MASQUERADE ``` - LAN 能夠連到外網 ```shell sudo iptables -I FORWARD -i {LAN 網卡} -o {外網網卡} -j ACCEPT # 出去的封包做 MASQUERADE 上面已經設過,這裡就不再設定 ``` - LAN 能夠連到 DMZ ```shell sudo iptables -I FORWARD -i {LAN 網卡} -o {DMZ 網卡} -j ACCEPT ``` - 允許轉送已建立或相關的連線 ```shell sudo iptables -I FORWARD -m conntrack --ctstate "ESTABLISHED,RELATED" -j ACCEPT ``` - 拒絕其他所有進入 Firewall 主機的連線 ```shell sudo iptables -A INPUT -j DROP ``` - 拒絕轉送其他所有連線 ```shell sudo iptables -A FORWARD -j DROP ``` ![圖片](https://hackmd.io/_uploads/rJym4N7oJl.png) --- # Web server ## Lighttpd > /etc/lighttpd :::success - 適合做檔案傳輸 - 低記憶體佔用、低 CPU 負載、速度最佳化 - 支援 cgi & fastcgi ::: ### lighttpd.conf - `server.modules`:預設啟動哪些模組 - `server.document-root`:放置網頁的根目錄位置 - `server.errorlog` - `server.username` & `server.groupname`:執行服務後切換到哪個使用者權限 - 主要為 web server 不要有太高權限,但 web application 又能作適當程度的寫入 - `server.port` - `index-file.names`:預設頁面 ### conf-available - 含所有可用的設定檔案,每個設定檔案對應於一個功能或模組 - 檔案名稱通常以模組或功能命名,如 10-userdir.conf、15-ssl.conf 等。 - 這些檔案預設不會自動生效,需要手動開啟 ### conf-enabled - 包含所有已開啟的設定檔案,從 conf-available 目錄中的檔案 **軟連結(soft link)** 來的 - Lighttpd 啟動時會自動載入這些檔案的設定 ### 啟動 module 的設定檔 - 方法一:使用 lighty-enabled & lighty-disabled 來啟用和停用 modules - 啟用:`sudo lighttpd-enable-mod <<modules>>` > 只需要 modules 名稱,沒有 `編號` & `.conf` - 停用:`sudo lighttpd-disable-mod <<modules>>` - 方法二:手動-使用 Softlink 方式啟用設定檔 `sudo ln -s <要被啟動的 modules 檔案> <conf-enabled 位置>` ex. `sudo ln -s /etc/lighttpd/conf-available/10-userdir.conf` `/etc/lighttpd/conf-enabled/` - 要記得 restart --- ## Apache2 > /etc/apache2 :::success - 歷史最悠久 - 以前市占率最高 > 2019 後被 Nginx 超車 - 模組功能強大 - 佔用資源大 ::: ### apache2.conf 主設定檔案:包含 Apache 的全域設定,設定目錄中的其他檔案都是從此檔案載入的 ### conf-available & conf-enabled 放獨立的功能性設定檔案->針對 apache 本身的設定檔 > 例如:`conf-available/security.conf` 可能用來控制 Apache 本身的安全性設定 ### mods-available & mods-enabled 放 Apache 支援的模組相關的設定檔案->針對 apache 模組的設定檔 > 例如:需要開啟 URL 重寫功能,就要開啟 rewrite 模組 ### sites-available & sites-enabled virtual host 的設定檔案 > `000-default.conf`:http 的預設設定檔案 `default-ssl.conf`:https 的預設設定檔案 ### ports.conf --- ## Nginx > /etc/nginx :::success - 佔有記憶體少、穩定性高,可以同時承受很大的流量 - 採模組化設計,有許多模組庫與第三方模組庫 - 設計的目標是為了比 Apache 還要好 ::: Nginx 的主要設定檔通常會放置在 `/etc/nginx/nginx.conf` 另外在 `/etc/nginx/conf.d/*.conf` 則會放置不同域名的 config file 例如: `/etc/nginx/conf.d/kylemocode.com.conf` ### modules-available & modules-enabled 放 Nginx 支援的模組相關的設定檔案->針對 nginx 模組的設定檔 ### sites-available & sites-enabled - sites-available:設定檔的集中地 - sites-enabled:會被服務運行的設定檔 :::spoiler **QA:依序下載完 Apache 後再下載 Nginx,發現預設頁面( http://127.0.0.1:80)不是 Nginx 怎麼辦** 在下載 web service 後,將該 root document 更改 ::: :::info ### 操作 Web Server 的指令 `sudo systemctl <<操作>> <service_name> ` <<操作>> - status 查看狀態 - start 開啟服務 - stop 關閉服務 - reload 不停止服務,重載設定檔 - restart 停止服務重新開啟 ::: FIXME:systemctl 跟 service 的差異 ## LAB Reverse Proxy & Load Balance - `sudo service nginx stop` - 至 `/etc/nginx/sites-available/` 設定相關檔案 - `sudo vim /etc/nginx/sites-available/proxy_lb` ```conf= upstream myapp { server 127.0.0.1:8080; #本機 lighttpd server 127.0.0.1:8082; #本機 nginx } server { listen 80; server_name proxy_lb; # 哪些域名或主機名應該被這個伺服器區塊處理 location / { proxy_pass http://myapp; # 將請求代理到 upstream 裡寫的伺服器 } } ``` :::info #### upstream 裡面包後端伺服器的群組,Nginx 會依照指定的 load balance 策略來分配流量。 - 預設( round-robin):把請求輪流發送給後端伺服器。 - 權重(weight):較高權重的伺服器會收到更多請求 (通常性能較好的會給較高權重)。 - ``` upstream myapp { server 127.0.0.1:8080 weight=3; server 127.0.0.1:8082 weight=1; } ``` ::: - 新增主機紀錄 - `sudo vim /etc/hosts` - `127.0.0.1 proxy_lb` - Soft Link 到 `nginx/sites-enabled/` - `sudo ln -s /etc/nginx/sites-available/proxy_lb /etc/nginx/sites-enabled/` - 確認設定檔有沒有問題 - `sudo nginx -t` - 沒有問題的話就 restart - `sudo service nginx restart` - 測試時間~ - 到 http://proxy_lb:80 瘋狂 `F5` # Ref. [1]. https://www.digitalocean.com/community/tutorials/a-deep-dive-into-iptables-and-netfilter-architecture [2]. https://linux.vbird.org/linux_server/centos6/0250simple_firewall.php [3]. https://hackmd.io/@ncnu-opensource/book/https%3A%2F%2Fhackmd.io%2FSd59QRjvRHGNSpyHHdpccg