---
# System prepended metadata

title: Week 11 (2022/11/24)
tags: ['1111', ncnu, lsa]

---

###### tags: `1111` `lsa` `ncnu`
# Week 11 (2022/11/24) 
[TOC]
- Book mode: https://hackmd.io/@ncnu-opensource/book
---
### iptables
#### Iptables-apply
- 嘗試設定新的 iptables 規則，然後詢問使用者是否 ok ，不 ok 就變回舊的
- 如果新規則讓使用者斷掉連線，那使用者就無法回應，timeout就會變成舊的
- 預設 rulefile（iptables-save 輸出的內容）路徑
    - `/etc/network/iptables...`

##### 使用 iptables command
- `iptables-apply -c`
- 預設路徑：`/etc/network/iptables.up.run`
- 也可以在後面指定路徑

##### 將成功的apply寫入檔案
- `iptables-apply -w <file>`
- 如果 iptables 的規則成功 apply，rule file 會被寫入檔案
- 可以存取可用的 rule file，以便以後再次 apply

## NAT (Network Address Translation)
![](https://i.imgur.com/wsnCSTf.png)
- 網路位址轉換用
    > 只要有一個外網 ip，就可以讓底下很多私有 ip 上網
### Why?
- ipv4 位置有限(32bits)
- 讓私有網路下的機器也能對外連線
> 如果沒有做 NAT ，內部網路的封包可以傳出去，但外網的封包無法傳進來（因為192...是內網的虛擬網址，所以外網找不到source）

### SNAT
> source NAT

![](https://i.imgur.com/BbOi9ph.png)
> 會有一個表紀錄是從哪一個 port 出去的，以此得知接收到封包時要傳到哪
- 修改 IP header 的 source IP
    - 從虛擬 ip $\to$ 真實 ip
- 透過 iptables 的 nat table 的 postrouting chain 處理
 
### DNAT
> Destination NAT
> 跟SNAT相反

![](https://i.imgur.com/Yfu3Dja.png)
- 修改 IP header 的 destination IP
    > 其 destination IP 要改成內網或是外網的 IP 都可以
    - 外網可以透過 DNAT 把封包轉給內網，也可以外網轉外網
情況一

- 把 public IP 改成內部網路的虛擬 IP
> 改寫收信人然後丟出去，故可以將外網封包轉進內網，也可以轉送到其他地方

> 如果目標沒有設定NAT，會改寫收件人 (處理destination)
- 透過 iptables 的 nat table 的 pretrouting chain 處理

### MASQUERADE
- 動態 SNAT
- 像是 SNAT，但不用指定 source IP ，由演算法自行分配
- 透過 iptables 的 nat table 的 postrouting chain 處理
- 常用場景
    - NAT 等需要轉傳的時候
        - 以自己本身這台機器作為 source IP 傳出去
- 自動修改 IP（不用自己寫 IP）
- 不管 destination ip 是誰，source ip 都改為自己
>利用出口的IP決定他的source IP
### NAT 實作
![](https://i.imgur.com/AGAcKFX.png)

#### iptables的前置處理
> NAT
> nic（對外）: Network Interface Card
- 開啟kernel轉送的功能
```=
sudo vim /etc/sysctl.conf
sudo sysctl -p
```
![](https://i.imgur.com/KObETX4.png)
> 內網電腦

- 設定 default gateway
```=
sudo route del default
sudo route add default gw {NAT IP}
```
:::info
也可以用
```=
sudo ip route replace default via <NAT IP> dev (本機對外網卡)
```
:::
![](https://i.imgur.com/8P4geug.png)
> 可以用國外的旅客搭機來想像，路由判斷A、B路徑，A路徑就是從國外入境的旅客，之後旅行結束會從台灣離開; B路徑則是在台灣轉機但沒有要入境的旅客，所以只是經過

- 往外網的流量允許 FORWARD
	```=
	sudo iptables -A FORWARD -i {lan nic} -o {wan nic} -j ACCEPT
	```
- 送出去的封包要做 MASQUERADE
	```=
	sudo iptables -t nat \
	-A POSTROUTING -o {wan nic} -j MASQUERADE
	```
	> ⚠沒有加 `-t nat` 的話，預設 `filter`
	> 要透過 postrouting 把內網 IP 包裝成外網 IP

![](https://i.imgur.com/6Kv2B7X.png)
- 設定 FORWARD Chain要 accept 回來的封包(已建立的封包、相關的連線)
    > 針對進來的封包
	```=
	sudo iptable -A FORWARD\
	-m conntrack --ctstate "ESTABLISHED,RELATED" \
	-j ACCEPT
	```

:::info
#### conntrack
- 紀錄連線的狀態
- state
    - NEW: 新的連線
    - ESTABLISHED: 已建立的連線
    - RELATED: 與 ESTABLISHED 連線有關的連線
    - INVALID: 無效
:::

- 拒絕轉送其他的封包
	```=
	sudo iptables -A FORWARD -j DROP
	```
	> 非必要但建議，可以防治其他來路不明的流量

### DMZ
> Demilitarized Zone
> 中文名稱：非軍事區

如果有一些 service 要開放給外網，DMZ 會將其與內網機器(沒有要開放的)分離
![](https://i.imgur.com/pHfrbGn.png)
> 若有網路攻擊，可以協助網管人員控制被攻擊區域或是減少傷害
#### why?
- 有某服務必須得開放給外網使用
- 當 server 被攻下時可減少災害(可以將傷害限縮在DMZ區域)

#### 特點
- 讓外網有限制的存取內網資源
- 提供特定服務給外界存取，但外網沒辦法存取所有內網資源
- **DMZ 不能連到內網其他機器**(沒任何機密資料)

### 設定
- Firewall 有三張網卡
    - 對外 (wan nic)
    - 對 DMZ (dmz nic)
    - 對內 ( lan nic )
- 連 Firewall 的 8080 port 可以通到 Web server 80 port

### DMZ實作

![](https://i.imgur.com/dK7Woma.png)



#### 前置作業
- 設定 gateway (在 DMZ 跟內網機器)

```=
sudo route del default
sudo route add default gw {Firewall IP}
```
>gw是gateway
#### 外網進來的流量
- 要連 DMZ
    - 透過防火牆要連 DMZ
- 本來 Destination IP 是寫連到 firewall，DMZ 在就會將其更改為內部 server IP
    - 針對外網進來的流量
```= 
sudo iptables -t nat -A PREROUTING \
-i {wan nic} \
-d {destination ip}
-p tcp --dport 8080 \ 
-j DNAT --to {web server IP}:80
```
```=
sudo iptable -I FORWARD -d{web server ip} -p tcp --dport 80 -j ACCEPT
```
- 要連內網機器
    - 不給連（指令後面提

#### DMZ 發出的流量
- 要連外網
    - 進來的網卡是 DMZ 出去的網卡是 WAN
```=
# 與前面 NAT 相似
sudo iptables -I FORWARD -i {dmz} -o {wan nic} -j ACCEPT
sudo iptables -t nat POSTROUTING -o {wan nic} -j MASQUERADE
```
- 要連內網機器
    - **不給連**

##### 內網機器發出的流量
- 要連外網
```=
# 與前面NAT相似
sudo iptables -I FORWARD -i {lan nic} -o {wan nic} -j ACCEPT
sudo iptables -t nat -I POSTROUTING -o {wan nic} -j MASQUERADE
```
- 要連DMZ
```= 
sudo iptables -I FORWARD -i {lan nic} -o {dmz nic} -j ACCEPT 
```

:::info
**為何連進 DMZ 不用 MASQUERADE**
DMZ 裡的機器有設定 default gateway 去 firewall，所以封包會傳回給 firewall
私人 IP 傳私人 IP 不用 MASQUEGRADE
:::

> 與外網來連的差別是不限制只能連80 port，允許從內網做SSH等其他功能

#### 其他
- 允許已建立的連線做**雙向溝通**
```=
sudo iptables -I FORWARD \
-m conntrack  --ctstate "ESTABLISHED,RELATED" \
-j ACCEPT
```

- 拒絕轉發其他流量
```=
sudo iptables -A FORWARD -j DROP
```
> 注意要-A 才會放在最後執行
- 拒絕進來的防火牆流量
```=
sudo iptables -A INPUT -j DROP
```

:::danger
DROP 所有 INPUT 流量會讓 Firewall 的外部流量完全無法存取，也就不能進行遠端控制（但從本機直接控制還是可以）
:::
### DMZ 題目
:::info
### LAB
環境/已有設定同上
#### 新增要求
- 只有內網能 ssh 進防火牆
```
iptables -I INPUT -i {lan} -p tcp --dport 22 -j ACCEPT
```
- 內網能連外網跟 只能連 DMZ 的 80 port (其他 port 無法)
```
iptables -I FORWARD -i {lan} -o {wan} -j ACCEPT
```
```
iptables -I FORWARD -i {lan} -o {dmz} -p tcp --dport 80 -j ACCEPT
```
- 只有 `192.168.1.101` 這個 IP 可以 ssh 進 DMZ 裡面"所有"機器，其他的 IP 無法
```
iptables -I FORWARD -s 192.168.1.101 -i {lan} -o {dmz} -p tcp --dport 22 -j ACCEPT
```
- 外網可以連防火牆的 8081 port 來 ssh 進 DMZ 的 web server
```
iptables -t nat -A PREROUTING -i {wan} -p tcp --dport 8081 -j DNAT --to {http ip}:22
```
```
iptables -I FORWARD -d {web server IP} -p tcp --dport 22 -j ACCEPT
```
#### 問題
- 要增加甚麼指令或哪個指令變更
:::
#### 檢討
- 只有內網能 ssh 進防火牆:
	- 只有內網可以連防火牆且可以連SSH port
- 內網:
	- 能連外網跟 
	- 只能連 DMZ 的 80 port (其他 port 無法)


































