[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

| chain | 用途 |
|:--------- |:------------------ |
| `INPUT` | 過濾**進入**的封包 |
| `OUTPUT` | 過濾**送出**的封包 |
| `FORWARD` | 過濾要轉送的封包 |
### `nat` table 的 chains

| 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 主機使用資源
| | |
| -------- | -------- |
|  |  |
:::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 主機的轉遞,沒有使用主機資源,而是向後端主機流動
| | |
| -------- | -------- |
|  |  |
:::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 本機發送出去
| | |
| -------- | -------- |
|  |  |
:::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

功能要求
- 外網可以直接連線 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

**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
```

---
# 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